为所有解决方案设置共用的NuGet软件包文件夹,当一些项目被包含在多个解决方案中时。

153

我一直在使用NuGet从外部和内部包源检索包,这非常方便。但是我意识到默认情况下包会按解决方案存储,当某些具有NuGet引用的项目包含在多个解决方案中时,这非常令人沮丧。然后引用将更改为其他解决方案包文件夹,这实际上可能对另一个开发人员或构建机器不可用。

我已经看到了一些方法可以指出通用的软件包位置(也许是在项目根级别,我们正在使用TFS源控制),这是通过NuGet的2.1版本实现的,详见发布说明。我正在使用NuGet v2.7

但是我尝试添加nuget.config文件,但没有看到任何效果。软件包仍然存储在解决方案文件夹中。我错过了什么吗? 似乎有不同的xml节点结构要添加到nuget.config文件中,这取决于谁回答了这个问题: Schwarzie在另一个Stackoverflow线程上提出了建议:

<settings>
  <repositoryPath>..\..\[relative or absolute path]</repositoryPath>
</settings>
NuGet 2.1 的发布说明(参见上面的链接)建议使用此格式:
<configuration>
  <config>
    <add key="repositoryPath" value="..\..\[relative or absolute path]" />
  </config>
</configuration>

我不知道这些中的哪一个会最终起作用,或者任何一个还是两个都可以。我已经在解决方案级别上尝试了它们两个。

nuget.config文件必须放置在TFS项目根目录级别上吗?或者必须放在解决方案目录中?看来NuGet按照一定的顺序读取和应用这些文件中的设置,因此在多个级别添加它们是有意义的,其中解决方案级别上的nuget.config文件将覆盖TFS项目根级别上的文件。请问这是否可以澄清?

在引用这些内容之前,我需要删除所有已安装的包吗?如果有人能够提供逐步说明,以从特定于解决方案的nuget使用移动到通用包文件夹为好,那就太好了,这样属于几个解决方案的项目就可以找到其所需的nuget包了。


3
我怀疑你问题的简短答案(在下面 Vermis 的回答中)是,你在相对路径前面缺少了 $。关于 NuGet.Config 文件的问题,答案在这里。它首先查找 .nuget,然后查找所有父目录,然后在您的 AppData 中查找“全局”文件:然后以相反的顺序应用它们(无论意味着什么)。 - Benjol
这似乎很困难。有一个叫做Paket的工具可能是解决这个问题的方法:http://fsprojects.github.io/Paket/ - Tuomas Hietanen
晚来的评论。只是想补充一下,如果您在更改开始时正在运行Visual Studio,则需要重新启动它,因为似乎在VS启动期间会读取nuget.config文件。此外,我没有使用$也没有问题,只是不要以反斜杠开头。 - MBWise
14个回答

1
对于使用 NuGet 版本为 2.8.60318.667VS 2013专业版 用户,以下是简要说明:
您可以将软件包指向相对于 .nuget 文件夹的路径。
<configuration>
  <config>
    <add key="repositoryPath" value="../Dependencies" />
  </config>
</configuration>

例如,如果您的解决方案(.sln文件)位于C:\Projects\MySolution中,当您启用NuGet软件包还原时,.nuget文件夹将会被创建在这个位置:C:\Projects\MySolution.nuget,并且软件包将会被下载到这个目录:C:\Projects\MySolution\Dependencies。
注意:由于某些(未知的)原因,每次更新“repositoryPath”时,我都必须关闭并重新打开解决方案才能使更改生效。

请注意,关闭配置标签上缺少一个斜杠。 - Moo
http://docs.nuget.org/release-notes/nuget-2.1#user-content-specify-packages-folder-location - HANiS

1
我只是使用NTFS联接将所有软件包文件夹直接指向存储库根目录上方的单个文件夹。效果很好。在多个解决方案中并行恢复软件包时没有任何问题。其中一个优点是您不必重新配置源代码中的任何内容,例如.csproj文件中的数百个相对提示路径。通过让文件系统处理重定向和模拟单个软件包文件夹来实现“即插即用”。
只要小心“git”问题。尽管通过命令行的“git status”不显示未暂存更改,但我注意到GitKraken将“package”联接视为未暂存的文件。当您单击它时,它甚至显示错误,如“文件是目录”。如果您进行rebase,GitKraken还会尝试隐藏此“文件”,从而破坏联接,并将其恢复为包含原始文件路径文本的实际文件。非常奇怪的行为。可以通过确保将软件包文件添加到.gitignore中来解决这个问题。

1

如果您使用Paket作为包管理器,那么您的依赖文件中有一个自动符号链接选项:

storage: symlink

顺便提一下:Paket 利用了 NuGet。

参考资料:https://fsprojects.github.io/Paket/dependencies-file.html

如果你想尽可能少地进行修改,可以使用脚本定期清理子目录。即 NuGet 的默认行为是将文件从全局位置复制到本地包文件夹,因此之后删除这些文件。


-1
这是NuGet 2.1的说明: http://docs.nuget.org/docs/release-notes/nuget-2.1 无需编辑解决方案级别的文件。
适用于Visual Studio 2013和共享项目的三个解决方案。
不要忘记更新解决方案级别的NuGet(每个.nuget文件夹中的nuget.exe)。

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