我有一个解决方案,其中packages
文件夹签入源代码管理。我将一些项目更改为使用 project.json
文件而不是packages.config
来定义依赖项。这些项目都是普通.csproj
项目,而不是DNX .xproj
项目。一切似乎都正常工作,但是在更新软件包后,我注意到新版本未添加到解决方案的packages
文件夹中。相反,它已添加到 NuGet 的用户配置文件文件夹中的新共享包文件夹中。
所以问题是,如何让 NuGet 使用解决方案的packages
文件夹而不是共享文件夹?
到目前为止,我尝试过但没有成功的方法:
- 在指定
"packages": "packages"
的解决方案文件夹中添加global.json
文件 - 在
.nugetnuget.config
中设置<add key="disableSourceControlIntegration" value="false" />
NuGet 3.2 添加了对使用环境变量 NUGET_PACKAGES
指定共享全局包文件夹的支持。您可以设置备用全局包文件夹的完整路径,但是我发现,如果您只是将变量设置为"包",则 Visual Studio 中的 NuGet 工具会将其视为解决方案文件夹下的相对路径。这使我能够使用解决方案的packages
文件夹安装和还原NuGet包。
不幸的是,构建项目随后在Microsoft.NuGet.targets
中给了我错误,无法找到NuGet包。msbuild 中的 NugetPackagesDirectory
属性似乎没有设置。为了解决此问题,我在C:Program Files (x86)MSBuildMicrosoftNuGetMicrosoft.NuGet.props
文件中添加了以下行:
<PropertyGroup Condition="'$(NugetPackagesDirectory)' == ''">
<NugetPackagesDirectory>$(SolutionDir)packages</NugetPackagesDirectory>
</PropertyGroup>
这将影响计算机上的所有解决方案,因此另一种方法是在每个项目文件中或将相同的行添加到导入到每个项目的解决方案中的自定义props
文件中。构建服务器也可能需要这样做。
虽然这有效,但缺点是包文件夹具有不同的结构,packages<package_name><version>
与packages<package_name>.<version>
相比,并且旧的或未使用的包版本在更新或卸载后不会被删除。手动清除包目录,然后在任何更改后恢复所需的包将实现相同的目的。
就个人而言,这感觉真的很笨拙,因为它需要为每个解决方案设置全局设置。NuGet 将在某个时候更新以支持每个解决方案包目录project.json
但与此同时,您可以使用上述解决方法,或者暂时坚持使用packages.config
。