从NuGet签入包到版本控制?

Sco*_*ein 87 msbuild version-control nuget

在NuGet之前,检查项目中使用的所有外部DLL是常见的"最佳实践".通常在一个Libs3rdParty目录中.

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

Edw*_*lde 67

没有

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

从包管理器控制台,您需要安装'NuGetPowerTools':

Install-Package NuGetPowerTools
Run Code Online (Sandbox Code Playgroud)

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

Enable-PackageRestore
Run Code Online (Sandbox Code Playgroud)

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

资源

使用NuGet而不将包提交给源代码控制

  • 从NuGet-1.6开始,您不再需要NuGetPowerTools来执行此操作.只需右键单击Solution Explorer中的Solution,然后选择`Enable NuGet Package Restore`.参见[文档](http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages). (41认同)
  • @Edward - 哲学上,为什么不将NuGet包包含在源代码控制中,因为它们是依赖项?检查到源代码控制的内容应该是100%足以构建的代码.通过不包括NuGet包,创建了外部依赖性,例如.如果软件包下载位置发生变化,或者由于某些奇怪的原因它不再可用,等等.或者更有可能的是,如果稍后重新下载并打破构建的软件包有一些细微的变化?如果构建项目所需的一切都在源代码管理中,那就可以避免这种情况. (11认同)
  • @Howiecamp我完全同意.我不明白逻辑.我希望源代码控制是一个完全独立的系统.特别是如果该项目有点遗留并且暂时不被访问.我想回来让它工作,没有任何修改.Nuget是我不想要的单点故障. (5认同)
  • 是的,您必须签入.nuget文件夹及其下的文件. (3认同)
  • @Howiecamp我们的解决方案是托管我们自己的nuget服务器 - 并将所有nuget包(内部为外部)放入GIT-LFS.这样可以消除单点故障,并在版本控制下保持良好状态.但我们仍然没有签入packages文件夹 - 我们仍然使用自动包恢复 (2认同)

Haa*_*ked 31

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

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

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

  • 我肯定希望看到这个功能增加了.如果能够将包根据需要下拉到CI服务器或开发PC,那将是很好的,这样您就可以避免使用第三方DLL使源控制存储库膨胀. (10认同)
  • 这个答案仍然是最新的.考虑不在全局存储库中的包(无法修复/下载它们).恕我直言,最好将包存储在版本控制系统中. (4认同)
  • @Tim回答不是当前的imho (3认同)
  • 如果Visual Studio中的包管理器和命令行工具都可以"修复包",这将是非常棒的. (2认同)

Cas*_*sen 6

尽管这里有所有的答案,但它仍然是一个简单的'糟糕的解决方案,没有所有的依赖属于"某种"版本控制.

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

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

你不再能够建立你的东西 - 因此无法提供.

  • 这是一个非常好的观点。即使我们有自己的内部 NuGet 服务器,我们是否可以依赖它在构建过程中始终可用?另外,我们的包多久更改一次,我们总是需要为每个构建获取一个新的副本? (2认同)
  • “ NuGet不会这样做”。胡迪鲁湖,您刚刚为完全不受您控制的域名的未来做出了承诺。在现实世界中,事物超出了您的控制范围,所以它们超出了您的控制范围。NuGet和Npm都适用。此外,您对“镜像”的想法正是我在这里提出的,但是在您的世界中,“镜像”没有任何版本控制方案的支持。同样,您还没有解决您提出的问题。 (2认同)

Sco*_*ein 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>
Run Code Online (Sandbox Code Playgroud)

在每个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>
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但是现在,最好只使用内置的启用包恢复 (2认同)