在本地开发时,我将 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 脚本更改为:
这似乎是一种过于冗长的处理方式,我是否遗漏了一些明显的东西?我已经阅读了一些博客文章,其中人们使用 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/