首页 文章

如何在没有互联网的构建服务器/ 生产环境 服务器上使用NuGet包?

提问于
浏览
5

背景

我有以下组件:

  • 我的本地解决方案(.NET 4.5),它使用了NuGet包 .

  • 我的解决方案中的PowerShell构建脚本,其中包含构建,运行单元测试,Web.config转换等目标 .

  • 没有运行互联网连接的构建服务器运行CruiseControl.NET,它调用我的构建脚本来构建文件 . 它还充当开发构建的(IIS7)环境 .

  • IIS7的 生产环境 服务器无法访问Internet .

目标

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

问题

  • 如何告诉MSBuild正确部署这些包,或者这是NuGet的默认行为?

3 回答

  • 8

    Scott Hanselman撰写了一篇名为How to access NuGet when NuGet.org is down (or you're on a plane)的优秀文章 . 如果你仔细阅读这篇文章,你会在最后看到他提出的建议主要是临时类型的解决方案,他不遗余力地说除了那些紧急情况之外你永远不需要离线缓存 .

    但是,如果你在他的文章的底部阅读,他提出这个建议:

    如果您担心公司范围内的外部依赖关系,您可能希望在组织内拥有包含您依赖的NuGet包的网络共享(可能在共享构建器服务器上) . 如果您作为一个组织处于低带宽状态,这是一个有用的事情 .

    这就是我在类似情况下最终做的事情 . 我们有一个共享,我们保持与我们依赖的各种包的最新版本(当然,我假设你在某种类型的网络) . 它运行良好,只需要一点点工作就可以半定期更新软件包(我们有一个季度更新周期) .

    另一篇也可能对你有帮助的文章(对我而言)是:Using NuGet to Distribute Our Company Internal DLLs

  • 0

    默认情况下,Nuget将所有依赖项放在 packages/ 文件夹中 . 您只需将此文件夹添加到源控制系统,Nuget就不需要在构建时从Internet下载任何内容 . 您已在解决方案上配置了'll also want to ensure that Nuget Package Restore isn't .

  • 0

    你必须做出决定;您是在构建时下载/安装软件包(无论是使用软件包还原,您自己的脚本,还是为您执行此操作的构建工具),或者将/ packages程序集放在源代码管理中,就像它们位于/中一样lib目录 .

    我们在内部使用包恢复和NuGet的Visual Studio扩展时遇到了很多问题,我们几乎完全废弃了NuGet,因为它存在缺陷,尽管我们公司的2个产品中有1个是私有的NuGet存储库 .

    基本上,我们管理生命周期的方式是使用我们的产品BuildMasterProGet的组合,以便:

    • ProGet缓存我们所有的NuGet包(我们自己发布的包和来自nuget.org的包)

    • BuildMaster执行CI和部署方面并处理所有NuGet包恢复,因此我们永远不必处理大量的签入库或解决方案 - 包裹恢复的噩梦

    如果您采用类似的过程,最简单的方法是在第一个环境中创建构建工件,其中包括已安装的NuGet软件包程序集,然后只需将该工件部署到 生产环境 环境中,而无需重复该过程 .

    希望这可以帮助,
    -Tod

相关问题