只有累積,沒有奇蹟

2019年3月28日 星期四

[UnitTest] ASP.NET Core 2.2 測試專案中的版本衝突

問題 
這幾天專案某項功能接近尾聲,要替其核心 ASP.NET Core 專案加上單元測試專案,加入後按下建置發現跳出 Error 錯誤訊息  "CS1705 Assembly 'xxxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' uses 'Microsoft.Extensions.Logging.Abstractions, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' which has a higher version than referenced assembly 'Microsoft.Extensions.Logging.Abstractions' with identity 'Microsoft.Extensions.Logging.Abstractions, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' "  加一個測試專案就造成參考 dll 版本不同,且測試專案並未加入任何參考類別庫就建置失敗怎麼想都不太對,這篇就針對此案例作簡單紀錄與分享若是有不清楚或是錯誤的地方歡迎討論予糾正

解決方法 
就自己過去經驗這類訊息是因為專案參考版本不同造成,但為了保險還是看一下案發現場錯誤訊息提到的 CS1705 ,提示訊息屬於編譯器錯誤,傳送門 
接著到專案與測試專案的參考進行比對,比對其 dll 的版本與新加入的測試專案 dll 版本號,經過地毯式的比對後發現其錯誤訊息提到的 dll 版號皆為相同並無異常,因此判定此推論不成立
接著,想到錯誤訊息提到 .NET Core 版本不同,因此開啟專案檢查兩個專案版本差異,檢查方式如下
專案按右鍵 > 屬性 > Application > Target Framework,經比對後兩者皆為 ASP.NET Core 2.2 版無誤,猜測再度失敗 !
快要走投無路的時候發現在微軟 github 也有許多人遇到類似的問題,討論傳送門如下
 Version conflicts in test project depending on a Microsoft.AspNetCore.App project #2253
而且在 ASP.NET Core 2.2 此問題似乎尚未解決 (狀態還沒 close),整理一下共通的症狀如下
  • 測試專案
  • 無法編譯的 dll 為 Mircosoft.AspNetCore、Mircosoft.Extension 
如果符合以上疑似症狀,嘗試了各種方法還是沒有辦法建置成功的話,請服用以下步驟
Step 1 : 專案按下右鍵,編輯專案檔 csproj
Step 2 : 在  itemGroup  區段加入下列代碼 (如果在不行可以指定版本)
  1. <PackageReference Include="Microsoft.AspNetCore.App" />
接著在重新將專案建置一次,就可以看到建置成功的畫面 (淚)
擦乾眼淚宣告懸案正式結案 !! 

心得
神奇的是只要建置成功過一次之後,就無法再還原發現場狀況,不指定 Mircosoft.AspNetCore.App 版號也可以正常建置成功 (嚇.jpg),不知道算不算是 .Core 2.2 的bug,如果是希望新版出來時可以修復此問題,不然光看錯誤訊息要修復可能真的不太容易。

參考
https://github.com/dotnet/sdk/issues/2253

Related Posts:

  • [CheatSheets] ASP.NET Memory Management 前言  在 ASP.NET 中記憶體管理一直是個很重要的議題,Pro.NET Memory Management 一書的作者為了讓開發者更容易了解其中這神祕的世界,製作了兩張關於 .NET Core 與 .NET GC 記憶體相關摘要的海報,看完覺得實用特記錄在部落格中,做為日後小抄使用 :) 海報內容僅是對於 static 與 dynamic 的兩個觀點作介紹,當然其中還是有很多細節與實作方式需要了解,如果更有興趣可以… Read More
  • [NETCore] ASP.NET Core Task block 檢測器 - Ben.BlockingDetector前言 微軟從 ASP.NET Framework 4.5 開始支援 async / await 語法,提供開發者在撰寫非同步作業時更輕鬆與容易上手,如果對於 async / await 不夠熟悉可以看黑暗大之前的好文 ASP.NET async 基本心法,但有時在一知半解寫出來的代碼有時殺傷力才會是最可怕的,如果沒有正確使用 async / await 會造成 Thread block 的問題發生,因此在撰寫&nbs… Read More
  • [.NETCore] ASP.NET Core - Logging 日誌初體驗 (二)前言 在上一篇文章介紹了在 ASP.Net Core 如何使用內建的 logging,以及 ILogger 與 ILoggerFactory 還有篩選記錄的方法,這篇再繼續介紹在 logging 中一些基本觀念與應用,如果有寫不清楚的地方可以搭配 MSDN 官網的 ASP.NET Core logging 一起服用,若有問題歡迎提出一起討論或是給予指導 LogLevel 紀錄 log 時候都會指定紀錄… Read More
  • [Free] ASP.NET Core eBook - ASP.NET Core 的兩三事前言 去年正式踏入 ASP.NET Core 的世界,在學習 .NET Core 的過程中自己也持續地將所學到相關知識記錄在這裡,除了希望可以加深對於 ASP.NET Core 的了解之外也希望能幫助自己健忘的金魚腦,另外也有個想法是累積到一定文章數量之後,可以將所學到的文章有系統與結構性整理出來成電子書,來幫助對 .NET Core 有興趣或是正在學習的的開發者朋友,經過一個月的努力之後於是誕生了 &nbs… Read More
  • [.NETCore] ASP.NET Core - Logging 日誌初體驗 (一)前言 在前一篇的文章裡介紹 ASP.Net Core 中如使用 NLog 將日誌紀錄於指定的位置檔案中,在ASP.Net Core 內建 logging framework ,專門負責記錄 log 與提供 API 與第三方紀錄套件像是 NLog、Log4Net 整合搭配使用,這篇文章是閱讀 MSDN 官網的 ASP.NET Core logging 後摘錄重點筆記,若有問題歡迎提出一起討論或是給予指導 使用 I… Read More

2 則留言:

  1. 感謝你, 我在 2.1 版也遇到了一樣的問題, 用大大的方法順利解決, 而且事後也無法重現

    回覆刪除

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com