2013年4月28日日曜日

[grails]BuildConfig.groovyに指定可能なプロパティの動作を確認してみた

このエントリーをはてなブックマークに追加 はてなブックマーク - [grails]BuildConfig.groovyに指定可能なプロパティの動作を確認してみた
Bloggerへの移行前のWordpressにて2012-12-29に投稿した記事です。

仕事の一貫でGrailsの18.Deploymentを和訳する作業があったが、BuildConfig.groovyに記述できる3つのプロパティの説明がどうしても英文だけだと理解しづらい所があったため、それぞれ実際の挙動を確認したので、そのメモ。

検証する際の条件

2 Getting Startedにならい、Helloworldアプリケーションを作成。なお、以降では Helloworldアプリケーションが存在するディレクトリは$HELLO_WORLD_DIRとする。
$HELLO_WORLD_DIR/grails-app/conf/BuildConfig.groovyに各オプションを指定し、
grails war
コマンドを実行。warは作成後、解凍して中身を確認する。Grailsのバージョンは2.1.1

調査したプロパティ

18.Deploymentのドキュメントに記載例のあった以下の3つの挙動を確認。
  1. grails.war.dependencies
  2. grails.war.copyToWebApp
  3. grails.war.resources

1.grails.war.dependencies

1-1.プロパティの概要

warファイルに含めるライブラリ(jar)を指定出来る。

1-2.プロパティを指定しない場合の挙動

Grails自身が動作する為に必要なライブラリがwarファイル解凍後のWEB-INF/lib配下に配置されている。具体的にはHibernateSpringLog4jなどなど。

1-3.プロパティを指定した場合の挙動

BuildConfig.groovyに以下を追加。
    def deps = [ 
      "groovy-all-*.jar"
    ]   
  
    grails.war.dependencies = { 
        fileset(dir: "libs") {
           for (pattern in deps) {
              include(name: pattern)
           }   
        }   
    } 
また、上記の場合、$HELLO_WORLD_DIR/libsというディレクトリを作成し、「groovy-all-1.8.8.jar」を配置する。

上記設定後、コマンドを実行するとWARファイル解凍後のWEB-INF/lib配下にはgroovy-all-1.8.8.jarのみがある。

つまり、Grailsに必要なライブラリすらないので、tomcatなどに配置しても動かないと思われる。このオプションを使う場合、最低でもGrailsに必要なライブラリはdef depsで指定する必要がある。

このプロパティはGrailsに必要なデフォルトでインクルードされるライブラリとアプリケーション個別でインクルードしたいライブラリの競合を避けると原文にも書いてある為、このような挙動だと考えられる。

なお、原文ではGrailsに最低限必要なライブラリ郡は「$GRAILS_HOME/dependencies.txt」を見ると良いよって書いてあるが、ここに書いてあるものと本当にインクルードするjarのバージョンが違ったりするので、あまり当てにならない。。。(Grails2.2.0ではdependencies.txtは見当たらない。。)

2.grails.war.copyToWebApp

2-1.プロパティの概要

$HELLO_WORLD_DIR/web-app配下のどのファイルをwarに含めるかを指定する。

2-2.プロパティを指定しない場合の挙動

特に指定がない場合には$HELLO_WORLD_DIR/web-app配下のファイルは全てWARに含まれる。

Helloworldアプリケーションでwarファイルを作成した場合、以下のフォルダが存在する。
  • META-INF
  • WEB-INF
  • css
  • images
  • js
  • plugins
なお、仮にweb-app配下に独自で作成したディレクトリを配置した場合にはそのディレクトリもwarには含まれる。例えばweb-app配下にcontentディレクトリを配置した場合、作成されるwarにはcontentディレクトリも存在する。

2-3.プロパティを指定した場合の挙動

BuildConfig.groovyに以下を追加。
   grails.war.copyToWebApp = { args ->
       fileset(dir:"web-app") {
          include(name: "js/**")
          include(name: "WEB-INF/**")
       }     
    }
とした場合には以下のディレクトリが存在するようになる。
  • META-INF
  • WEB-INF
  • js
  • plugins
つまり、META-INF及びpluginsは特に指定を行わなくても必ずディレクトリが存在し、それ以外はcopyToWebAppで指定したファイルのみが含まれるような挙動となる。

使い方としては、例えば試験サーバーには試験用のコンテンツがweb-app配下に存在するがwar作成時には含めたくない、等の場合に利用すると便利だと思われる。

3.grails.war.resources

3-1.プロパティの概要

warファイル作成前に実施したい処理を記述出来る。例えば、開発時には必要ないファイルだが、商用の時には必要なファイルを配置する、など。

3-2.プロパティを指定しない場合の挙動

特に何もしない。概要をみれば、そりゃそうだ、という所である。

3-3.プロパティを指定した場合の挙動

BuildConfig.groovyに以下を追加。
    grails.war.resources = { warLocation ->
        copy(todir:"$warLocation/WEB-INF") {
                fileset(dir:"my/config/", includes:"*.xml")
        }          
    }
これでwarを作成すると$HELLO_WORLD_DIR/my/config/配下に配置した*.xmlという名称のファイルがWEB-INF/配下に配置されている。

0 件のコメント:

コメントを投稿