87

在 NuGet 之前,签入项目中使用的所有外部 DLL 是普遍接受的“最佳实践”。通常在Libsor3rdParty目录中。

使用 NuGet 时,我应该签入packages目录,还是 MSBuild 有办法从 nuget 提要自动下载所需的包?

4

7 回答 7

68

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

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

Install-Package NuGetPowerTools

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

Enable-PackageRestore

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

来源

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

于 2011-10-01T11:37:19.200 回答
30

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

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

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

于 2011-02-13T00:41:57.470 回答
6

尽管这里有所有答案,但在“某种”版本控制下没有所有依赖项仍然是一个简单的可怕解决方案。

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

NPM 最近的一集说明了原因:如果您依赖的 Internet 存储库中断、不可用等,那么您是不是被搞砸了?

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

于 2016-04-15T15:22:26.000 回答
5

自从提出问题以来,我采用了以下方法,这样我就不必检查 toplovel Packages目录。

在顶层 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>
于 2011-07-30T14:41:57.993 回答
4

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

于 2011-07-01T12:44:56.390 回答
3

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

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

于 2013-09-20T18:56:38.553 回答
3

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

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

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

.nu​​get 文件夹是否应该添加到版本控制中?

于 2014-12-10T20:30:06.337 回答