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

Fer*_*min 5 .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>
Run Code Online (Sandbox Code Playgroud)

这部分工作正常并将包下载到x:\nugetPackages \但是当我尝试构建解决方案时,我得到异常,因为找不到dll.这是有道理的,因为引用的hintPath是"..\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包恢复到'cache'文件夹(例如x:\nugetPackages).
  2. 将这些包复制到默认位置(..\packages).
  3. 构建解决方案

这似乎是一个过于冗长的处理方式,我错过了一些明显的东西吗?我已经阅读了一些博文,其中人们正在使用XSLT为解决方案中的所有项目文件重写'hintPath'元素 - 当然有更好的方法吗?

Fil*_*Vos 6

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

  • 包源:这是安装/恢复时下载包的地方(在构建服务器上这意味着恢复时间)
  • 包库:这是软件包下载

如果要在构建服务器上节省磁盘空间,可以设置一个所有项目都可以引用的公共包存储库.这是一个很大的烦恼(正如你所注意到的)Visual Studio中的提示路径.如果你想使用一个通用的包回购,每个人都需要使用这种方法.(或者您可以使用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    
Run Code Online (Sandbox Code Playgroud)

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

cd c:\mySolutions\solution1
mklink /D packages c:\packages
Run Code Online (Sandbox Code Playgroud)

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


Xav*_*ter 3

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

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