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

时间:2014-07-07 18:17:13

标签: .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。这是有道理的,因为引用的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. 构建解决方案。
  4. 这似乎是一个过于漫长的处理方式,我错过了一些明显的东西吗?我已经阅读了一些博文,其中人们使用XSLT为解决方案中的所有项目文件重写'hintPath'元素 - 当然有更好的方法吗?

2 个答案:

答案 0 :(得分: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    

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

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

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

答案 1 :(得分:3)

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

NuGet将按照配置中定义的顺序从packagesources恢复包,并在第一次点击时停止扫描。 (activepackagesource应该是汇总的'All'feed)