leftovers...

about grails groovy

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互換のリポジトリ」で良いのです。

Mavenリポジトリってどうやんの?


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 さんです!