Clojure Leiningen その1

Clojureを書くにあたって、Leiningenを調べて、触って、みようと思いまして。

https://leiningen.org/

  • DeepL先生に和訳をお願いしたところ、ライニンゲンと出てきました。どういう意味なんだろう?読み方は合っているのか?
  • (Leiningenはちと長いんで、leinと呼ぼうと思います)
  • ちなみに、環境はこんな感じです。
vagrant@ubuntu2204:~$ lein --version
Leiningen 2.9.10 on Java 17.0.5 OpenJDK 64-Bit Server VM

もしあなたがJavaの世界から来たのなら、Leiningenは「MavenとAntを苦もなく結びつけたもの」だと考えることができるでしょう。RubyPythonの人たちにとっては、LeiningenはRubyGems/Bundler/Rakeとpip/Fabricを1つのツールにまとめたものです。 https://codeberg.org/leiningen/leiningen/src/branch/stable/doc/TUTORIAL.md

  • ざっと見、JavaでいうMaven、Gradleあたりの立ち位置なのがわかりますね。REPLはClojure独自の機能といったところ。maven形式のpomも生成できるのか。
  • lein関係ないですが、MavenCentralにあたるものがClojarsという場所らしいですね。
  • https://clojars.org/
  • leinが依存関係を解決する場合、ここを見に行くんでしょうきっと。

メタデータはプロジェクトのルート・ディレクトリにあるproject.cljというファイルに保存され、Leiningen に以下のようなことを伝えることができます。 https://codeberg.org/leiningen/leiningen/src/branch/stable/doc/TUTORIAL.md

  • Mavenのpom.xmlに該当するものが、project.cljのようですね。
  • lein new コマンドでプロジェクトを新規生成できるようです。引数は色々とありますが、テンプレートと名前はよく使いそうです。テンプレートはどのようなプロジェクトを作成するかを指定するもので、デフォルトはライブラリに適したものになるらしいです。
  • 呼び方はこんな感じ。

lein new $TEMPLATE_NAME $PROJECT_NAME

  • 作ってみます。引数が一つの場合には、テンプレート名ではなく、プロジェクト名とみなされるようです。
vagrant@ubuntu2204:~/source$ lein new temp
Generating a project called temp based on the 'default' template.
The default template is intended for library projects, not applications.
To see other templates (app, plugin, etc), try `lein help new`.
vagrant@ubuntu2204:~/source$ tree -F -a --dirsfirst temp
temp/
├── doc/
│   └── intro.md
├── resources/
├── src/
│   └── temp/
│       └── core.clj
├── test/
│   └── temp/
│       └── core_test.clj
├── CHANGELOG.md
├── .gitignore
├── .hgignore
├── LICENSE
├── project.clj
└── README.md
  • デフォルトのproject.cljです。
(defproject temp "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"}
  :dependencies [[org.clojure/clojure "1.11.1"]]
  :repl-options {:init-ns temp.core})