将解决方案相关包文件夹与 NuGet 和 project.json 一起使用

Use solution relative packages folder with NuGet and project.json

我有一个解决方案,其中 packages 文件夹签入了源代码管理。我更改了一些项目以使用 project.json 文件而不是 packages.config 来定义依赖项。这些项目都是正常的 .csproj 项目,而不是 DNX .xproj 项目。一切似乎都正常工作,但是在更新包后我注意到新版本没有添加到解决方案的 packages 文件夹中。相反,它被添加到用户配置文件文件夹中 NuGet 的新共享包文件夹中。

所以问题是,如何让 NuGet 使用解决方案的 packages 文件夹而不是共享文件夹?

到目前为止我尝试过但没有成功的方法:

NuGet 3.2 添加了对使用环境变量指定共享全局包文件夹的支持,NUGET_PACKAGES。您可以将完整路径设置为另一个全局包文件夹,但是我发现,如果您只是将变量设置为 "packages",那么 Visual Studio 中的 NuGet 工具会将其视为解决方案文件夹下的相对路径.这让我可以使用解决方案的 packages 文件夹安装和恢复 NuGet 包。

不幸的是,构建项目然后在 Microsoft.NuGet.targets 中出现错误,无法找到 NuGet 包。 msbuild 中的 NugetPackagesDirectory 属性 似乎没有设置。为了解决这个问题,我在 C:\Program Files (x86)\MSBuild\Microsoft\NuGet\Microsoft.NuGet.props 文件中添加了以下行:

<PropertyGroup Condition="'$(NugetPackagesDirectory)' == ''">
  <NugetPackagesDirectory>$(SolutionDir)packages</NugetPackagesDirectory>
</PropertyGroup>

这将影响计算机上的所有解决方案,因此另一种方法是在每个项目文件中添加相同的行,或者将这些相同的行添加到您导入到每个项目的解决方案中的自定义 props 文件中。构建服务器也可能需要这个。

虽然这可行,但缺点是包文件夹具有不同的结构,packages\<package_name>\<version>\packages\<package_name>.<version>\ 相比,旧版本或未使用的包在更新后不会被删除或卸载。手动清除包目录,然后在任何更改后恢复所需的包将实现相同的目的。

就个人而言,这感觉真的很老套,因为它需要为应该在每个解决方案的基础上设置的东西设置全局设置。 NuGet 将在某个时候更新以支持每个解决方案包目录 project.json 但与此同时,您可以使用上述解决方法,或者暂时坚持使用 packages.config