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



我有一个解决方案,其中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

最新更新