DEV Community

kaede
kaede

Posted on • Edited on

Clojure Tutorial Part 5 -- leiningen でアプリの作成、実行、テストをする

参考

https://scrapbox.io/ayato-p/Part1_Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E3%81%98%E3%82%81%E3%81%AE%E4%B8%80%E6%AD%A9

ayato-p さんの Clojure で Node.js の Express の Hello World みたいなことをしている記事があり、シンプルで動かしやすそうだったので参考に自分でもやってみる。

https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md

technomancy/leiningen レポジトリの公式チュートリアルもある


REPL について

記事中などで触れられている REPL の定義については

clj コマンドをターミナルで打って Clojure の対話インターフェースが立ち上がっていれば REPL は動いている

REPL とは Read, Exe,Print, Loop の基本的な実行フローの概念でもある

と解釈した上で次に進める。


leiningen のインストール

Clojure の web アプリを作るためには leiningen が必要。

レイン インゲン?

Python における Django のような扱いだと推測する

Web フレームワークではなく、clojure のプロジェクト管理ツールらしい。

https://github.com/technomancy/leiningen/wiki/Packaging

arch -arm64 brew install leiningen ... ==> Installing dependencies for leiningen: openjdk ==> Installing leiningen dependency: openjdk ==> Pouring openjdk--18.0.1.1.arm64_monterey.bottle.tar.gz 🍺 /opt/homebrew/Cellar/openjdk/18.0.1.1: 642 files, 309MB ==> Installing leiningen ==> Pouring leiningen--2.9.8.all.bottle.tar.gz 
Enter fullscreen mode Exit fullscreen mode

brew でインストールできる

openjdk 18 に依存しているらしい。

lein --version Leiningen 2.9.8 on Java 18.0.1.1 OpenJDK 64-Bit Server VM 
Enter fullscreen mode Exit fullscreen mode

バージョンを確認してみると、2.9 が入っていて、Java 18 で動いているらしい

repl も使える


lein コマンドで cljblog アプリを作って Hello World する

lein new app cljblog Generating a project called cljblog based on the 'app' template. 
Enter fullscreen mode Exit fullscreen mode

lein new app {appName} でプロジェクトを作れる
CRA や DRF よりはるかに早い。

CHANGELOG.md LICENSE README.md doc project.clj resources src test 
Enter fullscreen mode Exit fullscreen mode

こういう構成になっている。
チェンジログが珍しい。


lein run で Hello World して中身を見る

lein run Hello, World! 
Enter fullscreen mode Exit fullscreen mode

初期構成で lein run すると Hello, World が出力される。

調べてみると、

src/cljblog/core.clj 
Enter fullscreen mode Exit fullscreen mode

のファイルに

(ns cljblog.core (:gen-class)) (defn -main "I don't do a whole lot ... yet." [& args] (println "Hello, World!")) 
Enter fullscreen mode Exit fullscreen mode

このファイルが Django でいう views.py だと仮定する

main のなかで println して 文字列が出力されている

文字列の部分を変更すると

lein run
core.clj's text changed

中身が変わる。

(defn -main (println "core.clj's text changed") ) 
Enter fullscreen mode Exit fullscreen mode

println の前の部分を消すと

Syntax error macroexpanding clojure.core/defn at (cljblog/core.clj:4:1). println - failed: 
Enter fullscreen mode Exit fullscreen mode

失敗する。


テストを動かす

https://cljdoc.org/d/leiningen/leiningen/2.9.8/doc/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB#%E3%83%86%E3%82%B9%E3%83%88

test/cljblog/core_test.clj 
Enter fullscreen mode Exit fullscreen mode

ここにサンプルのテストが書いてある。

(ns cljblog.core-test (:require [clojure.test :refer :all] [cljblog.core :refer :all])) (deftest a-test (testing "FIXME, I fail." (is (= 0 1)))) 
Enter fullscreen mode Exit fullscreen mode

core-test のライブラリを import して
0 = 1 という通らないテストを実行する

と言ったコードが書かれている。

lein test lein test cljblog.core-test lein test :only cljblog.core-test/a-test FAIL in (a-test) (core_test.clj:7) FIXME, I fail. expected: (= 0 1) actual: (not (= 0 1)) Ran 1 tests containing 1 assertions. 1 failures, 0 errors. Tests failed. 
Enter fullscreen mode Exit fullscreen mode

このファイルが lein test で実行され
表示され、当然失敗する。

ここから TDD を始めよう!


まとめ

clj で アプリ(プロジェクト?)を作るためには

brew で leiningen をインストールして

lein new app {appName} でアプリを作って 

lein run でアプリを実行できる

実行されるコードは src/projectName/core.clj に書かれている。

また、lein test でテストを実行できて

実行されるコードは test/projectName/core_test.clj に書かれている。

Top comments (0)