使用解决方案相对包文件夹与NuGet和project.json

时间:2016-02-10 05:00:31

标签: version-control visual-studio-2015 nuget nuget-package-restore project.json

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

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

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

  • 在解决方案文件夹中添加global.json文件,指定"packages": "packages"
  • <add key="disableSourceControlIntegration" value="false" />
  • 中设置.nuget\nuget.config

1 个答案:

答案 0 :(得分:2)

NuGet 3.2添加了对使用环境变量NUGET_PACKAGES指定共享全局包文件夹的支持。您可以设置替代全局包文件夹的完整路径,但是我发现如果您只是将变量设置为&#34; packages&#34;然后,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文件夹具有与packages\<package_name>\<version>\相比不同的结构packages\<package_name>.<version>\,并且旧版或未使用版本的软件包在它们之后不会被删除。重新更新或卸载。手动清除packages目录,然后在任何更改后恢复所需的包将实现相同的目的。

就个人而言,这需要设置全局设置,以便根据每个解决方案进行设置。 NuGet将在某些时候更新,以支持每个解决方案包目录project.json,但与此同时,您可以使用上述工作,或暂时坚持packages.config