簡體   English   中英

Azure Pipelines:使用 -o 構建 dotnet 后 dotnet 測試失敗 - “找不到任何兼容的框架版本”

[英]Azure Pipelines: dotnet test fails after dotnet build with -o - "It was not possible to find any compatible framework version"

這是我正在嘗試做的,在自托管代理上運行管道:

  • 安裝 .NET SDK 6.0.202
  • 將我的解決方案構建到特定的輸出目錄:
- task: DotNetCoreCLI@2
        inputs:
          command: build
          projects: MySolution.sln
          arguments: "--configuration MyConfiguration -o $(Build.BinariesDirectory)"
  • 運行包含在某些已構建 DLL 中的 (NUnit) 單元測試
      - task: DotNetCoreCLI@2
        inputs:
          command: test
          projects: |
            $(Build.BinariesDirectory)\**\*Tests.dll

但是,我讓 TestHost 退出並出現以下錯誤:

找不到任何兼容的框架版本

找不到框架“Microsoft.NETCore.App”,版本“6.0.0”(x64)。

  • 沒有找到框架。
  • 如果我省略 -o 參數並讓每個項目在其 bin/MyConfiguration 文件夾中構建,同樣的事情也有效。
  • 在本地,無論是否使用 -o,一切都正常,只需執行“dotnet test Outfolder/someTests.dll”。
  • 使用 dotnet --list-runtimes 列出已安裝的運行時,顯示各種運行時,包括所需的 6.0.0。
  • 使用“where.exe dotnet”會顯示兩個安裝位置,首先顯示正確的一個(_work_tool\dotnet\dotnet.exe)。 兩者都不表示 x86 安裝,遵循一些類似問題的建議,這些問題指出 x86 運行時被錯誤使用/發現
  • 不帶 -o 的后續步驟和帶 -o 的失敗步驟都使用相同的 dotnet.exe
  • 使用“wmic OS get OSArchitecture”獲取代理的操作系統架構返回 64 位
  • 我嘗試顯式安裝 .NET 運行時 6.0.0 無濟於事。
  • 早些時候,所有項目都通過 .targets 文件配置為構建到一個公共輸出目錄。 所有測試項目都配置為構建到不同的公共目錄。 那時構建和測試都成功了。
  • 所有項目都將 x64 定義為 Platform,所有測試項目額外定義 PlatformTarget x64
  • 所有項目都有 net6.0-windows 作為 TargetFramework。 我不確定為什么它試圖顯式使用 6.0.0 運行時而不是更高版本的 6.0.x 運行時。

在顯式構建到輸出目錄時,如何讓構建代理成功運行我的測試?

更新

一些新信息:Extending the UseDotNet Task with "performMultiLevelLookup: true" 將 "No frameworks were found" 替換為 C:\

問題似乎是 dotnet test 不會在代理工作目錄 (_work_tool\dotnet) 中查找運行時。 PATH 確實包含該路徑(並且在 C:\Program Files... 之前),但帶有正斜杠 (C:\agent_work_tool/dotnet),我不確定這是否是一個問題。

更新 2

這些問題可能相關:
https://github.com/microsoft/vstest/issues/2228
https://github.com/dotnet/runtime/issues/68180

我懷疑測試任務在錯誤的位置尋找運行時,這就是為什么如果使用 performMultiLevelLookup,它在默認安裝位置找不到任何和一些。 為什么只有當我之前構建到特定的輸出目錄時才會發生這種情況以及如何修復它,這讓我感到困惑。

我嘗試在整個管道運行的各個點輸出 DOTNET_ROOT 環境變量。 它由 UseDotNetTask 設置(到C:\agent\_work\_tool/dotnet )並且在測試任務之前或之后都沒有改變。 所以我猜,它要么是在測試任務期間臨時設置的,要么是由於正斜杠而被忽略或不起作用。 但是然后:為什么它適用於 dotnet 構建?

在我們在具有多個運行時的服務器上運行的管道中,在我們使用 .NET 核心之前,我們總是必須在頂部包含這樣的任務,如果它有任何不同,請嘗試一下:

steps:
- task: UseDotNet@2
  inputs:
    version: '6.0.x'

暫無
暫無

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

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