CLOVER🍀

That was when it all began.

Leiningenで、依存関係を管理する

インストールに続いて、Leiningenでモジュールの依存関係の管理をしたいと思います。今回も、Commons Langにスケープゴートになっていただきましょう。

というわけで、project.cljを修正します。

(defproject hello-lein "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [org.apache.commons/commons-lang3 "3.1"]]
  :main hello-lein.core)

:dependenciesキーワードに続くベクタに対して、依存関係を追加します。

Githubチュートリアルによると、ClojarsというところとMavenセントラルリポジトリが利用できるらしいです。

ところで、ClojarsにアクセスするとSSL証明書のエラーが出ましたけど、大丈夫…?
https://clojars.org/

では、ちょこっとプログラムを修正。

(ns hello-lein.core)

(import '(org.apache.commons.lang3 StringUtils))

(defn print-hello
  []
  (println (StringUtils/join '("Hello" "Leiningen!!") ", ")))

(defn -main
  "I don't do a whole lot."
  [& args]
  (print-hello))

実行。

$ lein run
Compiling hello-lein.core
Compilation succeeded.
Hello, Leiningen!!

動きましたねー。

サードパーティリポジトリを追加する場合は?:repositoriesキーワードで設定するらしいですが、サンプルを見てね!となっています…。
https://github.com/technomancy/leiningen/blob/preview/sample.project.clj

ここでも、Grapeの時と同じくSeasar2に出てきていただきましょう。

project.cljを修正。

(defproject hello-lein "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [org.apache.commons/commons-lang3 "3.1"]
                 [org.seasar.container/s2-framework "2.4.46"]]
  :main hello-lein.core
  :repositories {"The Seasar Foundation Maven2 Repository" "http://maven.seasar.org/maven2"})

ソースも修正。

(ns hello-lein.core)

(import '(org.apache.commons.lang3 StringUtils)
        '(org.seasar.framework.util StringUtil))

(defn print-hello
  []
  (println (StringUtils/join '("Hello" "Leiningen!!") ", "))
  (println (str "isEmpty? => " (StringUtil/isEmpty "Hello Leiningen!!"))))

(defn -main
  "I don't do a whole lot."
  [& args]
  (print-hello))

実行ー。

$ lein run
Could not find artifact org.seasar.container:s2-framework:pom:2.4.46 in central (http://repo1.maven.org/maven2)
Could not find artifact org.seasar.container:s2-framework:pom:2.4.46 in clojars (https://clojars.org/repo/)
Retrieving org/seasar/container/s2-framework/2.4.46/s2-framework-2.4.46.pom (5k)
    from http://maven.seasar.org/maven2/
Could not find artifact org.seasar.container:s2-container-project:pom:2.4.46 in central (http://repo1.maven.org/maven2)

 〜省略〜

Retrieving org/seasar/container/s2-framework/2.4.46/s2-framework-2.4.46.jar (660k)
    from http://maven.seasar.org/maven2/
Retrieving ognl/ognl/2.6.9-patch-20090427/ognl-2.6.9-patch-20090427.jar (163k)
    from http://maven.seasar.org/maven2/
Compiling hello-lein.core
Compilation succeeded.
Hello, Leiningen!!
isEmpty? => false

Mavenセントラルリポジトリ、Clojarsから取得できないことがわかった後は、追加したSeasar2リポジトリから取得に行っています。

簡単に追加するだけなら

  :repositories {"The Seasar Foundation Maven2 Repository" "http://maven.seasar.org/maven2"})

といった名前とURLのペアだけでよいみたいですが、もうちょっと詳細にいろいろ設定できるみたいです。こちらについては、Githubに載っているサンプルをご覧ください。

なお、内部ではMavenリポジトリ管理の仕組みを使用しているようで、ダウンロードしたファイルは「ユーザホームディレクトリ/.m2/repository」に配置されます。

そして、今度はREPLでも試してみましょう。ソースをもう少し修正。

(ns hello-lein.core)

(import '(org.apache.commons.lang3 StringUtils)
        '(org.seasar.framework.util StringUtil))

(defn print-hello
  []
  (println (StringUtils/join '("Hello" "Leiningen!!") ", "))
  (println (str "isEmpty? => " (StringUtil/isEmpty "Hello Leiningen!!"))))

(defn commons-join
  [& args]
  (StringUtils/join args ", "))

(defn s2-is-empty?
  [target]
  (StringUtil/isEmpty target))

(defn -main
  "I don't do a whole lot."
  [& args]
  (print-hello))

commons-join、s2-is-empty?という関数を定義しました。

「lein repl」でREPLを起動して、使ってみます。

$ lein repl
Compiling hello-lein.core
Compilation succeeded.
nREPL server started on port 41012
REPL-y 0.1.0-beta8
Clojure 1.4.0
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")

hello-lein.core=> (use '[hello-lein.core])
nil
hello-lein.core=> (commons-join "Hello" "World")
"Hello, World"
hello-lein.core=> (s2-is-empty? "Hello")
false
hello-lein.core=> (s2-is-empty? "")
true

依存関係が解決できた状態で使用できていますね。REPLで、作った関数をお手軽に試せるというところが素晴らしい。

これで、Clojureでも依存関係の定義ができるようになりましたー。長らく目を背けていた、Clojure Contribも使えるようになるはず…。