fc2ブログ

t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
leiningen のプラグインを作る。
Clojureのビルドツール Leiningen (ライニンジェン?)のプラグインの作り方をまとめてみました。(`・ω・´)9m

Leiningen は、Clojureで書かれたビルドツールでMavenのようなものです。
#といいつつ、自分はMavenを実務でちゃんと使ったことないですがっ・・・(・∀・;)


プラグインは、Leiningen にタスクを追加する仕組みです。
Leiningenのタスクは、leiningen.$TASK という名前空間に$TASKという名前で関数を定義するという命名ルールになっています。
この命名規則に従って関数を作成すれば、あとはクラスパスに追加するだけでLeiningenで使えるようになります。
簡単ですね!


では、さっそくmyplugin という名前で簡単なプラグインを作ってみましょう!(*´д`*)

てってけてけてけてってってーん。
てってけてけてけてってってーん。(三分クッキングのテーマで)

●leiningen で myplugin という新しいプロジェクトを作る

 C:\clojure>lein new myplugin
 Created new project in: C:\clojure\myplugin

 C:\clojure>cd myplugin


●プラグインの関数を定義する。

 命名規則に従って、leiningen.myplugin という名前空間に myplugin という関数を定義します。
 上記で作成したプロジェクトでは、myplugin フォルダの下に src\myplugin\core.clj というソースが用意されていますが、今回これは使わないので削除します。
 代わりに、src\leiningen\myplugin.clj というソースを用意しましょう。(中身は後で書きます)

●プラグインであることを示す。

 project.clj ファイルに、:eval-in-leiningen true を追加します。

 こんな感じです。

(defproject myplugin "1.0.0-SNAPSHOT"
:eval-in-leiningen true
:description "FIXME: write"
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]])


 この定義があると、Leiningen は実行時にプラグインと認識して、Leiningenのプロセスの中で実行してくれます。
 (通常は、サブプロセスを起動してその中で実行します)
 
 そのため、プラグインは Leiningenが読み込んでいる全てのプラグインを明示的に読み込まなくてもアクセスすることが出来ます。
 Clojure, Contrib に関しても同様です。(ただし、Leiningenが使っているバージョンのClojureにロックされるので注意が必要です)

●プラグインのコードを記述する。

 myplugin.clj に、myplugin という関数を定義します。今回は、メッセージを表示するだけの簡単な処理にします。

 (ns leiningen.myplugin)

 (defn myplugin[] (println "Hello myplugin!!"))


 なんと、最初のプラグインはこれで終了です。
 プラグインはさらに、ビルド中のプロジェクトの情報やコマンド引数を扱うことも出来ますが、その部分は後で記述します。
 まずは作ったプラグインを使ってみましょう!
 
●プラグインをインストールして使ってみる。

 別のプロジェクトを作って、今作ったmyplugin が使えることを確認してみましょう。

 まずは、プラグインを別のプロジェクトから参照できるように、ローカルマシンにインストールします。
 myplugin フォルダで "lein install" を実行します。

C:\clojure\myplugin>lein install
Copying 2 files to C:\clojure\myplugin\lib
Created C:\clojure\myplugin/myplugin-1.0.0-SNAPSHOT.jar
Wrote pom.xml
[INFO] Installing C:\clojure\myplugin\myplugin-1.0.0-SNAPSHOT.jar to C:\Users\t100\.m2\repository\myplugin\myplugin\1.0.
0-SNAPSHOT\myplugin-1.0.0-SNAPSHOT.jar


 こうすると、ローカルのMavenリポジトリ(通常は、$HOME\.m2\repository ディレクトリ?)にプロジェクトが発行されます。

 では、プラグインを使う別プロジェクトを用意しましょう。

 myplugin の一つ上のフォルダに移動して、"lein new myplugin-client" を実行します。

 C:\clojure>lein new myplugin-client
 Created new project in: C:\clojure\myplugin-client

 C:\clojure>cd myplugin-client 


 ここで、lein help を実行してみましょう。
 Leiningen で実行かのうなコマンド($TASK)一覧が表示されます。
 一覧に、myplugin はまだ無いと思います。

 では、project.clj で、myplugin を使うことを記述しましょう。
 開発環境でのみ使いたい機能なので、:dev-dependencies キーワードで追加します。

(defproject myplugin-client "1.0.0-SNAPSHOT"
:description "FIXME: write"
:dev-dependencies [[myplugin/myplugin "1.0.0-SNAPSHOT"]]
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]]) 


 lein deps コマンドを実行して、依存するライブラリを取得しなおします。

C:\clojure\myplugin-client>lein deps
Copying 2 files to C:\clojure\myplugin-client\lib
[INFO] snapshot myplugin:myplugin:1.0.0-SNAPSHOT: checking for updates from central
[INFO] snapshot myplugin:myplugin:1.0.0-SNAPSHOT: checking for updates from clojure
[INFO] snapshot myplugin:myplugin:1.0.0-SNAPSHOT: checking for updates from clojure-snapshots
[INFO] snapshot myplugin:myplugin:1.0.0-SNAPSHOT: checking for updates from clojars
Copying 3 files to C:\clojure\myplugin-client\lib\dev

 さて、もう一度 ”lein help" を実行してみましょう。
 今度は、myplugin が一覧に出ているはずです!わーい ∩(´・∀・`)∩

では、myplugin を呼び出してみましょう。コマンドは "lein myplugin" ですよ!(どきどき)

C:\clojure\myplugin-client>lein myplugin
Hello myplugin!!


きたわーヽ(゚∀゚)メ(゚∀゚)ノ

●プラグインを環境にインストールして使ってみる。

 実は、プラグインは、プロジェクト単位で使うか、ユーザー環境として使うか選択できます。
 単一のプロジェクトで使う場合は、先ほどのように project.clj ファイルに :dev-dependencies を追加して "lein deps" コマンドを実行すればOKです。
 頻繁に使うプラグインであれば、ローカル環境にインストールしておくこともできます。
 こうすれば毎回 :dev-dependencies を書かなくていいので楽ですよね。
 環境へのインストールは、"lein plugin install "を使います。

C:\clojure\myplugin-client>lein plugin install myplugin/myplugin 1.0.0-SNAPSHOT
Copying 2 files to C:\Users\t100\AppData\Local\Temp\lein-41a0e7e0-b98c-4d04-ad96-3ece3dd2bd83\lib
Including myplugin-1.0.0-SNAPSHOT.jar
Including clojure-1.2.0.jar
Including clojure-contrib-1.2.0.jar
Created myplugin-myplugin-1.0.0-SNAPSHOT.jar


 これで、Leiningen へのインストールは完了です。
 試しに、myplugin-client の一つ上のディレクトリに移動して、lein help を実行してみましょう。
 ここでも、myplugin が一覧に表示されてる!!ヽ(´―`)ノ

環境からアンインストールする場合は、"lein plugin uninstall "を使います。
やってみましょう。

C:\clojure>lein plugin uninstall myplugin/myplugin 1.0.0-SNAPSHOT
Failed to delete "C:\clojure\lein\plugins\myplugin-myplugin-1.0.0-SNAPSHOT.jar".



あれ?失敗した・・・。(・ω・)
・・・
・・・

と、とりあえず、プラグインのパスは分かったので C:\clojure\lein\plugins\myplugin-myplugin-1.0.0-SNAPSHOT.jar ファイルを手動で削除してみましょう・・・。

C:\clojure>del C:\clojure\lein\plugins\myplugin-myplugin-1.0.0-SNAPSHOT.jar



うまくアンインストールできましたね。(#^ω^)
もう一度、"lein help" を実行してみましょう。
myplugin が一覧から消えているはずです。


●プラグインからプロジェクトの情報や、コマンド引数にアクセスする。

プラグインは、関数の引数を使って、プロジェクトの情報やコマンド引数を受け取ることができます。
myplugin 関数で、それらの情報にアクセスしてみましょう。

myplugin.clj を編集して、下記のようにします。

(ns leiningen.myplugin)

(defn myplugin[project & args] (println (str "Hello myplugin!!" (:description project) args)))


myplugin 関数の引数に、project と、可変長引数として & args を追加しています。
project が、プロジェクト情報をもったMap で、args は、コマンド引数のリストになっています。
ここでは、project.clj に書かれた :description と コマンド引数を表示するように修正しました。

では、さっそく試してみましょう。

lein install で修正内容をローカルリポジトリに発行し、先ほどの myplugin-client プロジェクトディレクトリに移動しましょう。

C:\clojure\myplugin>lein install
Copying 2 files to C:\clojure\myplugin\lib
Created C:\clojure\myplugin/myplugin-1.0.0-SNAPSHOT.jar
Wrote pom.xml
[INFO] Installing C:\clojure\myplugin\myplugin-1.0.0-SNAPSHOT.jar to C:\Users\t100\.m2\repository\myplugin\myplugin\1.0.
0-SNAPSHOT\myplugin-1.0.0-SNAPSHOT.jar

C:\clojure\myplugin>cd ..\myplugin-client


lein deps コマンドで、依存ファイルを更新できます。

C:\clojure\myplugin-client>lein deps
Copying 2 files to C:\clojure\myplugin-client\lib
Copying 1 file to C:\clojure\myplugin-client\lib\dev


myplugin を実行する前に、myplugin-client の project.clj の description を変更しておきましょう。

(defproject myplugin-client "1.0.0-SNAPSHOT"
:description "FIXME: write myplugin-client !!"
:dev-dependencies [[myplugin/myplugin "1.0.0-SNAPSHOT"]]
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]])


では、、、" lein myplugin hoge" を実行してみましょう・・・

C:\clojure\myplugin-client>lein myplugin hoge
Hello myplugin!!FIXME: write myplugin-client !!("hoge")



できたー!

おしまいっ(*´д`*)


■External links

Leiningen Plugins 
Using Leiningen to build Clojure code 
Writing Leiningen Plugins 101 
Search for lein- 
leiningen - the clojure build tool 



プログラミングClojureプログラミングClojure
(2010/01/26)
Stuart Halloway

商品詳細を見る



日本人が誤解する英語 (知恵の森文庫)日本人が誤解する英語 (知恵の森文庫)
(2010/08/10)
マーク ピーターセン

商品詳細を見る


テーマ: プログラミング - ジャンル: コンピュータ













管理者にだけ表示を許可する


トラックバックURL: