【问题标题】:How to convert a non-core csproj to VS2017 format [duplicate]如何将非核心csproj转换为VS2017格式[重复]
【发布时间】:2017-07-07 13:05:39
【问题描述】:

我在VS2015中有两个项目

  1. 一个 .NET Core(project.json、xproj)
  2. 一个常规的 .NET csproj

当我用 VS2017 打开项目 1 时,它很好地迁移到了新的 csproj 格式。

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

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

使用:VS2017 RTM

【问题讨论】:

  • 我在另一个帖子中回答了这个问题,stackoverflow.com/questions/42659684/…
  • 我的问题是在“重复”之前一个月,所以另一个是重复的?
  • 虽然@Julian 您接受了答案,但没有选项是不正确的,而不是具有正确答案的 dup 告诉如何做到这一点。
  • @Julian 如上所述,请参阅上面链接的元政策,如果新问题有更好的答案,则投票关闭旧问题作为新问题的副本。
  • @Julian 同意。这就是为什么投票结束重复问题很重要。我认为如果他们的问题被关闭并且首先被问到,这对原始海报是不公平的。但是,如果副本包含更好的答案,这样做确实会带来更大的好处。

标签: visual-studio visual-studio-2017 migration upgrade csproj


【解决方案1】:

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 与旧的 csproj 中,目标未按预期导入。这取决于您的目标是如何创作的,但其中一个例子是使用 VSSDK 构建 VSIX 项目(VS 扩展)在基于 SDK 的项目中很难做到。

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

还值得指出的是,您的普通 csproj 文件中的许多废话只是生成的内容,稍微手动编辑可以大大有助于清理它。例如,使用通配模式可以在一个大型项目文件中保存数百行。这是基于 SDK 的项目如何工作的一部分——它们只是在 SDK 中执行 glob,因此它不会出现在 .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-projects 会自动检测磁盘上的文件何时更改并在项目中添加/删除它们; old-csproj 在重新加载项目之前不会在 VS 中更新它们。

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

【讨论】:

  • 怎么可能只有 .NET Core,因为我们可以针对多个框架,包括(完整)NET46?
  • SDK 使定位多个框架成为可能。从项目体系来看,它仍然是一个Core项目。
  • 如果您无法使用该功能,则发送有关该功能的反馈有点困难。
  • @kjbartel 你可以在反馈中写任何你想要的东西,比如“请按照它们在 .NET Core 中的方式简化所有 .csproj 文件”
  • 新的 csproj 可以很好地与其他框架一起使用,但是 VS2017 不使用它作为默认值。
【解决方案2】:

可能值得您花时间看看这些。对于更复杂的项目类型似乎无法完成,但控制台和库似乎是可升级的 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

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 2020-12-31
    • 2022-07-19
    • 2013-02-23
    • 2015-02-20
    • 2018-11-03
    相关资源
    最近更新 更多