如何在构建服务器/生产服务器上离线使用NuGet包?

6

背景

我有以下组件:

  • 我的本地解决方案(.NET 4.5),它使用NuGet包。
  • 一个PowerShell构建脚本,其中包含构建目标、运行单元测试、Web.config转换等。
  • 一个没有互联网连接的构建服务器,运行CruiseControl.NET,调用我的构建脚本来构建文件。它还作为开发构建的(IIS7)环境。
  • 一个没有互联网访问权限的生产服务器,拥有IIS7。

目标

我想从我的解决方案中利用NuGet包,并将它们作为源代码的一部分存储在本地 -- 而不必依赖于构建和生产服务器上的互联网连接或NuGet包服务器。

问题

  • 我该如何告诉MSBuild正确部署这些包,或者这是NuGet的默认行为吗?
4个回答

9

Scott Hanselman写了一篇名为当NuGet.org宕机时如何访问NuGet(或者你在飞机上)的优秀文章。如果您阅读了这篇文章,您会发现他所提出的建议主要是临时解决方案,并且他极力强调除非在紧急情况下,否则您永远不需要离线缓存。

然而,如果您阅读他文章底部,他提出了以下建议:

如果您担心公司范围内的外部依赖关系,您可能希望在组织内拥有一个网络共享(可能在共享构建服务器上),其中包含您所依赖的NuGet软件包。如果您身处低带宽环境中的组织,这非常有用。

在类似的情况下,这就是我最终所做的。我们有一个共享文件夹,里面保存着我们所依赖的各种软件包的最新版本(当然,我假设您在某种类型的网络上)。这很有效,并且只需要花费一点工作来定期更新软件包(我们有季度更新周期)。

另一篇可能对您有帮助(对我也很有帮助)的文章是:使用NuGet分发我们公司的内部DLL


1
在VS中存在包管理器选项,但我该如何配置CI服务器的msbuild以访问此网络共享? - Juan Zamudio

0

默认情况下,Nuget会将所有依赖项放在一个packages/文件夹中。您可以将此文件夹简单地添加到您的源代码控制系统中,这样当您进行构建时,Nuget就不需要从互联网下载任何内容。您还需要确保Nuget包恢复未配置在您的解决方案中。


1
这实际上不是一个推荐的做法,有很多原因。事实上,对于那些具有网络访问权限的人来说,Nuget提供了一个功能,可以自动下载缺失的软件包(由单个文件定义),因此您永远不需要将它们检入。(http://goo.gl/v7Zrb)否则,请阅读此讨论,了解为什么不建议这样做:http://goo.gl/Cp9oG - JasCav
我同意,这种方法确实存在很多问题。我完全忘记了将Nuget指向本地存储库。已为您的答案点赞。 :) - Ragesh
感谢您。是的...我曾经犯过一个错误,就是在一个大项目中检查了packages文件夹...Subversion处理得不好。这也是我想分享我的经验的原因之一。 - JasCav

0

你需要做出决定:要么在构建时下载/安装包(无论是使用软件包还原、自己的脚本还是构建工具来完成),要么将/packages程序集放入源代码控制中,就像它们在/lib目录中一样。

我们在内部使用软件包还原和NuGet的Visual Studio扩展时遇到了很多问题,以至于我们几乎完全放弃了NuGet,尽管我们公司的两个产品中有一个是私有的NuGet存储库。

基本上,我们通过使用我们的产品BuildMasterProGet的组合来管理生命周期,使得:

  • ProGet缓存了我们所有的NuGet包(包括我们自己发布的包和来自nuget.org的包)
  • BuildMaster执行CI和部署方面的任务,并处理所有NuGet包还原,因此我们永远不必处理大量的检入库或解决方案混乱的恶梦,即软件包还原
如果您采用类似的流程,最简单的方法可能是在第一个环境中创建一个构建工件,其中包括已安装的NuGet软件包程序集,然后只需将该工件部署到生产环境,而无需重复此过程。
希望这可以帮助您, -Tod

Tod,你能详细解释一下“在第一个环境中创建一个构建工件可能是最容易的,其中包括已安装的NuGet软件包程序集,然后只需将该工件部署到生产环境,而无需重复此过程。”吗?我需要将我的NuGet软件包放入打包好的构建工件中。只有packages文件夹吗? - DonBecker

0

我知道这是一个老话题,但是因为大小而存储构建项目所需的所有文件怎么会是不好的呢?

如果库不可用,就应该替换它的想法是疯狂的。代码需要花钱,由于您无法控制git或nuget上的库,因此应该提供一份副本。

许多公司的要求之一是审计。如果发现某个库窃取了您的数据,那该怎么办呢?如果该库从NUGET中删除,您甚至无法构建代码进行双重检查,那么您如何确定呢?

网络上的一刀切Nuget和git方式并不好。

我认为过去Nuget的工作方式,即将文件存储在本地并可选择放置在源代码控制中,是正确的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接