场景是:
1. 创建一个新的解决方案
2.启用下载丢失的包
3.将项目添加到已经存在并依赖于nuget包的解决方案中
4. 构建解决方案产生错误:
... The missing file is <solution folder>\.nuget\NuGet.targets.
为什么?有什么遗漏吗?
我在 Windows 10 上使用 Visual Studio 2017 Pro
我所有的搜索都回答关于创建新解决方案并添加一个依赖于 nuget 包的新项目的场景,没关系,但是当有一个现有项目时,什么都没有。
最佳答案
<solution folder>\.nuget\NuGet.targets
是 NuGet 的 Visual Studio 扩展用于在 Visual Studio 2010、2012 和 2013 中添加的文件,当您右键单击解决方案并选择“启用 NuGet 包还原”时。然后它会在您的所有项目文件中添加一个导入以导入目标文件。我最近investigating a customer issue作为调查的一部分,我发现它进行了以下更改。在 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。在我看来,将构建脚本减少一步的好处不值得它带来的问题。
关于visual-studio-2017 - 现有项目中缺少文件 NuGet.targets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54235147/