leftovers...

about grails groovy

Grails-1.0.*からGrails-1.1への〜 Pt.2 Grails起動部分をコードリーディングしてみた。

i18nが・・・・をぉぃなので。。ソースを探ってたら、BuildSettingsHolderとか、BuildSettingsなんてのを見つけたので、これを機会にGrailsコマンド起動の流れからをGrails-1.1コードリーディングをしてみる。
#但し、不完全に。。


Grailsコマンドの流れはこんな感じ(途中からBuildSettingsの流れに執着)

grailsコマンド実行

1. GRAILS_HOME/bin/grails
シェルスクリプト*1で、引数にGrailsScriptRunnerを指定したstartGrailsを呼出。
2. GRAILS_HOME/bin/startGrails
Grailsの起動スクリプト!ここでJavaやGroovyの環境設定や、クラスパスを設定して、GrailsStarter#main()を実行。
GrailsStarter#rootLoaderに引数が引き継がれ・・・・色々処理をして、なんやかんやで、GrailsRootLoaderからメインクラスである"GrailsScriptRunner#main()"を実行。

GrailsScriptRunner#main()

  • GRAILS_HOMEの設定を環境変数から取得
  • 環境情報等が設定される。ここで、BuildSettings。
BuildSettings build = new BuildSettings(new File(grailsHome));

BuildSettings.groovy

  • プロジェクトパスやコマンド実行時に変更可能なビルドの設定を記述するクラス。

ベースになるディレクトリbaseDirがセットされ、OS上のユーザーホームuserHomeがセットされ、GrailsのルートGRAILS_HOMEがgrailsHomeにセットされる。そして、GRAILS_HOME/build.properties(Antプロジェクトプロパティー)が読みこまれ、grailsVersionに起動中のGrailsのバージョンがセットされる。
次に、この辺で、Grailsプロジェクトのディレクトリ構造がestablishProjectStructure()で設定される。

grailsWorkDir 作業ディレクトリ WORK_DIR "${userHome}/.grails/${grailsVersion}"
projectWorkDir プロジェクト作業ディレクトリ PROJECT_WORK_DIR "$grailsWorkDir/projects/${baseDir.name}"
classesDir クラスディレクトリ PROJECT_CLASSES_DIR "$projectWorkDir/classes"
testClassesDir テストクラスディレクトリ PROJECT_TEST_CLASSES_DIR "$projectWorkDir/test-classes"
resourcesDir リソースディレクトリ PROJECT_RESOURCES_DIR "$projectWorkDir/resources"
projectPluginsDir プロジェクトディレクトリ PLUGINS_DIR "$projectWorkDir/plugins"
globalPluginsDir グローバルプラグインディレクトリ GLOBAL_PLUGINS_DIR "$grailsWorkDir/global-plugins"
testReportsDir テストレポートディレクトリ PROJECT_TEST_REPORTS_DIR "${baseDir}/test/reports"

あとは、ライブラリの依存関係等々が設定される。
ここで、BuildSettings最初の設定完了。

話はGrailsScriptRunner#main()にもどり...起動時のメッセージ処理をおこなって、最初に処理したBuildSettingsを引数にGrailsScriptRunnerコンストラクタを生成。

GrailsScriptRunner runner = new GrailsScriptRunner(build);

BuildSettingsは、GrailsScriptRunnerのprivateな、BuildSettings settings にセットされる。
ここで、やっと、コマンドスクリプトの実行へ

int exitCode = runner.executeCommand(script.name, script.args, script.env);

最初にRootLoaderの確認と設定とか、環境変数の設定とかおこなわれて、さらにBuildSettingsに情報をロードする。

settings.loadConfig() - "grails-app/conf/BuildConfig.groovy"を読みこんで、ConfigSlurperで、ConfigObjectを返す。

基本のパス情報等をバインドして、
"$USER_HOME/.grails/settings.groovy" を読みこんだ後に、"grails-app/conf/BuildConfig.groovy"が読みこまれる。
読みこまれた後、establishProjectStructure()で、プロジェクトのパス構造がBuildSettingsに再度設定される。

config.grails.default.plugin.setのインスタンスがListであれば、defaultPluginSetの設定を変更する。*2

loadConfig()処理が終了した後、dev,test,prod等の環境が設定される。

BuildSettingsHolderにBuildSettingsがセットされて、staticなBuildSettingsHolderにセットされる。

BuildSettingsHolder.setSettings(settings);

そしてコマンドのスクリプトがコールされる。(interactiveの時はinteractiveの処理へ)
callPluginOrGrailsScript(scriptName);

次回「GrailsScriptRunner#callPluginOrGrailsScript(String scriptName)」へ、つづく!

*1:Winはバッチ

*2:デフォルト値は、this.defaultPluginSet = ['hibernate']