簡體   English   中英

如何讓 NuGet 包為從另一個解決方案添加的現有項目正確恢復?

[英]How to get NuGet packages to restore correctly for an existing project added from another solution?

我有兩個 Visual Studio 2019 解決方案,A 和 B,都包含多個項目。 解決方案 A 包括解決方案 B 中的一個項目ProjectB ,該項目作為現有項目添加到 A 中。 此項目使用多個 NuGet 依賴項。 顯然,NuGet 包不受源代碼控制。 當用戶剛從源代碼管理中檢出解決方案時,會發生以下情況:

  1. 如果首先打開並構建解決方案 B,則ProjectB的 NuGet 依賴項會按預期恢復,並且項目會成功構建。
  2. 如果在 1. 之后打開並構建解決方案 A,則一切構建成功。 但是,如果省略第 1 步, ProjectB 將無法在解決方案 A 的范圍內構建,因為它引用的依賴項不會在原始路徑中重新創建,盡管 NuGet 已在 A 的packages文件夾中安裝了所有依賴項。 這會導致大量“找不到引用的組件”錯誤消息,以及與相同的情況。

簡單地清理 NuGet 緩存無濟於事。 似乎解決問題的唯一方法是調用

Update-Package -reinstall -ProjectName ProjectB

在觸發(重新)構建之前,從解決方案 A 的包管理器控制台。

我想通過在預構建事件中包含Update-Package命令來自動執行此操作,但顯然無法訪問包管理器控制台,我想避免安裝任何其他軟件。

在這種情況下,有沒有辦法正確恢復所有項目依賴項,以便整個解決方案 A 會自動從頭開始構建?

聽起來您需要將 Nuget.Config 文件作為解決方案項添加到每個解決方案中,並將“respositoryPath”配置鍵添加到文件中,以便兩個解決方案將 Nuget 包引用解析到同一文件夾:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
     <add key="repositoryPath" value="../../Nuget/packages" />
  <config>
</configuration>

顯然,您需要為每個 Nuget.Config 文件調整 repositoryPath 值,以便為兩個解決方案使用相同的路徑(如果解決方案 A 在文件結構中比解決方案 B 低一個文件夾,則需要添加另一個../到路徑)。

將 Nuget.Config 文件添加到每個解決方案后,您需要關閉/重新打開每個解決方案,然后運行Update-Package -reinstall以確保更新每個項目文件中的引用路徑。

事實證明,您可以在項目中使用PackageReference格式而不是文件夾,這樣做可以直接解決原始問題,無需任何額外操作。 因此,最優雅的解決方案是從 packages.config 遷移到 PackageReference :在解決方案資源管理器中右鍵單擊有問題的項目的References ,然后在上下文菜單中單擊Migrate packages.config to PackageReference 從現在開始,當一個項目包含在另一個解決方案中時,NuGet 依賴項將正確解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM