前陣子將程式碼搬到 TFS Git,偶爾需要重抓原始碼編譯後部署。用 Visual Studio 2019 從 Git Clone ASP.NET MVC 專案,直接發佈(Publish)並複製到測試台 IIS,執行時有幾次冒出以下錯誤:

Server Error in '/MyWebApp' Application.
Could not find a part of the path 'D:\WWW\MyWebApp\bin\roslyn\csc.exe'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IO.DirectoryNotFoundException: Could not find a part of the path 'D:\WWW\MyWebApp\bin\roslyn\csc.exe'.

同樣的問題之前遇過,當時是因為 csproj 搬家後 Roslyn CodeDOM 參照路徑失效導致。確認專案 .csproj/.sln/packages 目錄結構未異動,檢查 packages 有 Microsoft.Net.Compilers 套件資料夾,其下 tools\csc.exe 存在,.csproj 內參數路徑也正確,

爬文找到不少相關討論:

建議解法有幾種:

  1. 重裝或升級 Microsoft.Net.Compilers NuGet 套件
  2. 移除 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 及 Microsoft.Net.Compilers NuGet 套件 (如果 .cshtml 及 Inline ASPX 不會用到 C# 6+ 語法的話)
  3. 手動在 csproj 補上 AfterBuild 事件
  4. 重新建置 (Rebuild) 一次

經過反覆測試,發現是 Visual Studio 2019 從 Git 抓回檔案的第一次 Publish 會缺 roslyn 目錄,重新 Publish 一次就會補上。期間也加測 Visual Studio 2017 也曾發生相同錯誤,但機率遠比 VS2019 低。

趁這次順便弄清楚一件事 - Visual Studio 2019 建立的 ASP.NET MVC 專案已不再參照 Microsoft.Net.Compiler,只剩下 Microsoft.CodeDom.Providers.DotNetCompilerPlatform,原因是 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 2.0+ 移除了對 Microsoft.Net.Compilers 的依賴, 自帶 roslyn 相關檔案。如將 VS2017 專案 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 升級到 2.0+ 時,請記得移除 Microsoft.Net.Compilers 減少版本干擾。 參考

Before 2.0.0 version, Microsoft.CodeDom.Providers.DotNetCompilerPlatform nupkg references Microsoft.Net.Compilers nupkg in order to deploy the Roslyn compiler assemblies unto you application folder. In version 2.0.0 version, the dependency is removed. Instead, Microsoft.CodeDom.Providers.DotNetCompilerPlatform nupkg includes all the Roslyn compiler assemblies under tools folder.

報告完畢。

The issue of missing roslyn/csc.exe in first ASP.NET MVC project publish after downloaded from Git.


Comments

Be the first to post a comment

Post a comment


63 + 0 =