从NuGet签入包到版本控制?

时间:2011-02-12 14:57:36

标签: version-control msbuild nuget

在NuGet之前,检查项目中使用的所有外部DLL是常见的“最佳实践”。通常位于Libs3rdParty目录中。

在使用NuGet时,我是否应该在packages目录中办理登机手续,或者MSBuild是否有办法从nuget Feed自动下载所需的软件包?

7 个答案:

答案 0 :(得分:67)

没有

由于这个问题被问到,现在有一个简单的工作流程来使用NuGet而无需将包提交给源代码控制

在您的软件包管理器控制台中,您需要安装'NuGetPowerTools'

Install-Package NuGetPowerTools

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

Enable-PackageRestore

现在您已准备好在没有packages文件夹的情况下提交代码库。上一个命令改变了你的项目文件,这样如果缺少包,它们会自动下载并添加。

来源

Using NuGet without committing packages to source control

答案 1 :(得分:30)

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

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

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

答案 2 :(得分:6)

尽管这里有所有答案,但它仍然是一个简单的问题。可怕的解决方案,没有你所有的依赖关系"某种"版本控制。

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

NPM最近的一集说明了原因:如果您所依赖的互联网存储库中断,不可用等等,那么您是不是已经搞砸了?

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

答案 3 :(得分:5)

自提出问题以来,我已采用以下方法,因此我无需登入toplovel Packages 目录。

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

答案 4 :(得分:4)

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

答案 5 :(得分:3)

2013年9月20日,有一种叫做“Nuget Restore”的东西。如果您愿意,您实际上不必签入包文件夹。 (特别是如果您使用的是DVCS)

看看这个:使用NuGet而不将包提交给源代码控制 http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

答案 6 :(得分:3)

这篇文章已经过时了。答案仍然没有,但解决方案已经改变。 从NuGet 2.7+开始,您可以启用自动包恢复,而不在源中包含NuGet.exe文件(至少可以说这是不可取的),如果您使用任何现代DVCS,则可以忽略packages文件夹。如果需要任何特殊自定义,可以在解决方案根目录中创建nuget.config文件。

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

此外,使用新的csproj格式,您可以避免额外的nuget.config文件,因为现在已集成。请查看此帖更好地解释:

Should .nuget folder be added to version control?