非常に残念ですが、.NET SDK更新でdotnet format
のバグに出会うことがあります。先日リリースされた.NET SDK 9.0.200もそうです。さくっと見てみましょう。
2025/2/27 追記
2025/2/27に修正PR #77354が作られて解消されました。
Visual Studio 2022 17.13と17.14のRoslynにもバックポートされるようです。.NET Coreのリリースポリシー的に3月第2火曜のパッチ更新(.NET SDK 9.0.201?)あたりで解消されそうですね。9.300はマイナーバージョン更新の機能バンドであり、リリースは四半期に一度=リリースサイクルと会わなさそうです。
2025/3/21 追記
.NET SDK 9.0.202がリリースされて修正が入りました。9.0.202で修正されたアップデート一覧はこちら
無事にdotnet format
が正常完了したことを確認しました。
.NET SDK 9.0.200でdotnet formatが失敗する
このエラーはIssueが立っているので、解決待ちです。
エラーの再現
GitHub Actionsでエラー状況が再現できています。
jobs: lint: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 - name: Prepare .NET uses: guitarrapc/actions/.github/actions/setup-dotnet@main with: dotnet-version: 9.0.x restore-wasm-workload: "true" - name: Dotnet Format run: dotnet format --verbosity diagnostic
エラーと状況的に、複数のファイルエンコーディングが使われているか、utf-8-comが利用されているとエラーが起こるようです。大変残念ですが、どのファイルが原因かエラーメッセージやスタックトレースからはわかりません。1
$ dotnet format (1/52) formatting csproj 'src/Api/Api.Shared/Api.Shared.csproj'. The dotnet runtime version is '9.0.2'. Using MSBuild.exe located in '/usr/share/dotnet/sdk/9.0.200/'. Formatting code files in workspace '/home/runner/work/csharp-lab/csharp-lab/src/Api/Api.Shared/Api.Shared.csproj'. Loading workspace. Determining projects to restore... Restored /home/runner/work/csharp-lab/csharp-lab/src/Api/Api.Shared/Api.Shared.csproj (in 1.59 sec). Project Api.Shared is using configuration from '/home/runner/work/csharp-lab/csharp-lab/.editorconfig'. Project Api.Shared is using configuration from '/home/runner/work/csharp-lab/csharp-lab/src/Api/Api.Shared/obj/Debug/net9.0/Api.Shared.GeneratedMSBuildEditorConfig.editorconfig'. Project Api.Shared is using configuration from '/usr/share/dotnet/sdk/9.0.200/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_9_default.globalconfig'. Complete in 4357ms. Determining formattable files. Complete in 258ms. Running formatters. Unhandled exception: System.Exception: source text did not have an identifiable encoding at Microsoft.CodeAnalysis.Tools.Formatters.CharsetFormatter.IsEncodingEquivalent(SourceText sourceText, Encoding encoding) at Microsoft.CodeAnalysis.Tools.Formatters.CharsetFormatter.<>c__DisplayClass10_0.<FormatFileAsync>b__0() at System.Threading.Tasks.Task`1.InnerInvoke() at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) --- End of stack trace from previous location --- at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread) --- End of stack trace from previous location --- at Microsoft.CodeAnalysis.Tools.Formatters.DocumentFormatter.GetFormattedSourceTextAsync(Document document, OptionSet optionSet, AnalyzerConfigOptions analyzerConfigOptions, FormatOptions formatOptions, ILogger logger, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.Tools.Formatters.DocumentFormatter.<>c__DisplayClass8_1.<<FormatFiles>b__0>d.MoveNext() --- End of stack trace from previous location --- at Microsoft.CodeAnalysis.Tools.Formatters.DocumentFormatter.ApplyFileChangesAsync(Solution solution, ImmutableArray`1 formattedDocuments, FormatOptions formatOptions, ILogger logger, List`1 formattedFiles, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.Tools.Formatters.DocumentFormatter.FormatAsync(Workspace workspace, Solution solution, ImmutableArray`1 formattableDocuments, FormatOptions formatOptions, ILogger logger, List`1 formattedFiles, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.Tools.CodeFormatter.RunCodeFormattersAsync(Workspace workspace, Solution solution, ImmutableArray`1 formattableDocuments, FormatOptions formatOptions, ILogger logger, List`1 formattedFiles, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.Tools.CodeFormatter.FormatWorkspaceAsync(FormatOptions formatOptions, ILogger logger, CancellationToken cancellationToken, String binaryLogPath) at Microsoft.CodeAnalysis.Tools.FormatCommandCommon.FormatAsync(FormatOptions formatOptions, ILogger`1 logger, CancellationToken cancellationToken) at Microsoft.CodeAnalysis.Tools.Commands.RootFormatCommand.FormatCommandDefaultHandler.InvokeAsync(ParseResult parseResult, CancellationToken cancellationToken) at System.CommandLine.Invocation.InvocationPipeline.InvokeAsync(ParseResult parseResult, CancellationToken cancellationToken)
ワークアラウンド
.NET SDK 9.0.103を利用しましょう。まぁ、.NET SDK 9.0.200が使えなくてもslnxを試せない程度なのでいったんは逃げましょう。
jobs: lint: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v4 - name: Prepare .NET uses: guitarrapc/actions/.github/actions/setup-dotnet@main with: dotnet-version: 9.0.103 restore-wasm-workload: "true" - name: Dotnet Format run: dotnet format --verbosity diagnostic
参考
-
--verbosity diag
でも原因のファイルが不明なので謎↩