目前的影响是什么? .csproj 中的 NuGet 内容?

What's the current impl. of NuGet stuff in .csproj?

我有一些解决方案是从 VS2008 或 VS2010 或类似的东西开始的。它们包含一些我认为与 NuGet 包还原相关的内容,并在构建过程中包含某些 MS NuGet 包。

但这在不同的项目中看起来不同,而我认为没有任何差异的原因,并且新的 VS2017 项目包含另一个不同的版本。

那么,在这方面,我可以安全地做些什么来更新我的旧项目 - 它现在在 VS2017 中应该是什么样子?

两个旧解决方案都包含一个解决方案级子文件夹“.nuget”,其中包含三个文件:NuGet.ConfigNuGet.exeNuGet.targets.

.csproj 文件包含这些 "versions" 的 NuGet 内容:

项目 1:

<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
</Target>

Proj2(附加条件):

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
</Target>

Proj3(不导入 nuget.targets):

<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
</Target>

一个新的 VS2017 web 应用程序项目(不导入 nuget.targets 或 Microsoft.Bcl.Build.1.0.21,不同的 <Error Condition.../> 标签):

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props'))" />
  <Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
</Target>

我希望对所有这些旧项目使用相同的设置(除非有特定的不同原因),并且我希望根据 VS2017 使用工具和环境使设置保持最新。

我启用了自动包还原并希望保持这种状态。

注意:所有四个项目似乎都已构建并且 运行 成功。 Proj2 和 Proj3 是单元测试项目。 Proj1实际上是两个在这方面完全相同的项目。

What's the current impl. of NuGet stuff in .csproj?

要解决此问题,您可以按照以下步骤操作:

  1. 关闭 Visual Studio 以避免文件潜在的文件锁定和冲突。
  2. 如果使用 TFS:从解决方案的 .nuget 文件夹中删除 nuget.exenuget.targets,并从解决方案工作区中删除这些文件。保留 nuget.config 和 disableSourceControlIntegration 设置,如 Omitting packages with Team Foundation Version Control.

  3. 中所述
  4. 如果 使用 TFS: 从解决方案和解决方案工作区中删除 .nuget 文件夹。

  5. 编辑解决方案中的每个项目文件,删除 <RestorePackages> 元素,并删除对 nuget.targets 文件的所有引用。

     <RestorePackages>true</RestorePackages>
    

    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
    
    <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
      <PropertyGroup>    
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>  
      </PropertyGroup>  
      <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
    </Target>
    

注:保留<Import Project="..\packages\Microsoft.Bcl.Build...

部分详情请参考:

Nuget: Switching from "Enable Package Restore" to "Automatic Package Restore".