【问题标题】:Storing nuget packages in alternate location on build server将 nuget 包存储在构建服务器上的备用位置
【发布时间】:2014-07-07 18:17:13
【问题描述】:

在本地开发时,我将 Nuget 包安装在默认位置(解决方案文件夹中的 \packages)。

我想在我的构建服务器上有一个不同的文件夹作为存储库路径,我也可以在其中下载包,有效地为我提供一个本地缓存包,该缓存将在构建中持续存在,而不需要每次都重新下载所有包构建。

在 CI 服务器上,我将一个 nuget.config 文件放到解决方案目录中,该目录指定了新包文件夹的位置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <!-- Specify repository path -->
    <add key="repositorypath" value="x:\nugetPackages" />
  </config>
  <activePackageSource>
    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
  </activePackageSource>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
</configuration>

这部分工作正常并将包下载到 x:\nugetPackages\ 但是当我尝试构建解决方案时,由于找不到 dll,我得到了异常。这是有道理的,因为引用的提示路径是“..\packages\lib\lib.dll”,而我希望它完全位于不同的驱动器上。

我的主要 msbuild 任务只是构建解决方案文件。为了让它工作,我在我的 msbuild 脚本中尝试了各种选项,来自:

以上所有结果都会导致大量警告,类似于:error CS0246: The type or namespace name 'HttpRequestMessage' could not be found (are you missing a using directive or an assembly reference?)

我已经设法通过将 MSBuild 脚本更改为:

  1. 将 nuget 包恢复到“缓存”文件夹(例如 x:\nugetPackages)。
  2. 将这些包复制到默认位置 (..\packages)。
  3. 构建解决方案。

这似乎是一种过于冗长的处理方式,我是否遗漏了一些明显的东西?我已经阅读了一些博客文章,其中人们使用 XSLT 重写解决方案中所有项目文件的“hintPath”元素 - 肯定有更好的方法吗?

【问题讨论】:

  • 你知道 NuGet 有一个默认缓存,对吧? %localappdata%\NuGet\Cache 为什么不使用它作为你在 packagesources 列表中的第一个条目?
  • 现在感觉自己像个傻瓜,知道我错过了什么。谢谢,看起来效果很好。

标签: .net msbuild nuget


【解决方案1】:

我发现 nuget 中的两个概念之间存在一些混淆。

  • 包源:这是安装/恢复时下载包的位置(在您的构建服务器上,这意味着恢复时)
  • 包存储库:这是下载包的地方

如果您想节省构建服务器上的磁盘空间,您可以设置一个通用包存储库,您的所有项目都可以引用该存储库。对此的一大烦恼是(如您所见)Visual Studio 中的提示路径。如果你想使用一个通用的包 repo,每个人都需要使用这种方法。 (或者您可以使用 mklink 在解决方案文件夹中创建指向通用包存储库的符号链接,这提供了一个通用包存储库而不会破坏提示路径)

一个例子:

c:\packages\ --> our shared package repository
c:\mySolutions\solution1
c:\mySolutions\solution1\packages --> symlink to c:\packages
c:\mySolutions\solution2
c:\mySolutions\solution2\packages --> symlink to c:\packages    

可以使用以下命令创建符号链接:

cd c:\mySolutions\solution1
mklink /D packages c:\packages

如果您想阻止从包源下载,您可以依赖 Nuget 的默认缓存。 (注意:我上次检查时仍然限制为 200 个单独的包裹。) 当您使用共享包存储库时,nuget restore 命令将看到已安装的包并绕过下载。

【讨论】:

  • 不错。使用 TFS 构建服务器时,您是否看到任何明显的速度提升?
  • 从未检查过。由于我们有 800 多种解决方案,我们主要是在寻找节省磁盘空间的方法。
  • 这个。这么多。在 MSBuild 执行它之前,我将 mklink /J packages e:\binaries\NuGet 作为构建步骤。就现在正在下载 nuget 包而言,这是可行的,但由于某种原因,MSBuild 仍然看不到它们,尽管提示路径从项目文件正确解析到包目录。
  • 这是否与您创建连接点而不是符号链接的事实有关。 (/J 代替 /D)
【解决方案2】:

NuGet 在%localappdata%\NuGet\Cache 有一个内置的本地缓存,您可以将其用作 nuget.config 中的包源。

NuGet 将按照配置中定义的顺序从包源中恢复包,并在第一次命中时停止扫描。 (activepackagesource 应该是聚合的“All”提要)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2013-06-03
    • 2018-07-13
    • 2014-04-01
    相关资源
    最近更新 更多