Calvaを使ってClojureとCirclCIに入門してみた〜その1
ただやっても面白くないと思ったので、Calvaを使って取り組んでみたので、その感想をまとめます。
セットアップ
チュートリアルによるとclojureとleiningenとgitが必要だそうなので、それをセットアップしました。
といっても、どのツールも既に導入済みだったので、homebrewを使って最新化した程度の作業です。
作業に使う各ツールのバージョンは下記のとおりです。
Leiningen 2.9.0 on Java 11.0.2 OpenJDK 64-Bit Server VM
Clojure 1.10.0
git version 2.20.1
Calvaとは?
Clojure界隈でもCalvaを使ってClojureのコードを書いている人はそう多くないように感じるので少し補足をしておくと、VSCode向けに用意されたClojure向けの拡張機能です。 nREPLへの接続機能とか、自動的にテストを走らせてくれるテストランナーとかがいい具合にインテグレーションされていて、大変快適に使えます。
https://gyazo.com/af6f615e0d6d8bbcd9d77a9bcf8cf98b
▲Calvaでコードを書いているときの様子
以前はメインのエディタとしてEmacsを使っていたので、Emacs + CIDERな環境でClojureを書いていたのですが、新しい職場でEmacsのHEADが利用できなかった事から一念発起し、VSCodeへの乗り換えを行いました。
そんな経緯から、自宅のメインエディタもVSCodeに切り替え、Clojureを書くための環境もCalvaを活用しているという訳です。
フォーマッタ等、マンパワー不足で今ひとつな感じの機能や荒削りな機能もたくさんありますが、デフォルト設定でもそこそこClojureを楽しめるというのがミソな拡張機能だと思います。
そもそも利用者人口がそれほど多くないので、ネットを探しても設定に関する情報は公式情報ぐらいしか無く、Emacs + CIDERのときによくつまずいた、調べても古い情報ばかりで目的の設定にたどり着くまでに疲れちゃってClojureを書けないというのが無いのが気に入っています。
(そもそもできることの少ない拡張機能なので、設定でカバーしようという気にならないのもあるかもしれません。)
チュートリアルにそってプロジェクトを作る
そんな訳でClavaを引っさげて、チュートリアルに沿って作業を進めていきます。
個人的には、~/work/clojure下にclojure関連のプロジェクトを置いているので、以下このディレクトリを作業ディレクトリと読んで話を進めていきます。
作業ディレクトリに移動したら、チュートリアルの通りにlein new ...コマンドを実行します。
プロジェクトのディレクトリが作られたら、そのプロジェクトのディレクトリに移動してからlein duct setupすれば、leiningenが必要なお膳立てを済ませてくれます。
プロジェクトのディレクトリを開く
チュートリアルでは、このあとREPLを立ち上げる事になるわけですが、先の話を手軽に進めるために、ここで一度作成したプロジェクトのディレクトリをVSCodeで開いておくと良いでしょう。
なぜなら、ディレクトリを閉じて開き直すと、開いておいたターミナルが閉じちゃうからです。この辺、若干不便ですがワークスペースの考え方に則ればしょうがないのでしょう。
(VSCode用語ではディレクトリのことをフォルダと呼ぶのですが、ここは頑なにディレクトリに用語を統一して話を進めたいと思います。)
プロジェクトのディレクトリを開いたら、改めてTerminalを立ち上げます。
VSCodeは賢いので、プロジェクトのディレクトリをカレントディレクトリとしてTerminalを起動してくれます。素晴らしいですね。
ここから、チュートリアルに従って動きを見ていきます。
https://gyazo.com/16a52f976154414a32b7e0d65501ae51
▲VSCodeのターミナル窓。右上に窓を切り替えるドロップダウンと、新しいターミナルを開く+ボタンがある
動きを見る
そんな訳で、チュートリアルのとおりにlein replして動きを見ていきます。
(dev)が:loadedなのを確認して、(go)で開発サーバを立ち上げます。
ここで立ち上がったサーバのURLがTerminal上に表示されれば、リンクをクリックしてブラウザを開けるので手軽なんですが、そうなっていないようなので別途ブラウザ上でhttp://localhost:3000/に移動して確認しました。
エラーページとexampleページを確認したら、リクエストのハンドリングについての内容に目を通して次に進みます。
CircleCIを利用する
チュートリアルは、「CircleCIを利用して継続的インテグレーションをやっていこうぜ!」という内容につながります。
CircleCIの用意しているチュートリアルなので当然ですし、アプリケーションを作る早い段階からCIを考慮しておくことはとても重要なことだと思うので、可能なら指示に従ってCIの準備をすると良いんだと思います。
(実際、私もこのチュートリアルを進める中ではじめてアカウントを作りました。UIもわかりやすく、さくさくさくっとCIを始められるのでとても良いサービスだと思います)
https://gyazo.com/42f79b86c423749c18853260ea638102
▲今回のプロジェクトでCircleCIを使っているところ
けれども、GitHubの使い方がよくわからないとか、そもそもCIって何?という段階で取り組もうとして転んでしまっては元も子もないので、ここを無視してチュートリアルを進めるという手もあると思います。
CIにつまずいてClojure書くのが楽しくなくなるのは悲しいですから。
また、ここで指示されている一連のコマンドに対しては、一度replを終了させても良いですが、複数のターミナルを使い分けられるので、ターミナル右上の+アイコンから新しいターミナルを足して、そこでgit init等のコマンドを実行していくと良いと思います。
ちなみに、このポストを書いている時点ではCircleCIではlein2.9.0は利用できないらしく、ymlの記述を変えて試してみたらエラーになってしまいました。
コードを書いていく
チュートリアルに従って、もくもくとコードを書いていきます。
VSCodeとCalvaのサポートがあるおかげで、ある程度はサジェスト機能が働いて、十分に実用的なレベルでコードが書けると思います。
ひと通り書いたら、Terminalをrpelに戻してindexページの動きを確認します。
ターミナルを追加した+ボタンの左側に、ドロップダウンでターミナルがリストされているので、replを動かしっぱなしにしている所に戻ってコマンドを実行していくと良いでしょう。
ここで(dev)して(go)して確認…になる訳ですが、写経したコードにネームスペース間違えが多くて苦労しました。
(ductをdcutとtypoしてたとか、integrant.coreをintegrant.codeと打ち間違えていたとか)
今回はClojure 1.10.0を使っていた事もあってエラーメッセージが非常にわかりやすくなっており、おかしな所にすばやく気づくことができました。
(Flycheck的なものがあれば、書きながらおかしそうな所を指摘してくれたりするのかも知れませんけど)
順を追って取り組んでみましたが、多分ライブラリのバージョンが違ってしまったのか、使っている環境の違いか、config.ednがサンプルと違っていて記事通りに進めるとここでindexページにたどり着けずに積んでしまう可能性があると思います。
(私のGitHubリポジトリに苦悩の結果動いたものが置いてありますので参考にしてください)
だいぶハマったので今日はここまで。続きはまた明日以降にやります。