.net - 将 nuget 包存储在构建服务器上的备用位置

标签 .net msbuild nuget

在本地开发时,我将 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 脚本中尝试了各种选项,来自:
  • 在 BeforeResolveReferences 任务中指定 AssemblySearchPaths(根据 http://www.beefycode.com/post/resolving-binary-references-in-msbuild.aspx )
  • 在构建项目时手动指定 AdditionalLibPaths 和/或 AssemblySearchPaths 作为参数。
  • 在 nuget.config 文件中指定另一个“activePackageSource”元素。

  • 以上所有结果都会导致许多类似于以下内容的警告:error CS0246: The type or namespace name 'HttpRequestMessage' could not be found (are you missing a using directive or an assembly reference?)
    我设法通过将 MSBuild 脚本更改为:
  • 将 nuget 包还原到“缓存”文件夹(例如 x:\nugetPackages)。
  • 将这些包复制到默认位置 (..\packages)。
  • 构建解决方案。

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

    最佳答案

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

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

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

    一个例子:
    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    
    

    可以使用以下命令创建符号链接(symbolic link):
    cd c:\mySolutions\solution1
    mklink /D packages c:\packages
    

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

    关于.net - 将 nuget 包存储在构建服务器上的备用位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24617112/

    相关文章:

    .net - Web.config 的最大大小是多少?

    .net - Windows 窗体线程和事件 - 传递事件的最有效方法?

    c# - 面板滚动 c#

    c++ - msbuild 自动替换构建工具

    nuget - 如何告诉 NuGet 为每个项目安装包而不是解决方案

    c# - 无法调试使用并发异步/等待的程序

    C++ 单独包含和源目录和#Include

    .net-core - 使用 git log 使 MSBuild Exec 命令跨平台工作

    visual-studio - 通过Package Manager控制台运行清理,构建和重建

    asp.net-mvc - 适用于ASP.NET MVC 3的NuGet软件包