从NuGet签入程序包进入版本控制?


87

在NuGet之前,签入项目中使用的所有外部DLL是公认的“最佳实践”。通常在Libs3rdParty目录中。

使用NuGet时,我应该签入packages目录,还是MSBuild是否可以从nuget提要中自动下载所需的软件包?


2
答案是见仁见智。“排除/否”阵营坚持认为,由于提供的功能集使开发和构建过程中轻松从包存储库(例如nuget.org)中拉取,因此可以在构建时完成。“ include / Yes”阵营坚持认为,如果外部存储库不可用,则没有软件包就无法构建代码。在做出决定之前,请阅读双方。另请参阅:softwareengineering.stackexchange.com/questions/301547/…–
CJBS

Answers:


68

没有

由于提出了这个问题,因此现在有了一个简单的工作流程即可使用NuGet,而无需将程序包提交给源代码管理

从包管理器控制台,您需要安装“ NuGetPowerTools”

Install-Package NuGetPowerTools

然后,要使您的项目支持包还原,您需要运行另一个命令:

Enable-PackageRestore

现在,您可以在没有packages文件夹的情况下提交代码库。上一个命令更改了项目文件,因此,如果缺少包,则将自动下载并添加它们。

资源

使用NuGet而不将包提交到源代码管理


41
从NuGet-1.6开始,您不再需要NuGetPowerTools来执行此操作。只需在解决方案资源管理器中右键单击解决方案,然后选择Enable NuGet Package Restore。参见文档
Kaleb Pederson'2

3
是的,您必须检入.nuget文件夹及其下的文件。
2013年

11
@Edward-从哲学上讲,鉴于它们是依赖项,为什么不将NuGet包包含在源代码管理中?检入到源代码管理中的内容应为足以用于构建的代码的100%。通过不包括NuGet包,创建了外部依赖项,例如。如果软件包下载位置发生更改,或者由于某种奇怪的原因而不再可用,等等。或者更可能的是,如果软件包稍有更改,后来又重新下载并中断了构建,该怎么办?如果构建项目所需的一切都在源代码控制中,那将可以避免。
Howiecamp 2014年

5
@Howiecamp我完全同意。我不明白逻辑。我希望源代码管理成为一个完全独立的系统。尤其是如果该项目有些遗留并且一段时间未访问。我想回来并使其保持不变。Nuget是我不想遇到的单点故障。
特拉维夫2015年

2
@Howiecamp我们的解决方案是托管我们自己的nuget服务器-将所有内部或外部的nuget软件包放入GIT-LFS。这样就消除了单点故障,并使所有内容保持在版本控制之下。但是,我们还是不签入包文件夹-我们仍然使用自动包还原
卡斯帕莱昂尼尔森

30

是。考虑将“ packages”目录等同于您在问题中提到的“ libs”目录。这是我个人在OSS项目中采用的方法。

我们正在研究允许MSBuild自动下载所需软件包的功能,但尚未实现(自NuGet 1.1起)。

我认为有些人可能已经自己实现了这些功能,但是我们的计划是希望将这些功能内置到NuGet 1.2或1.3中。


10
我肯定希望看到该功能。能够根据需要将软件包下拉至CI服务器或开发PC会很好,这样您就可以避免使用第三方DLL膨胀源代码控制存储库。
约翰·米尔斯

2
如果Visual Studio中的软件包管理器和命令行工具都可以“修复软件包”,那就太好了。
肖恩·威尔逊

1
也许最好删除/编辑此答案,因为它已经过时了
Lex

3
@Tim答案不是当前的恕我直言
Edward Wilde

4
这个答案仍然是最新的。考虑不在全局存储库中的软件包(无法修复/下载它们)。恕我直言,将软件包存储在版本控制系统中是一种好习惯。
Pavel Hodek

6

尽管这里给出了所有答案,但仍然不让所有依赖项都处于“某种”版本控制之下仍然是一个可怕的解决方案。

对于GIT,这将意味着GIT-LFS。

NPM的最新一集说明了为什么:如果您所依赖的Internet存储库中断,不可用等,那么您就被搞砸了吗?

您不再能够构建自己的东西-因此无法交付。


1
这是非常好的一点。即使我们拥有自己的内部NuGet服务器,我们也可以依靠它在构建期间始终可用吗?另外,我们的软件包多久更改一次,以便每次构建时都需要获得新副本?
Josh P

npm因未取消列出软件包而中断,实际上删除了它们。NuGet不会这样做。如果您在任何时候都无法访问NuGet,则说明存在严重错误。我不认为在git中存储一小部分依赖项是一个好的解决方案:只要将依赖项锁定到特定版本,并在您和Internet之间建立镜像(如果这对您很重要)。

2
“ NuGet不会这样做”。胡迪鲁湖,您刚刚为完全不受您控制的域名的未来做出了承诺。在现实世界中,事物超出了您的控制范围,所以它们超出了您的控制范围。NuGet和Npm都适用。此外,您对“镜像”的想法正是我在这里提出的,但是在您的世界中,“镜像”没有任何版本控制方案的支持。同样,您还没有解决您提出的问题。
卡斯珀·莱昂·尼尔森

5

自问了问题以来,我采用了以下方法,这样我就不必检入toplovel软件包目录。

在顶级build.msbuild文件中:

<Target Name="NuGet">
    <ItemGroup>
       <NuGetPackage Include="*\packages.config" />
    </ItemGroup>
    <Exec Command='libs\NuGet.exe install "%(NuGetPackage.FullPath)" -o Packages'  />

    <!-- optional for project that has JavaScript content -->
    <CreateItem Include="Packages\*\Content\Scripts\*">
       <Output TaskParameter="Include" ItemName="NuGetJSFiles"/>
    </CreateItem>
    <Copy SourceFiles="@(NuGetJSFiles)" DestinationFolder="MainProj\Scripts\" OverwriteReadOnlyFiles="true" SkipUnchngedFiles="true" />
    <Delete Files="MainProj\Scripts\.gitignore" />
    <WriteLinesToFile File="MainProj\Scripts\.gitignore" Lines="%(NuGetJSFiles.Filename)%(NuGetJSFiles.Extension)" /
    <Delete Files="@(PostNuGetFiles)" />
</Target>

在每个project.csproj文件中

<Target Name="BeforeBuild">
    <Error Condition="!Exists('..\Packages\')" Text="You must run &gt; msbuild build.msbuild to download required NuGet
Packages" />

    <!-- optional for project that has JavaScript content -->
   <ReadLinesFromFile File="Scripts\.gitignore">
     <Output TaskParameter="Lines" ItemName="ReqJSFiles" />
   </ReadLinesFromFile>
   <Message Text="@(ReqJSFiles)" />
   <Error Condition="!Exists('Scripts\%(ReqJSFiles.Identity)')" Text="You must run &gt; msbuild build.msbuild to download required NuGet JS Package - Scripts\%(ReqJSFiles.Identity)" />
 </Target>

2
这行得通,但是现在最好只使用内置的使能包还原
Scott Weinstein

4

我意识到,最初发布并回答此问题时,现实与众不同,但幸运的是答案有所改变。现在可以使用NuGet使用Pre-Build事件通过MSBuild下载依赖项。您不需要将packages文件夹放在代码存储库中,所有依赖项都将在构建时下载和/或更新。这可能是一种解决方法,但看起来还不错。有关详细信息,请参见以下博客文章:http : //blog.davidebbo.com/2011/03/using-nuget-without-committing-packages.html


4
我很兴奋,直到我想起这需要构建服务器访问NuGet存储库,而且这不是我在构建服务器无法看到Internet的唯一工作场所。我将回到检查包裹树中……
piers7 2011年


3

这个帖子已经很过时了。答案仍然是“否”,但解决方案已更改。从NuGet 2.7+开始,您可以启用自动软件包还原,而无需在源文件中包含NuGet.exe文件(至少可以这样说),如果您使用任何现代DVCS,则可以忽略packages文件夹。如果您需要任何特殊的自定义设置,则可以在解决方案根目录中创建一个nuget.config文件。

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

同样,使用新的csproj格式,您也可以避免额外的nuget.config文件,因为该文件现已集成。请查看这篇文章,这可以更好地说明:

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

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.