Visual Studio Codeで.NET Core開発をする(Mac)

最近C#を触ることが増えてきたのですが、さすがに2013年モデルのMBPでParallels+Visual Studioではいろいろと(特にビルド時間)つらくなってきたので、小規模な個人プロジェクトはVisual Studio Codeでやってみようと思い、環境を整えてみました。その記録を残しておきます。

まず、基本的には公式の以下ページの通りで比較的簡単に開発を始められます。

code.visualstudio.com

.NET Core SDKのインストール

若干つまづいたのは.NET Core SDKをインストールしたあと、dotnetコマンドが使えなかった点でした。

$ dotnet
zsh: command not found: dotnet

/usr/local/share/dotnet/dotnetにバイナリは存在していたので、ひとまずシンボリックリンクを作ることにしました。

# dotnetコマンドの存在チェック
$ ls -al /usr/local/share/dotnet/dotnet
-rwxr-xr-x  1 root  wheel  105872  3 19 07:05 /usr/local/share/dotnet/dotnet

# シンボリックリンク作成
$ ln -s /usr/local/share/dotnet/dotnet /usr/local/bin/

関連するStackOverflowが以下のリンク先にありますが、執筆時点ではCatalinaが影響している可能性がありそうですね。

stackoverflow.com

コンソールアプリの作成

dotnetコマンドの準備もできたところでコンソールプロジェクトをさっそく作って、Visual Studio Codeで開きます。

# Consoleプロジェクト作成
$ dotnet new console

# Visual Studio Codeで開く
$ code .

すると、下図のように「いろいろC#用のアセットをインストールしますか?」って聞かれるので「YES」を選択します。

f:id:kenev:20200509094329p:plain:h200

完了しましたらターミナルで実行してみましょう。ビルド状況を少し可視化しておきたかったので-v n オプションをつけています。

$ dotnet run -v n

# ...割愛

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:01.63
Hello World!

いとも簡単に実行に成功してます。

ただ、いちいちターミナルから実行してたらDX(Developer Experience)が微妙なので、Visual Studio CodeのアクションでTasks: Run Taskを実行します。

f:id:kenev:20200509100028p:plain

そうすると、下図のようにwatch, build, publishが用意されています。この中身は.vscode/tasks.jsonでも確認することができます。

f:id:kenev:20200509100056p:plain

watchを実行することでプログラムがコンパイルされて実行されます。

f:id:kenev:20200509100209p:plain

そして、名前の通り変更を加えて保存すると自動で再コンパイルして実行もしてくれます。

下図は「Hello World!」を「Hello 世界!」に変えた実行結果。

f:id:kenev:20200509100231p:plain

この時点で手軽さにかなり感動しました!Macでもすぐに始められます(ただし、本格的なアプリを作るのはまだこれから)

デバッグ

それでは、デバッグはどんな感じなのか試してみます。ブレイクポイントはエディタの行番号の横をクリックすることで赤丸がついてくれます。

f:id:kenev:20200509225352p:plain

左のメニューから「Run」を選択し、.NET Core Launch(console)を実行します。

f:id:kenev:20200509225015p:plain:h200

しばらくすると普通にブレイクポイントで止まってくれます。Step In, Step Out, Step Overなど当たり前にできますし、変数の中身も問題なく変えられます。

Visual Studioを使っていると当たり前なのですが、まさかVisual Studio Codeでここまで普通にできるとは思っていなかったです。

f:id:kenev:20200509225723p:plain

おまけ

せっかくなので他の機能もチェックしてみました。

リファクタリング

定数を抽出してから、その定数の名前を変更するリファクタを試してみました。

文字列"Hello 世界!"を定数Valueに抽出するにはカーソルをあわせて豆電球をクリックするかoption+enterで選択肢が表示されるので、実行したい変更を選びます。

また、このときにValueという定数名が勝手につけられていて変えたいと思ったので、Valueにカーソルを合わせてF2をクリックし、定数名の変更を実行してみました。

f:id:kenev:20200509155656g:plain
定数抽出からの定数名変更

名前空間の追加とIntellisense

次に、不足している名前空間の追加もやってみました。例えばusing System;が無い状態で、Consoleと書いてみます。本来手動でusing System;と追記しなければいけないところ、上の例と同様でこのときに豆電球が表示されるので、クリックするかoption+enterを入力するとusing System;という選択肢が表示されます。これを選択すると、自動的にファイルの先頭にusing System;が追加されます。

さらに、Intellisenseもばっちりです。Console.と、ドットと入力した時点で、メソッドの候補がずらっと並びますし、入力するにつれて候補が絞られていきます。

f:id:kenev:20200509155745g:plain
名前空間追加&コード補完(Intellisense)

以上で、さくっとVisual Studio Codeで.NET Coreの開発を始めてみました。数年前の自分であればこんなにシンプルにC#での開発を始められるなんて(しかもMacで)想像もしていなかったです。

最近発表のあった、Codespacesが使えるようになったらさらに気軽にC#の開発ができるようになりそうなのでかなり楽しみですね。

github.com

これから本格的に個人プロジェクトもこれで作ってみようと思います。

まとめ

  • Visual Studio Codeで.NET Coreの開発環境を構築した
  • 特に複雑なインストール手順もなく、リファクタリングやIntellisenseなどの高機能が使える
  • .NET Coreの開発が一昔前よりかなりハードルが下がっていると感じた