C# Visual Studio如何重新定位NuGet软件包文件夹?

5
我雇了一个承包商为我编写代码。他在解决方案文件夹中设置了nuget.config,其中包含以下存储库路径:
<configuration>
  <solution>
    <add key="disableSourceControlIntegration"
      value="true" />
  </solution>
  <config>
    <add key="repositoryPath"
      value="../lib" />
  </config>
</configuration>

我对他的决定并不太满意:这将使nuget软件包文件夹位于解决方案文件夹之外。我可以通过设置以下内容轻松更改存储库路径:

value="../<mySolutionFolder>/lib" />

然而,当我这样做时,一个奇怪的事情发生了:我解决方案中使用的每个引用现在都失效了。无论我在.csproj文件或其他*.config文件中进行了什么更改,我的项目都找不到它们的引用。
唯一的解决方法是从头开始重新创建解决方案中的每个项目,并添加->现有项目等,然后引用->管理nuget包,并重新安装每个引用。
我有很多项目在我的解决方案中,为每个项目执行此操作显然很耗时。
我想知道是否有简单的方法?
看起来Nuget和VS应该有一种方式可以友好地协作,以便我可以轻松地将存储库文件夹移动到不同的路径位置。
5个回答

6

修复引用路径的一种方法是使用“包管理器控制台”。

您可以从“包管理器控制台”运行以下命令来重新安装NuGet包,这将修复引用的提示路径。

Update-Package -reinstall

这将重新安装解决方案中的所有NuGet包。我假设您已经将代码存储在源代码控制下,因此如果需要在此重新安装后还原项目所做的更改,则可以查看它们。
有关在NuGet文档网站上重新安装NuGet包的更多文档,请参阅重新安装NuGet包
另一种修复方法是在.csproj文件中进行查找和替换以修复提示路径。

2
当我在解决方案中移动实际文件夹时,我遇到了这个问题。我通常使用VS Code中的查找/替换功能,查找>..\packages\并将其替换为>..\..\packages\。但这一次我做了以下操作:
  1. 执行Update-Package -Reinstall
    • 对于所有带有提示路径的项目都有效
    • 如果您的项目使用NuGet包构建项目,则无法正常工作,因为需要手动修复自定义MSBuild语句,请参见下一步。
  2. 手动编辑未能构建的.csproj文件,例如我的示例:
<Import Project="..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
<Import Project="..\..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props')" />
请注意,在<Import>中有2个条件语句,它们使用相对路径..\..\packages
希望这些步骤能帮助其他人。

0

Package.config 用于将文件放置在文件夹之外的位置,当您通过 Nuget 添加项目中的某些内容时,它有助于避免通常上传包。

尝试将包复制到该文件夹(您设置的新路径)或者简单地关闭项目,重新打开并在转到管理项目引用后单击还原。


0

我在沒有意識到的情況下,對自己的解決方案進行了這樣的變更(最終在 *.sln 級別和其下一級都出現了 packages 文件夾),但現在我非常確定這與從使用 packages config 文件遷移到使用新方法(即使用 package references)有關。當您使用較新版本的 Visual Studio(這可能是您的承包商所做的)或透過 NuGet 中的按鈕/命令或右鍵內容菜單時,就會發生這種情況。

其中之一的事情是創建“全局” packages 文件夾(位於 .sln 級別),這旨在節省空間,因為這意味著您可以在多個解決方案中使用相同的包,而無需在每個解決方案中重複使用大型包文件夾。

當我需要合併兩個 csproj 文件的文本並需要 Google: import project difference to package reference 時,我發現了這一點。

參見https://learn.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference


0

在尝试了这里发布的所有解决方案后,我无法摆脱一个主要问题:对于非nuget项目的引用,例如SystemSystem.Core的引用仍然无效(旁边列出了黄色三角形)。删除它们并重新添加它们并没有使它们再次有效。此外(正如我们都知道的那样),Visual Studio很糟糕,无法给出为什么引用被视为无效的原因。

因此,虽然Matt的解决方案确实重新定位了nuget包文件夹,但该解决方案并未处于工作状态。此外,更新提示路径也没有帮助,因为这些路径是特定于nuget包的。我无法解释为什么基本引用,例如System也变得无效。也许一年后阅读此文章的某个人可以留下一条带有解释的消息。

最终,我做的是在没有nuget.config文件的情况下重建整个项目(我将其删除)。这会导致nuget使用所有默认值。下载的包存储在\\<solution_folder>\packages\中。在解决方案再次工作后,我添加了nuget.config文件,但删除了以下内容:

  <config>
    <add key="repositoryPath"
      value="../lib" />
  </config>

...移除该部分会导致NuGet依赖于默认行为,而这恰好是我想要的(将包安装到\packages等)。

如果其他人也打算进行这项繁琐的工作,我发现此SO解决方案对于将文件夹和文件从旧解决方案移动到新解决方案非常有帮助。


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