tech.guitarrapc.cóm

Technical updates

.NET SDK 9.0.200でdotnet formatがsource text did not have an identifiable encodingで失敗する

非常に残念ですが、.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が正常完了したことを確認しました。

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

参考


  1. --verbosity diagでも原因のファイルが不明なので謎