NuGet包还原 - 解决方案中的.nuget文件夹 - 提交到代码库?

19
启用NuGet软件包还原功能后,它将以下内容添加到我的解决方案中:
/.nuget /.nuget/NuGet.exe /.nuget/NuGet.targets
由于这些文件是解决方案的一部分,如果在没有任何这些文件的情况下将解决方案提交到我的存储库中,那么我的解决方案将会出现缺失引用的情况。但是如果删除文件夹或其中任何一个文件,那么NuGet软件包还原功能将无法启用。
考虑到设置软件包还原功能的部分目的是为了避免将二进制文件提交到存储库中,那么强制包含NuGet.exe文件到解决方案中的意图是什么?
是否假设向存储库提交一个小的 .exe 文件是为了不需要提交其他二进制文件而付出的小代价?或者我也应该将它们从存储库中排除,并告诉首次检查我的存储库的开发人员去启用软件包还原功能?当持续集成系统在我的解决方案中遇到缺失引用时怎么办?
4个回答

14

将 .nuget 文件夹提交到代码库的目的在于,可以设置您的解决方案使用包恢复,并使用启用此功能时安装的完全相同版本的 nuget.exe。

您的项目文件依赖于 nuget.targets MSBuild 指令,该指令使用 nuget.exe,并且这两个文件被视为链接在一起,因为 MSBuild 指令使用了 nuget.exe API。有可能某天会出现不同版本的 nuget.exe 和 nuget.targets。它在内部使用 NuGet.Build 和 NuGet.Commandline 包。这也是为什么通常为解决方案设置一次包恢复,而不是每个开发人员都要单独设置的原因。

此外,您无需在每个构建服务器上安装 nuget.exe,您的构建服务器可以使用不同版本的 nuget.exe 构建解决方案,这是一个附加的好处,无需额外的努力。当然,这也可以看作是支付的小代价 :-)

如果您的 CI 遇到缺少引用的情况,请检查以下内容:

  • 您的构建服务器无法访问 NuGet 包源
  • 您的构建服务器无法在 NuGet 包源上找到 NuGet 包(请检查该包是否存在或者您是否指向了正确的包源)

2
现在,对于软件包还原的同意,您也需要检查是否已设置。http://blog.nuget.org/20120518/package-restore-and-consent.html - ferventcoder

9

你不需要将nuget.exe提交到源代码控制中。如果缺少NuGet.exe,NuGet.targets会从nuget.org下载最新的NuGet.exe。


这是自NuGet v2.0以来的一个新选项。您可以关闭它,但仍然可以检入您的nuget.exe(例如,在构建服务器没有互联网访问时可能希望这样做)。 - Xavier Decoster
2
@XavierDecoster 如果一个构建服务器没有互联网,就无法使用NuGet下载软件包,更不用说NuGet.exe了。这个构建服务器实际上可能毫无用处。 - Jerric Lyns John
4
@JerricLynsJohn 这并不正确。你可以使用内部NuGet服务器或简单的网络共享来还原NuGet包。 - Xavier Decoster
@Xavier Decoster同意这一点,尽管我从未像那样使用过NuGet。大多数情况下,我的项目都围绕着它的使用展开。 - Jerric Lyns John

8
如果你按照 @Richard Szalay 的回答(不提交 nuget.exe),但由于某些原因 Visual Studio 没有自动下载 nuget.exe,请确保在 nuget.targets 文件中将以下内容设置为 true
<!-- Download NuGet.exe if it does not already exist --> 
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

关闭VS解决方案,重新打开并构建。现在Visual Studio应该会自动下载nuget.exe。


2

对于.gitignore文件,请添加以下内容。

.nuget/
!.nuget/packages.config

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接