【发布时间】:2014-07-07 18:17:13
【问题描述】:
在本地开发时,我将 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 有一个默认缓存,对吧? %localappdata%\NuGet\Cache 为什么不使用它作为你在 packagesources 列表中的第一个条目?
-
现在感觉自己像个傻瓜,知道我错过了什么。谢谢,看起来效果很好。