在本地开发时,我将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脚本更改为:
来使其工作这似乎是一个过于漫长的处理方式,我错过了一些明显的东西吗?我已经阅读了一些博文,其中人们使用XSLT为解决方案中的所有项目文件重写'hintPath'元素 - 当然有更好的方法吗?
答案 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)