🧩

Mac + VSCode + .NET 5 SDK + C#拡張 で omnisharp がうまく動かない時のたったひとつのcoolな答え

2021/09/08に公開

TL;DR

  • VSCodeの設定ファイル(setting.json)に以下を記述
    • "omnisharp.useGlobalMono": "never",
  • dotnet コマンドのPATHを通してVSCodeを再起動しろ
  • 起動直後は omnisharp server が起動していてもインテリセンスや定義へ移動が効かないことがあるが、1行ほどコーディングすることで反応し始めたりするぞ

Mac+VSCode+.NET 5 SDK+C#拡張でomnisharpがうまく動かなくなることがある

VSCode のC#拡張機能は omnisharp というエコシステムにより言語解析が行われていますが、
突然 omnisharp server が起動しなくなって
インテリセンスや定義へ移動が効かないことが発生します。こうなってしまうとVSCodeもただのテキストエディタなのでやってられんわけですね。

まず設定を見直す

Note about using .NET 5 SDKs
The .NET 5 SDK requires version 16.8 of MSBuild.

For Windows users who have Visual Studio installed, this means you will need to be on the latest Visual Studio 16.8 Preview. For MacOS and Linux users who have Mono installed, this means you will need to set omnisharp.useGlobalMono to never until a version of Mono ships with MSBuild 16.8.

ここにも記述があるように、 2021/9/1 現在、 .NET 5 を使う時は
"omnisharp.useGlobalMono": "never", の設定が推奨のようです。
まずはそれを実施しましょう。

おそらく、ここまで実施したとしてもVSCodeのC#出力は
dotnet --info が通らないぞ」みたいなエラーを吐いていると思います。

dotnet コマンドのPATHを通してVSCodeを再起動

I had to manually add /usr/local/share/dotnet to PATH in my ~/.bash_profile.

ここに記述があるように、 .NET 5 SDK インストーラーがパスを通したりはしないことにより
VSCode が SDK を認識できていない可能性があるようです。
Stack Overflow のサイトにあるように、インストーラーを完了した時に表示されるインストール先のパスを使ってもいいですし、 which コマンドで dotnet の場所を探してもいいでしょう。

$ which dotnet              
/usr/local/share/dotnet/dotnet

dotnet コマンドの場所がわかったら、PATHを通します。
最新版のMacであればターミナルはzshなので .zshrc 辺りにPATHを通せばいいと思います。

.zshrc
export PATH=/usr/local/share/dotnet:$PATH
...

パスを通したらちゃんとパスが通っているか確認しておきましょう。

$ source .zshrc
$ echo $PATH
# /usr/local/share/dotnet が入っていればOK

ここまでできたら VSCode を再起動してみましょう。
無事 omnisharp が起動したのではないでしょうか。

起動直後は omnisharp server が起動していてもインテリセンスや定義へ移動が効かないことがある

VSCodeを起動し、omnisharpの起動が終わった後に
「定義へ移動」しようとしても

[warn]OmniSharp.Roslyn.CSharp.Services.Navigation.FindUsagesService
No document found

みたいな表示が出て「定義へ移動」できないことがあります。
原因は不明ですが、omnisharpがまだ寝ているようです。
1〜数行コーディングしてみて、インテリセンスを効かせたりしてみてください。
そのあとは機嫌よく「定義へ移動」もさせてくれますし var に型推論でどんな型が入ってきているのかの表示などもされるようになっていると思います。

今回は以上です。
他にも似たような状況に陥って解決方を見つけた人はコメントで情報もらえると嬉しいです。

Discussion