- Crystal 本体
- VSCode 拡張:Crystal Language
- 静的解析ツール:ameba
- VSCode 拡張:Auto Add Brackets in String Interpolation
- VSCode 拡張:Auto Comment Blocks
- 標準で入ってるツール
- REPL
- CI
- おまけ:Hello, world
- 次のステップ
- おわりに
- P.S.
Crystal 本体
Homebrew でインストールできる。
$ brew update $ brew install crystal
バージョンを確認してみる。
$ crystal --version Crystal 1.0.0 (2021-03-22) LLVM: 9.0.1 Default target: x86_64-apple-macosx
参考: Install On macOS - The Crystal Programming Language
VSCode 拡張:Crystal Language
以下のリンクからインストール。
設定(Cmd + , )から crystal で絞り込んで、以下の3つをチェック。(いずれも不安定な機能とのことだが、個人的にはあったほうが少し嬉しい)

なお、Language Server として crystalline と scry が開発されているが、現状ではどちらも不安定なので個人的にはあまりオススメしない。
参考: Home · crystal-lang-tools/vscode-crystal-lang Wiki · GitHub
静的解析ツール:ameba
Ruby における RuboCop のような静的解析ツール。
Homebrew でインストールできる。
$ brew tap veelenga/tap $ brew install ameba
プロジェクトルートで ameba を実行すれば静的解析を実行できる。

VSCode 拡張として crystal-ameba も用意されているので、インストールしておくと非常に便利。

VSCode 拡張:Auto Add Brackets in String Interpolation
Crystal は Ruby と同様に "Hello, #{name}" といったシンタックスで文字列インターポレーションが行えるが、以下の拡張を入れておくと # だけ入力すれば #{} になるので便利。
お好みで。
VSCode 拡張:Auto Comment Blocks
Crystal では # でコメントを記述できるが、以下の拡張を入れておくと Shift + Enter したときにコメント行を自動的に続けてくれるので、ドキュメンテーションコメントを記述する際に便利。
Settings.json に以下の設定を追加すれば Crystal でも動作するようになる。
{ "auto-comment-blocks.hashStyleBlocks": [ "crystal" ] }
お好みで。
標準で入ってるツール
Crystal 本体(と VSCode 拡張)をインストールしていれば以下が使える。
フォーマッター:crystal tool format
VSCode 上で Option + Shift + F でフォーマットできる。
保存時に自動的にフォーマットしたい場合は、VSCode の設定画面から以下をチェックしておく。

なお、コマンドラインから実行する場合は crystal tool format 。
$ crystal tool format Format ./src/assert-diff/expectations.cr ...
CI などで、きちんとフォーマット済みか確認したい場合は --check オプションを渡す。
$ crystal tool format --check formatting './src/assert-diff/expectations.cr' produced changes
テスト:crystal spec
RSpec ライクな記述ができる Spec が同梱されている。
プロジェクトルート上で crystal spec を実行すれば全テストが実行される。

なおテストの一覧を見たい場合には --verbose オプションを付けて実行すれば OK。

ドキュメント生成:crystal doc
プロジェクトルートで crystal doc を実行することで、標準 API ドキュメント と同じ形式の API ドキュメントが生成できる。
$ crystal doc $ open ./docs/index.html # ブラウザで開く

なお、crystal init でプロジェクトを生成した場合、docs は .gitignore で無視されているので、GitHub Pages で公開したい場合には外す。
# .gitignore # /docs/
ただ、そうすると VSCode 上で docs フォルダ内も検索対象になって面倒なので、.vscode/settings.json を以下の内容で作成しておくと無視されるようになる。
{ "search.exclude": { "docs": true, }, }
完全に認識させないようにするなら、代わりにfiles.exclude を利用すれば OK。(私はこちらを利用している)
パッケージマネージャ:shards
標準でパッケージマネージャとして shards が提供されている。
$ shards --help shards [<options>...] [<command>] ...
ここでは詳細については割愛。
Playground
crystal play でローカルサーバが立ち上がる。
$ crystal play Listening on http://127.0.0.1:8080

画面右側の値をクリックすることで、繰り返し実行された内容の確認もできる。

REPL
公式では REPL は提供されていないが、icr という REPL が開発されている。

入力された内容ごとにソース作成・コンパイル・実行をするという単純なものなので、基本的には Playground を使ったほうが便利かと思われる。
なお、REPL ではないが crystal eval で評価することはできる。
$ crystal eval 'puts Time.local' 2021-04-23 13:13:50 +09:00
CI
公式のドキュメント Continuous Integration - Crystal に詳しく書かれているが、GitHub Actions なら例えば。
on: pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - name: Download source uses: actions/checkout@v2 # Crystal 本体をインストール - name: Install Crystal uses: oprypin/install-crystal@v1 # 依存パッケージを解決 - name: Install shards run: shards install # フォーマット済みかチェック - name: Check formatting run: crystal tool format --check # テスト実行 - name: Run tests run: crystal spec
おまけ:Hello, world
crystal init でプロジェクトを作成できる。
$ crystal init app hello
create /Users/yusuke/Desktop/crystal-work/hello/.gitignore
create /Users/yusuke/Desktop/crystal-work/hello/.editorconfig
create /Users/yusuke/Desktop/crystal-work/hello/LICENSE
create /Users/yusuke/Desktop/crystal-work/hello/README.md
create /Users/yusuke/Desktop/crystal-work/hello/.travis.yml
create /Users/yusuke/Desktop/crystal-work/hello/shard.yml
create /Users/yusuke/Desktop/crystal-work/hello/src/hello.cr
create /Users/yusuke/Desktop/crystal-work/hello/spec/spec_helper.cr
create /Users/yusuke/Desktop/crystal-work/hello/spec/hello_spec.cr
Initialized empty Git repository in /Users/yusuke/Desktop/crystal-work/hello/.git/
VSCode で開く。
$ code hello
とりあえず初期コミットしておく。
$ git add -A $ git commit -m "init"
add メソッドの作成・テスト
src/hello.cr に add メソッドを作成してみる。

spec/hello_spec.cr を開き、既存のテストコードをコメントアウトした上でテストを作成する。(ここでは意図的に失敗するはずの値を入れている)

crystal spec で実行すると、10 を期待したのに結果は 2 だったと想定通りの失敗をした。

期待値を本来の 2 に変更して、再度 crystal spec して成功することを確認。

フォーマッタの確認
フォーマッタの確認として、とりあえずコードのフォーマットをめちゃくちゃにしてみる。

Option + Shift + F で元通り。

ameba の動作チェック
ルールに引っかかるように未使用変数 foo を追加してみると、ちゃんと検出される。

コマンドラインからも問題なし。

ドキュメント生成
試しにドキュメンテーションコメントを書いて、

crystal doc で生成してみる。
$ crystal doc
ブラウザで開くととりあえず生成されている。
$ open ./docs/index.html

Hello モジュールを開いてみると、ちゃんとドキュメンテーションコメントが反映されている。

次のステップ
公式ドキュメントが驚くほど丁寧に書かれているので参考にするとよい。
英語が苦手な人は、日本人の方が書かれた以下も参考になる。
メジャーなパッケージ・ツールについては awesome-crystal が参考になる。
もっと色んなものを探したくなったら、Crystal Shards なども。
おわりに
というわけで、これから Crystal を始めようかと思っている方向けに Mac / VSCode での開発環境構築の記事を書いてみました。
私も最近 Crystal を書き始めたばかりで、まだベストプラクティスの確立には至っていない段階ですが、何かの参考になれば幸いです。
実際に Crystal を使ってみた感想的なものについては以下の記事もよろしければ。
Written by @tobi462.
P.S.
Crystal はいいぞ。