Version control 从NuGet将包签入版本控制?

Version control 从NuGet将包签入版本控制?,version-control,msbuild,nuget,Version Control,Msbuild,Nuget,在NuGet之前,签入项目中使用的所有外部DLL是公认的“最佳实践”。通常位于Libs或3rdParty目录中 使用NuGet时,我应该签入包目录,还是MSBuild可以从NuGet提要自动下载所需的包?是。考虑“包”目录相当于你在你的问题中提到的“LIBS”目录。这是我个人在OSS项目中采用的方法 我们正在研究允许MSBuild自动下载所需软件包的功能,但尚未实现(从NuGet 1.1开始) 我想有些人可能已经自己实现了这些功能,但我们的计划是希望将这些功能内置到NuGet 1.2或1.3中。

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

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

是。考虑“包”目录相当于你在你的问题中提到的“LIBS”目录。这是我个人在OSS项目中采用的方法

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


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

我意识到,当这个问题最初发布并回答时,现实情况有所不同,但幸运的是,答案有点改变。现在可以使用NuGet通过使用预生成事件的MSBuild下载依赖项。您不需要将packages文件夹放在代码存储库中,所有依赖项都将在生成时下载和/或更新。这可能是一个解决办法,但它看起来足够体面。有关详细信息,请参阅以下博文:

自从提出这个问题以来,我采用了以下方法,这样我就不必查看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>

不
既然有人问了这个问题,现在就有了一个简单的工作流程,可以在不向源代码管理提交包的情况下使用NuGet

从package manager控制台,您需要安装“NuGetPowerTools”

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

Enable-PackageRestore
现在,您可以在不使用packages文件夹的情况下提交代码库了。上一个命令更改了项目文件,以便在缺少包时自动下载和添加包

来源

从2013年9月20日起,有一种叫做“Nuget Restore”的东西。如果您希望签入包文件夹,实际上不必签入。(尤其是在使用DVCS时)

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

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


尽管这里给出了所有答案,但没有将所有依赖项置于“某种”版本控制之下仍然是一个普通的ole可怕的解决方案

对于GIT,这意味着GIT-LFS

NPM最近的一集说明了原因:如果你所依赖的互联网存储库中断、不可用等,那么你就完蛋了,不是吗


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

我肯定希望看到添加该功能。如果能够根据需要将包拉到CI服务器或开发人员PC上,那就太好了,这样可以避免使用第三方DLL使源代码管理存储库膨胀。如果visual studio中的包管理器和命令行工具都可以“修复包”那太棒了。也许现在删除/编辑这个答案会很好obsolete@Tim答案不是最新的。他的答案仍然是最新的。考虑不在全局存储库中的包(无法修复/下载它们)。在版本控制系统中存储包是一种很好的做法。我很兴奋,直到我想起这需要构建服务器访问NuGet存储库,而这不是我工作过的构建服务器无法看到internet的唯一地方。我将继续检查中的包树……从NuGet-1.6开始,您不再需要NuGetPowerTools来执行此操作。只需在解决方案资源管理器中右键单击解决方案并选择,
启用NuGet Package Restore
。请参阅。是的,您必须签入.nuget文件夹及其下的文件。@Edward-从哲学上讲,既然nuget包是依赖项,为什么不在源代码管理中包括它们呢?签入源代码管理的内容应该是构建所需的100%代码。如果不包括NuGet软件包,则会创建外部依赖关系,例如,如果软件包下载位置发生更改,或者由于某些奇怪的原因不再可用,等等,或者更可能的情况是,如果软件包发生了一些微小的更改,随后重新下载,并且破坏了构建,该怎么办?如果构建项目所需的一切都在源代码管理中,那么这本可以避免。@Howiecamp我完全同意。我不懂逻辑。我希望源代码控制是一个完全独立的系统。特别是如果项目有点遗留,暂时无法访问。我想回来,让它在没有修改的情况下工作。Nuget是我不希望出现的单点故障。@Howiecamp我们的解决方案是托管我们自己的Nuget服务器,并将所有Nuget包(内部和外部)放入GIT-LFS。这消除了单点故障,并使所有内容都处于版本控制之下。但是我们仍然没有签入packages文件夹,并且我们仍然使用自动包恢复。这是可行的,但是现在,最好只使用内置的enable-package-restoreth。这是一个非常好的观点。即使我们有自己的内部NuGet服务器,我们是否可以依靠它始终保持b
Enable-PackageRestore