首页 > 解决方案 > 现有项目中缺少文件 NuGet.targets

问题描述

场景是:
1. 创建了一个新的解决方案
2. 启用下载缺少的包
3. 将项目添加到已经存在并依赖于 nuget 包
的解决方案 4. 构建解决方案会产生错误:

... The missing file is <solution folder>\.nuget\NuGet.targets.

为什么?有什么遗漏吗?

我在 Windows 10 上使用 Visual Studio 2017 Pro

我所有的搜索都回答了创建一个新解决方案并添加一个依赖于 nuget 包的新项目的场景,这没关系,但是当有一个现有项目时,什么都没有。

标签: visual-studio-2017nuget

解决方案


<solution folder>\.nuget\NuGet.targets当您右键单击解决方案并选择“启用 NuGet 包还原”时,NuGet 的 Visual Studio 扩展用于在 Visual Studio 2010、2012 和 2013 中添加的文件。然后它将在您的所有项目文件中添加一个导入以导入目标文件。我最近正在调查一个客户问题,作为调查的一部分,我发现它进行了以下更改。在 csproj 的顶部附近,它添加了如下内容:

<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages>

在 csproj 的末尾附近,它添加了如下内容:

<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>

因此,问题在于您正在创建一个新的解决方案,但使用的是已以这种方式修改的现有项目文件。一种选择是编辑您的 csrpoj 文件并删除这些更改。另一种选择是在新解决方案之外创建新项目,然后复制所有代码和内容文件。

唯一的缺点是,如果您在 CI 服务器上构建并使用 packages.config,您的构建脚本需要运行nuget.exe restore,而使用 NuGet.targets 的项目只能构建解决方案,msbuild 将根据需要执行 nuget restore。不再使用 NuGet.targets 的一个优点是还原整个解决方案比逐个项目还原更快。Visual Studio 会在构建时自动恢复包,即使在 VS2010、VS2012 和 VS2013 中也是如此,因此我个人不鼓励使用此功能,即使您使用那些旧版本的 Visual Studio。在我看来,将构建脚本减少一步的好处不值得它带来的问题。


推荐阅读