如何将非核心csproj转换为VS2017格式

时间:2017-02-17 21:15:41

标签: upgrade visual-studio-2017 csproj

我在VS2015中有两个项目

  1. 一个.NET Core(project.json,xproj)
  2. 一个常规的.NET csproj
  3. 当我用VS2017打开项目1时,它很好地迁移到新的csproj格式。

    Project 2适用于VS2017,但我喜欢将此csproj转换/迁移/更新为新的项目文件格式,以便受益于新的csproj功能(多目标,无大文件列表,可读csproj,csproj中的NuSpec信息等) )

    我怎么能这样做?我在VS2017中找不到一个选项。

    使用:VS2017 RTM

2 个答案:

答案 0 :(得分:8)

值得您花些时间来看看这些。看起来它不能用于更复杂的项目类型,但控制台和库似乎是可升级的 http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/

https://github.com/NickCraver/PerfBenchmarks/commit/53c3013b1774056363dcab867bceb1b89ce9592c

关于添加更复杂的sdk类型,您可以观看此github问题。

https://github.com/dotnet/sdk/issues/491

答案 1 :(得分:3)

VS中没有内置选项,因为更干净的csproj主要用于.NET Core项目。如果没有项目文件中的一些工作和进一步的自定义,它不能完全适用于所有其他项目类型。例如,在Winforms或WPF应用程序中连接诸如代码生成器或嵌套之类的东西可能无法实现新的SDK样式(新样式).csproj。通常可以根据需要更新元数据来解决这些问题:

<ItemGroup>
  <Compile Update="Properties\Resources.Designer.cs">
    <AutoGen>True</AutoGen>
    <DependentUpon>Resources.resx</DependentUpon>
  </Compile>
</ItemGroup>

请注意,Update属性在此处是关键 - 您不希望在ItemGroup中第二次包含该文件,您只想更新其现有(或缺少)元数据。

对于某些项目类型,还有一些注意事项,在基于SDK的csproj vs和旧版本中,目标无法按预期导入。这取决于您的目标是如何创作的,但是其中一个例子是使用VSSDK构建VSIX项目(VS扩展)在基于SDK的项目中很难实现。

如果您想尝试转换,Nate McMaster's blog post是一个很好的资源。他涵盖了从头开始和原位转换文件。我发现大多数情况下,从一个新的干净.csproj开始,并添加所需的任何解决方法都非常顺利。

同样值得指出的是,普通csproj文件中的很多废话只是生成的内容,而一点点的手工编辑可以大大有助于清理它。例如,使用通配模式可以在大型项目文件中保存数百行。这是基于SDK的项目如何工作的一部分 - 它们只是在SDK中执行,因此它不会出现在.csproj中,但它的工作方式几乎相同。例如,如果要将所有C#文件包含在文件夹下(递归),可以执行以下操作:

<ItemGroup>
  <!-- Include all C# files under the SampleFolder and any child folders -->
  <Compile Include="SampleFolder\**\*.cs" />
  <!-- Include all C# files under this project's root: -->
  <Compile Include="**\*.cs" />
<ItemGroup>

**匹配任何递归文件夹路径。

Visual Studio行为存在一些差异,因为基于SDK的项目的新项目系统与旧的.csproj项目系统的工作方式非常不同。例如,SDK项目将自动检测文件何时在磁盘上更改并在项目中添加/删除它们; old-csproj不会在VS中更新它们,直到项目重新加载。

如果你在任何地方使用globbing,你会遇到类似于基于SDK的csproj中的类似问题,其中某些文件没有连接到它们的代码生成器或正确嵌套。如上所述,您可以使用Update=属性来修复特定文件(甚至更具体的整体),以使元数据恢复原状。