備忘録: .NET 5の開発環境をUbuntu 20.04にセットアップしてみた

なぜか.NETを使うことになったので 開発環境の構築をメモしておく。

今回はUbuntu 20.04なので、以下の流れで行った。

  1. aptで.NETのSDKをインストールする
  2. .NETのCLIを使ってリポジトリを初期化する
  3. VSCode拡張機能を入れる

インストールした.NETのバージョンは以下の通りである。

  • 5.0.400

aptで.NETのSDKをインストールする

下記のページを参考にインストールした。 この点で詰まることはなかった。

Ubuntu に .NET をインストールする - .NET | Microsoft Docs

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

.NETのCLIを使ってリポジトリを初期化する

前段のSDKのセットアップでCLIが使えるようになっているので 以下にコマンドを叩けばリポジトリの初期化ができた。

dotnet new console

ついでにNuGetで依存管理を行うようなので そちらの設定も追加しておく。以下のコマンドで設定が追加できる。

dotnet new nugetconfig

依存を追加するには以下のようなコマンドを使うようだ。 NuGetは単体でCLIが提供されていそうなのだが これは.NET側に統合されたインターフェースなのだろうか?便利だ。

dotnet add package <package> --version <version>

VSCode拡張機能を入れる

VSCode拡張機能を入れて開発しやすくしたいと思い以下のMicrosoftが出している拡張機能を追加した。

marketplace.visualstudio.com

インストール後にツールのダウンロードなどが走った記憶があるが定かではない。 ただ、初期状態のまま、何かを設定することなく、補完ができるようになり、すぐに開発が進められるようにはなった。 便利だ。

補完やシンタックスハイライトはもちろん、ジャンプ機能などもしっかり動き 保存時フォーマットなども設定を弄ることなく動作する。 特に設定に躓くことはなかった。

リポジトリ構成はデフォルトのままでファイル1枚しか弄ってないので困ることはなかったが この後どうなるかはわからない。 弄ることがあったらメモとして残しておきたい。

まとめ

初めて.NETを触ることになったが、linux上で動かしたい思いもあり、今回はUbuntu上に開発環境を構築した。 リポジトリを作って1枚のファイルにベタに書いているだけだが 特に躓くところはなかったので良かった。

運用面での不安は少しあるが、開発という意味では大きく問題はないかもしれない。 メモとして残しておく。

ビルド周りは調べてなかったが以下のページに載っているようだ。 あとで見るが、OSごとにランタイムが変わるのだろうか?.NET周りは初めてなので何もわからない。

docs.microsoft.com

Writing A Compiler In Goを読んだ

Writing A Compiler In Goを読んだ。 この本は、Go言語で作るインタプリタ の続編で 前作で作ったTree-walking インタプリタで動作するmonkeyという言語を コンパイルして、バイトコードを吐き出し、それをVM上で動かすようにする、というのが最終的な目標になる。 lexer, parserなどは前作で作ったものを用いることになる。

この本の中身については、他の人が書いた記事を見るとよく分かると思うので ここにリンクを貼っておく。この記事では、僕が読もうとしたきっかけなどを書こうと思う。

この本を読もうと思ったきっかけは、そもそも前作であるインタプリタの実装が興味深いものだったからである。 前作では、説明も実直に書かれており、テストを書いてから実装を作るという流れを一貫して行っていて読みやすい上に、 実装の過程で、小まめに動くようになったことについて、著者と喜びを分かち合えるような本になっている。

上記ブログでいくつか紹介されており、そのうち読みたいなぁと思っていたが 英語版しか出版されていないこともあり、手が遠のいていたが ちょっと手を動かして書いてみたいなと思って、この本を手を取ってみた。

この本も前作同様に、説明は細やかで、テストを書いてから実装を作るという流れは変わっていない。 また、この本では、コンパイラとそれが吐き出すバイトコードおよび、それを実行するVMの設計と実装を行っていくが レキサやパーサについては、前作で作ったものを流用するため、それには注意が必要である。(最終的なソースコードgithubとかで配布してたので、そこから拝借することはできるはず) タイトルにもあるとおり、Goですべてを書いていくため、コードが読みやすいのも嬉しい。

また、個人的な話として前作のインタプリタの発展で destructuringを少し実装していたので それもちょっと遊びで実装したが、面白かった。コードとしてはここに置いてある。

面白かったので記事として書いておいた。 興味があったら読んでみてほしい。

compilerbook.com

snapshot testingのライブラリを書いた #go

書いた。

github.com

なぜ書いたか

snapshot testingのライブラリを使ってライブラリを作ろうとしていたが
いまいち使い勝手が合わなかったので、機能を落としたものを作った。

試したのは以下の2つだが、goldieのほうが挙動としては近かったが
使い方には合わないかなと思って小さいライブラリを書いてみた。

使い方

以下のような形で、snapshotに追記できるようになっている。
これは、順序のあるデータを記録できるようにこうしている。
(が、Snapshotという関数は変な気もしてきたが気にしないことにする)

func TestSnapshot(t *testing.T) {
	s := New()
	_ = s.Snapshot("xxx")
	_ = s.Snapshot("xxx")
	_ = s.Snapshot("xxxy")
	s.Assert(t)
}

snapshotとしては以下のようなファイルが生成される。

xxx
xxx
xxxy

io.Writerのインターフェースも実装しておいた。

func TestCanUseAsIoWriter(t *testing.T) {
	s := New()
	b := bytes.NewBufferString("test")
	_, _ = io.Copy(s, b)
	s.Assert(t)
}