使用NuGet和project.json中的解决方案相关包文件夹

5
我有一个解决方案,其中包含一个在源控件中检查过的packages文件夹。我改变了一些项目,采用了project.json文件而不是packages.config来定义依赖关系。这些项目都是普通的.csproj项目,不是DNX .xproj项目。一切似乎都正常工作,但是在更新包后,我注意到新版本没有添加到解决方案的packages文件夹中。相反,它被添加到NuGet的新共享软件包文件夹中的用户配置文件夹中。
所以问题是,如何让NuGet使用解决方案的packages文件夹而不是共享文件夹?
到目前为止,我尝试的方法都没有成功:
  • 在解决方案文件夹中添加一个global.json文件,指定"packages": "packages"
  • .nuget\nuget.config中设置<add key="disableSourceControlIntegration" value="false" />
1个回答

2

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文件夹结构不同,packages\<package_name>\<version>\packages\<package_name>.<version>\不同,并且更新或卸载后旧版本或未使用的软件包不会被删除。手动清除packages目录然后在任何更改后恢复所需的软件包将达到相同的效果。
个人感觉这真的很麻烦,因为它需要设置全局设置来针对每个解决方案进行设置。NuGet 最终会更新以支持project.json的每个解决方案包目录,但同时您可以使用上述方法或者暂时坚持使用packages.config

2
另一种选择是在调用msbuild时通过命令行传递/p:NuGetPackagesDirectory=c:\my\new\dir\(假设您已经调用了nuget restore -PackagesDirectory c:\my\new\dir\)。 - Peter McEvoy
NuGet 在某个时候将会更新以支持使用 project.json 的每个解决方案包目录...您是否有 GitHub 问题或其他 URL 可以引用此事?我在 NuGet 的 GitHub 问题中搜索了一下,但没有找到任何关于此事的信息。 - joshuapoehls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接