dotnet 修復多框架 TargetFrameworks 包含不受支持平臺導致構建失敗

本文將告訴大家如何修復 dotnet 項目裏的多框架 TargetFrameworks 如果包含了當前系統無法支持的平臺時,如何進行跳過。解決在 Linux 平臺構建時提示 Mac Catalyst 不受支持而構建失敗

故事的背景是我期望在 GitHub 的 Action 裏面構建一個項目,我期望能夠在 Windows 和 Linux 和 Mac 平臺上進行構建,一開始 Windows 和 Mac 平臺都十分順利,只是到 Linux 平臺時就不斷構建失敗了

核心構建失敗的原因是在 GitHub 的 Action 裏面的 Linux 不直接支持 Mac Catalyst 平臺,而我在 GitHub 的 Action 裏面也不想也不用構建 Mac Catalyst 平臺。但可惜的是我的 csproj 裏面的 TargetFrameworks 是這樣寫的

 <TargetFrameworks>net6.0;net6.0-windows;net6.0-maccatalyst</TargetFrameworks>

構建時的核心報錯信息如下

MSBuild version 17.9.6+a4ecab324 for .NET
  Determining projects to restore...
/usr/share/dotnet/sdk/8.0.202/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.ImportWorkloads.targets(38,5): error NETSDK1178: The project depends on the following workload packs that do not exist in any of the workloads available in this installation: Microsoft.maccatalyst.Sdk.net8

核心錯誤就是 error NETSDK1178: The project depends on the following workload packs that do not exist in any of the workloads available in this installation: Microsoft.maccatalyst.Sdk.net8

但是我在 Linux 平臺只想構建 net6.0 的版本,即使我使用瞭如下命令行,也依然構建失敗

dotnet build -c release -r linux-x64 -p:TargetFramework=net6.0

或者是如下命令也是無效的

dotnet build -c release -r linux-x64 -f net6.0

這可能是因爲本質上掛的步驟是在 dotnet restore 還原的步驟裏面,在還原步驟時做的是完全的還原,沒有受到 dotnet build 的影響。這也就是爲什麼從 dotnet 的設計上,也提供了 dotnet restore 命令的原因

解決此問題可以使用 dotnet restore 命令,通過 dotnet restore 命令可以做到更細節的控制還原邏輯,避免在還原時讀取 TargetFramework 找到不受支持的平臺而失敗

將以上的構建命令換成以下兩句命令即可修復問題

dotnet restore -p:TargetFramework=net6.0
dotnet build -c release -p:TargetFramework=net6.0 --no-restore

以上的 dotnet build 命令裏面需要帶上 --no-restore 參數,用來表示只構建不還原,這是因爲咱在上一句命令裏面就自己還原了

通過以上的命令手動設置 TargetFramework 可以避免 dotnet restore 時對整體的框架進行還原,導致遇到不受支持的框架平臺返回失敗

更進一步可以添加上具體的運行時版本,如在 linux 下只構建 linux 的版本,方法是加上 -r 參數,修改之後的命令行如下

dotnet restore -p:TargetFramework=net6.0 -r linux-x64
dotnet build -c release -r linux-x64 -p:TargetFramework=net6.0 --no-restore

通過以上的構建命令可以更快的完成指定平臺構建,且解決包含不受支持的平臺構建失敗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章