【问题标题】:How to use NuGet packages on build server/production server without internet?如何在没有互联网的情况下在构建服务器/生产服务器上使用 NuGet 包?
【发布时间】:2012-11-26 18:55:32
【问题描述】:

背景

我有以下组件:

  • 我使用 NuGet 包的本地解决方案 (.NET 4.5)。
  • 我的解决方案中的 PowerShell 构建脚本具有构建、运行单元测试、Web.config 转换等目标。
  • 没有 Internet 连接且运行 CruiseControl.NET 的构建服务器调用我的构建脚本来构建文件。它还用作开发构建的 (IIS7) 环境。
  • 具有 IIS7 且无法访问 Internet 的生产服务器。

目标

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

问题

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

【问题讨论】:

    标签: asp.net-mvc msbuild continuous-integration cruisecontrol.net nuget


    【解决方案1】:

    Scott Hanselman 写了一篇出色的文章,题为@9​​87654321@。如果你通读这篇文章,你会在最后看到他提出的建议主要是临时类型的解决方案,他特意说你不应该使用离线缓存,除非在那些紧急情况下。

    但是,如果您阅读他文章的底部,他会提出以下建议:

    如果您担心公司范围内的外部依赖性 规模,你可能想要一个网络共享(也许在一个共享 构建器服务器)在您的组织中包含 NuGet 您依赖的软件包。如果您在 作为一个组织的低带宽情况。

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

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

    【讨论】:

    • 在 VS 中存在包管理器选项,但我如何在 CI 服务器中配置 msbuild 以转到此网络共享?
    【解决方案2】:

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

    【讨论】:

    • 由于各种原因,这实际上不是推荐的做法。事实上,对于那些有网络访问权限的人,Nuget 提供了一项功能,可以自动下载丢失的包(由单个文件定义),因此您永远不需要签入它们。(goo.gl/v7Zrb)否则,请阅读此讨论以了解原因不推荐:goo.gl/Cp9oG
    • 我同意,这种方法确实有很多问题。我完全忘记了将 Nuget 指向本地存储库。赞成你的答案。 :)
    • :) 欣赏它。是的...我犯了一个错误,在某个地方检查了一个大型项目的包文件夹...Subversion 处理得不好。这就是我想分享我的经验的原因之一。
    【解决方案3】:

    您必须做出决定;您可以在构建时下载/安装包(无论是使用包还原、您自己的脚本还是为您执行此操作的构建工具),或者您将 /packages 程序集放在源代码控制中,就好像它们在 / lib目录。

    我们在内部使用包还原和 NuGet 的 Visual Studio 扩展时遇到了很多问题,以至于我们几乎完全放弃了 NuGet,因为它存在缺陷,尽管我们公司的 2 种产品中有 1 种是私有 NuGet 存储库。

    基本上,我们管理生命周期的方式是结合使用我们的产品BuildMasterProGet,这样:

    • ProGet 缓存我们所有的 NuGet 包(包括我们自己发布的包和来自 nuget.org 的包)
    • BuildMaster 同时执行 CI 和部署方面并处理所有 NuGet 包恢复,因此我们无需处理大量签入库或包恢复解决方案的噩梦

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

    希望这会有所帮助,
    -托德

    【讨论】:

    • 托德,您能否解释一下“在您的第一个环境中创建包含已安装 NuGet 包程序集的构建工件可能是最简单的方法,然后只需将该工件部署到您的生产中,而无需重复该过程.”?我需要将我的 NuGet 包放入我压缩的构建工件中。它只是包文件夹吗?
    【解决方案4】:

    我知道这是一个古老的讨论,但是由于大小而存储构建项目所需的所有文件到底有多糟糕?

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

    许多公司的一项要求是审核。如果发现图书馆窃取您的数据怎么办。您如何确定该库是否已从 NUGET 中删除,并且您甚至无法构建代码以进行仔细检查。

    一种适合所有 Nuget 和 git 方式的网络是不行的。

    我认为 Nuget 过去的工作方式,即文件存储在本地并可选择放置在源代码管理中的方式是可行的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-03
      • 2010-09-14
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2013-06-12
      • 2023-03-31
      相关资源
      最近更新 更多