Grailsプラグイン取り扱いの過去と現在。
G* Advent Calendar 2013 12/8 担当 @tyama です。
最近、Grailsの古いプレゼン資料とか、過去のブログにアクセスが多かったりとか、そんな古い資料をみると気になったので記事にしてみます。
Grailsをバリバリ使ってる人はきっと「そんなん知ってるよ。常識ぢゃん。」とかなる話です。まあ、そうは言わず最後まで読んで頂ければ。。
先ずは歴史!
Grailsプラグインは、さかのぼること7年程前2006年に実装されました(実際のリリースは0.4からで2007年初頭)。当初はinstall-pluginコマンドで、Grailsプラグインリポジトリ(※grailsプラグイン専用の形式を持つWeb DAVサーバで独自構築可能)からzipファイルをダウンロードして展開されプロジェクトにロードされる仕組みでした。
それから数年。いろいろ細かい話はすっとばして、Grailsでのライブラリ扱い方法にivyを使用した依存管理が実装されました。そして、その方法がブラッシュアップされBuildConfig.groovy(2009年頃 1.2系)を使用する仕組みが実装され、それにDSLでプラグインの指定ができるようになったのが、1.3系からです。
1.3系の頃はまだGrailsプラグインリポジトリから引っ張る仕組みを併用しつつ、その後プラグインの公式申請方法が変更されるのと同じ頃に、GrailsプラグインリポジトリはMavenに移行されました。
http://grails.1312388.n4.nabble.com/Grails-Plugins-amp-Maven-Repos-td1567596.html
- これも参考に。「Grails 1.3 M1リリースの日記」
http://d.hatena.ne.jp/mottsnite/20100311/1268261367
まあ、grailsを毎日使っている人であれば分かっていると思いますが、冒頭にも書いたように「古いプレゼン資料とか」を見た人はきっと:
grails install-plugin geb
こんな感じにプラグインをインストールすると思います。
これができるのは、ギリギリ2.1まで、2.2からはドキュメントにもあるように
http://grails.org/doc/2.2.x/ref/Command%20Line/install-plugin.html
DEPRECATED: The install-plugin command is deprecated Plugins should be installed by listing them in BuildConfig.groovy with the appropriate scope instead of using install-plugin.
意訳すると「使うな!BuildConfig.groovyに記述しろ!」です。
ちなみに、Grails2.3系で古き良き時代のプラグインインストール実行すると(※今は使えないぞ!)
% grails install-plugin http://your-plugin-site.jp/grails-plugins/some-module-1.3.3.zip | Warning Since Grails 2.3, it is no longer possible to install plugins directly via a URL. Upload the plugin to a Maven-compatible repository and declare the dependency in grails-app/conf/BuildConfig.groovy.
ちゃんと親切に教えてくれます。
意訳すると「プラグインはMaven互換のリポジトリに入れて、依存定義をgrails-app/conf/BuildConfig.groovyに記述してね」と。
まあ、なんやかんや書きましたが、まとめると。
「プラグインのインストールにinstall-pluginは使えないよ。BuildConfig.groovyに記述するのだよ。昔の記事にはだまされるな!」
ま、自分の記事も原因の1つですが。。。 http://d.hatena.ne.jp/mottsnite/20090723/1248325832
で、おさらい。BuildConfig.groovyのpluginsブロックに compile ':cache:1.1.1' のように記述!
grails.project.dependency.resolution = { ....省略.... plugins { // plugins for the build system only build ":tomcat:7.0.47" // plugins for the compile step compile ":scaffolding:2.0.1" compile ':cache:1.1.1' // plugins needed at runtime but not for compilation runtime ":hibernate:3.6.10.4" // or ":hibernate4:4.1.11.4" runtime ":database-migration:1.3.8" runtime ":jquery:1.10.2" runtime ":resources:1.2.1" } }
で、ここまでわかったからどうなんだ?って事で「オレオレプラグインリポジトリ」ってどうやんの?って話。
前述したようにリポジトリ自体は「プラグインはMaven互換のリポジトリ」で良いのです。
- (サーバ構築派向け) Artifactory OSS版 http://www.jfrog.com/home/v_artifactory_opensource_overview (※うちは最近これにしました。)
- (Githubでできんの?な人向け) 「github maven リポジトリ」でググると記事出てきます。
- (流行るの?新し物トライな人向け) jfrogさんの https://bintray.com/ を使う。
- (それほどでもーって人向け) scpとかでWebサーバで公開できるディレクトリにデプロイ
- (自分しか使わない人)ローカル(~/.m2)にぶっ込む
Grailsプラグインのデプロイ・ローカル(.m2)へのインストールってどうやんの?
プラグイン開発ではデプロイにmaven-publisherプラグインを使用します。新規プラグインを作成するとあらかじめ設定されています。
http://grails.org/plugin/maven-publisher
ドキュメントは https://github.com/grails-plugins/grails-maven-publisher-plugin のREADMEを読むと細かく書いてあります。
あと公式ドキュメントの http://grails.jp/doc/2.3.x/guide/conf.html#mavendeploy (日本語)にも細かく書いてあります。
簡単に説明すると。
自分のローカルにある"~/.m2"(ローカルキャッシュ)に入れるコマンド
grails maven-install
リモートリポジトリにデプロイ。
grails maven-deploy --repository=myRepo
認証設定
"~/.grails/settings.groovy"かBuildConfig.groovyに
grails.project.dependency.distribution = { remoteRepository(id:'myRepo',url:'http://あんたのMavenリポジトリサーバ.com/repository') { authentication username: "あんたのアカウント名", password: "あんたのパスワード" } //自分のマシンに仮リポジトリ作ってテストする用 remoteRepository(id:"myLocal", url:"file:///opt/repository/") } //デプロイ先のデフォルト指定 grails.project.repos.default="myLocal"
詳しくは、 http://grails.jp/doc/2.3.x/guide/conf.html#mavendeploy (日本語) を読みましょう!
あ、忘れてたけど、気付いてると思うけど。。。
自分のリポジトリをBuildConfig.groovyのrepositoriesブロック内に指定しないと、せっかく作った「オレオレプラグインリポジトリ」にデプロイしても、参照できません!
repositories { mavenRepo "http://あんたのMavenリポジトリサーバ.com/repository" }
認証が必要なリポジトリは、"~/.grails/settings.groovy"かBuildConfig.groovyに。
grails.project.dependency.authentication = { credentials { id = "あんたのMavenリポジトリサーバ.com/repository 又は idを指定している場合はID" username = "ユーザ名" password = "パスワード" } //複数記述する場合はcredentialsブロックを追記 credentials { .... .. } }
あと、
Grails2.3系からのバージョン指定の話。
- 基本は同じです。
- grails.project.dependency.resolver = "maven"を指定した場合(デフォルト)は、latest.releaseとか使えなくなったのでmavenの記法とupdatePolicy設定をすること。
例えばspring-security-coreの2.0-RC2以上を毎回最新取ってこいってときは
runtime ":spring-security-core:[2.0-RC2,)"
そのバージョンとそれ以上の"[2.0-RC2,)"を、指定して、毎回更新するようにリポジトリの指定にupdatePolicyを追記
repositories { myPluginCentral { updatePolicy "always" } }
おーっと、まだある。
プラグインのグループ指定は、デフォルトで'org.grails.plugins'になります。変更したい場合は、プラグインディスクリプタに"group"を指定。
class MyGreatGrailsPlugin { def group = "com.company.plugins"
あとがき。
ちょっと、書いた順番とか雑になりましたが、ちょっとしたプラグインのあれこれでした。
基本はドキュメントも読みましょう!何処読んで良いかとかわからんとか言われますが。。。
あれです。Grailsは下位互換も考えつつも、のっぴきならない事情で仕様変更とか、良い意味でいうとメジャーバージョンアップでは向上!?するので、今後2.4系やビルド廻りがGradleに変更される予定の3.0系になったら指定方法が変わることもあるとは思うので、過去の記事から情報を得たら、必ず最新のドキュメントも見ましょう!
過去にとらわれすぎて向上しないよりは良いことなので!
えっと、明日のG* Advent Calendar 2013は、 @tetsurokitahara さんです!