是否应将.nuget文件夹添加到版本控制中?


107

使用较新版本的NuGet,可以将项目配置为自动还原NuGet程序包,从而packages无需将该文件夹包含在源代码存储库中。好。

但是,此命令将添加一个新.nuget文件夹,并且其中有一个二进制文件NuGet.exe。这也可以由Visual Studio自动重新创建,因此将其添加到版本控制中感觉不正确。但是,如果没有此文件夹,Visual Studio甚至无法正确加载解决方案。

你们如何处理?将.nuget添加到源代码管理?打开解决方案之前运行一些命令行脚本?


这是最真实的链接docs.nuget.org/docs/workflows/…,因为它是旧线程。我只想分享评论中的信息...
Naveed Butt 2014年

Answers:


47

这篇文章很旧,您不应该再使用解决方案级别的NuGet软件包还原。从2.7+版本开始,NuGet设置中提供了一个选项,可以在构建时自动还原软件包。因此,可以删除.nuget文件夹,并从您的项目中删除该选项。

http://docs.nuget.org/docs/reference/package-restore

更新:随着NuGet 4.x和.NET Standard 2.0的发布,当您使用新的csproj格式时,现在可以使用程序包引用,具有讽刺意味的是重新引入了对msbuild的依赖关系来还原程序包,但是现在程序包是msbuild的一等公民。上面的链接也提到了PackageReference,但是以下声明对其进行了详细说明:

https://blog.nuget.org/20170316/NuGet-now-fully-integrated-into-MSBuild.html

而且具有讽刺意味的是,NuGet 4.x RTM公告没有那么有用:

https://blog.nuget.org/20170308/Announcing-NuGet-4.0-RTM.html

更新2:显然,在VS2017中,您甚至可以将包引用用于经典的csproj项目,但它们不再向后兼容,并且在恢复包子依赖项方面存在一些问题。我相信这一切都会解决。



@CAD Bloke,是的,它在底部的阅读列表中,谢谢您缩小范围。
杰里米

您可以使用轻松在VS中更新Nuget Tools > Extensions & Updates > Updates
jocull

47

@Richard Szalay的答案是正确的-您不需要提交nuget.exe。如果由于某些原因Visual Studio不会自动下载nuget.exe,请确保在文件中将以下内容设置为truenuget.targets

<!-- Download NuGet.exe if it does not already exist --> 
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

关闭VS解决方案,然后重新打开并进行构建。Visual Studio应该立即自动下载nuget.exe。


顺便说一句,有人知道为什么true默认情况下未将其设置为吗?
ajukraine 2013年

2
更多的是隐私问题。“通过Internet发出请求的简单动作可以揭示有关用户的信息(例如,从用户的IP地址,我们可以估算出她的位置)。” 见包还原,并在知情同意的NuGet博客文章

1
仅供参考:.nuget文件夹中没有NuGet.exe时,即使已经配置了NuGet软件包还原,解决方案的上下文菜单也会显示“启用NuGet软件包还原”。构建后,该选项将消失。
comecme 2013年

IMO,这应该是公认的答案。如果NuGet.exe很小,我可能会说将其粘贴在源代码管理中,并处理您在ignore文件中必须执行的任何操作。但是它只有1.5兆,足以让我始终按照Gan的方式做。
Brian MacKay 2014年

它在哪里下载nuget.exe表单?如果我的构建服务器没有互联网怎么办?
bitbonk


20

您需要提交.nuget\nuget.targets,但是不需要nuget.exe。只要您在nuget.targets中更改DownloadNuGetExe为目标,目标将下载该exe(如果不存在)。true


4

尽管我通常不喜欢在源代码管理中添加exe的想法,但我建议源代码管理应包含打开,构建和执行项目所需的任何内容。

在这种情况下,听起来好像.nuget文件夹是必需的依赖项。因此,它应该在源代码控制下。

剩下的唯一需要研究的问题是,如果该文件夹被标记为只读,NuGet将如何反应,一旦签入,TFS将执行该操作。


更新: 我对此进行了更多研究,因为我以前从未使用过NuGet。 http://blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html

我建议您可能要做的是使NuGet成为必须在每个开发人员工作站上安装的要求。

此外,您应在源代码管理中放置使工作站准备好开始编辑项目所需的批处理文件。批处理文件将运行获取和安装依赖项包所需的命令。

除了我想说的以外,您可能想直接与NuGet联系,询问他们确切该如何工作。


1
我认为<RestorePackages>true</RestorePackages>* .csproj文件中的内容对于Visual Studio应该足够了,但也许不是。
Borek Bernard

1

现在nuget支持软件包还原,我们将对其进行更仔细的研究。

我们使用Subversion进行源代码控制,我最初的想法是.nuget应将其添加到我们的存储库中,但应使用svn:externals进行添加,以使其指向单个位置。

这样,我们可以自动向所有开发人员和项目推出新版本。对于发行分支(而不是HEAD)上的项目,如果我们想不考虑nuget ,可以指定svn:externals参考的修订版。

我们有很多项目,因此这也意味着不要在存储库中重复nuget.exe多次。


我无法让NuGet恢复外部项目包。它能为您提供帮助吗?。
Doguhan Uluca'2

是的,尽管在Powershell或Extension Plugin可以正常工作的同时,NuGet.exe似乎在向我们的本地存储库(IIS 6 + SSL + AD身份验证)进行身份验证时遇到问题。
si618

1

我们在nuget.config文件夹中有该文件,因为它具有使用Package Sources区域对内部Nuget服务器的引用:https ://docs.nuget.org/consume/nuget-config-settings

除此之外,您还应该让Visual Studio处理程序包的下载。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.