どうも。_fpです。
今回は Clojure の Leiningen 2.x で追加されたプロファイルについて調べました。
主に以下の公式ドキュメントからピックアップした内容になります。
動機
Clojure というと LISP の方言の一つということで、Leiningen を使って
lein repl
で REPL を起動してコーディングするケースがそこそこあると思います。
しかし、Clojureをインストールして上記のコマンドで起動しただけでは clojure-contrib や Clojars にあるモジュールが使えないのでちょっと不便です。
プロジェクトを作ってカレントディレクトリを移動してもいいのですが、プロファイルを使うことで頻繁に使うモジュールをまとめて登録しておくことができます。
profiles.cljにプロファイルを追加する
Leiningen ではプロファイルは profiles.clj か profiles.d 以下のファイルに記述します。 profiles.cljは以下のファイルです。
~/.lein/profiles.clj
公式ドキュメントには profiles.clj の例として以下が書かれています。
{:user {:plugins [[lein-pprint "1.1.1"]] :dependencies [[slamhound "1.3.1"]]}}
profiles.dには何を書けばいい?
Leiningen では profiles.clj に加えて、 ~/.lein/profiles.d 以下にプロファイルごとに個別ファイルを読み込むことができます。
例えば、scraperというプロファイルを作成する場合、以下のファイルを作成します。
例えば、scraperというプロファイルを作成する場合、以下のファイルを作成します。
~/.lein/profiles.d/scraper.clj
ファイルの内容は以下のように、プロファイル名を含まないマップを記述します。プロファイル名が入らないことに注意してください。
{:dependencies [[org.clojure/clojure "1.5.1"] [org.clojure/clojure-contrib "1.2.0"] [clj-http "0.7.2"] [enlive "1.1.1"]]}
profiles.cljとプロファイル名が重複しているとエラーになります。
プロファイルの使い方
上記の、scraperプロファイルでREPLを起動したい場合は、
lein with-profile scraper repl
で起動します。
ちなみに、with-profile を指定しない場合は :default プロファイルが使われるようです。
REPL で require するには?
さて、モジュールの指定はできましたが .clj ファイルであればネームスペース宣言の :require に相当するネームスペースの読み込みはどうすればいいでしょうか?
それには clojure.core の関数 require を使います。例えば、clj-http.clientを読み込むには以下を実行します。
(require '[clj-http.client :as client])
REPL からスクレイピングしてみる
あまりひねりのないネタではありますが、以下でWebサイトの文言を取得できます。(require '[clj-http.client :as client]) (require '[net.cgrand.enlive-html :as html]) (defn fetch-url [url] (html/html-resource (java.net.URL. url))) (map html/text (html/select (fetch-url "http://www.shanon.co.jp/") [:#siteDescription]))
Enlive セレクタのシンタックスはこちらに詳しく書かれているので、試してみると面白いと思います。
モジュールはどこに入る?
プロファイルに指定したモジュールは、REPLの起動時にMaven 2 のデフォルトである ~/.m2 に追加されます。
参考
- Profiles
https://github.com/technomancy/leiningen/blob/master/doc/PROFILES.md - Using clojure.contrib functions in slime REPL
http://stackoverflow.com/questions/2854618/using-clojure-contrib-functions-in-slime-repl - Leiningen: How to customize the location of the .m2 folder?
http://stackoverflow.com/questions/12579335/leiningen-how-to-customize-the-location-of-the-m2-folder