mike-neckのブログ

Java or Groovy or Swift or Golang

今更だけど、Gradleをちゃんと勉強しよう - Gradleのプロパティいろいろ

f:id:mike_neck:20150818084108g:plain

以前のエントリーでgradle.propertiesチートシート(中途半端)を書いたわけですが、Gradleのプロパティを作る方法はgradle.properties以外にもあって、そこらへんをまとめてみました。

gradle.propertiesで設定する

propertyName=some value

と記述するとpropertyNameというプロパティが利用できます。

参考

mike-neck.hatenadiary.com

コマンドラインからプロパティを設定する

gradle taskName -PpropertyName=propertyValueで設定できます。

コマンドラインからパラメーター渡せないの?って考えている人はこれを使えばよいのではないでしょうか。

また、gradle.propertiesに設定したプロパティを上書きしたい場合は-Dorg.gradle.project.propertyName=overrideValueを設定します。

環境変数から設定する

環境変数ORG_GRADLE_PROJECT_propertyNameに値を設定すると、propertyNameのプロパティが利用できます。

開発環境、テスト環境、デプロイ環境などで値を分けたい場合に利用するとよいでしょう。

Javaのパラメーターから設定する

起動パラメーターで-Dorg.gradle.project.propertyName=propertyValueで設定できます。

-Pにくらべて記述量が多いのがアレです。

System.propertiesにプロパティを設定する

gradle.propertiessysProp.で始まるプロパティを設定すると、System.properties['propertyName']でプロパティを取得できるようになります。


次のようなスクリプトとプロパティファイルを用意します。

gradle.properties

org.gradle.daemon=true
fromGradleProp=This is property from gradle.properties
systemProp.fromSystemProperties=This property is set to System properties
overrideProp=run gradle with parameter -Dorg.gradle.project.overrideProp, then this message will be chande.

build.gradle

task gradlePropertyConvention {
  doLast {
    println 'property [cmdProp] is from command line argument -PcmdProp'
    println (project.properties['cmdProp'] != null ?
            cmdProp :
            'command line argument -PcmdProp is not given.')
    println ''
    println 'property [fromGradleProp] is from gradle.properties'
    println fromGradleProp
    println ''
    println 'property [emvProperty] is from environment variable [ORG_GRADLE_PROJECT_emvProperty]'
    println (project.properties['emvProperty'] != null ?
            emvProperty :
            'no emvironment variable[ORG_GRADLE_PROJECT_emvProperty]')
    println ''
    println 'property [systemProp.fromSystemProperties] in gradle.properties is set to System properties'
    println System.properties['fromSystemProperties']
    println ''
    println 'properties in gradle.properties can be overriden with java parameter -Dorg.gradle.project.<property name>'
    println overrideProp
  }
}

まず、引数なしでこのタスクを実行してみます。

$ gradle graProCon
:gradlePropertyConvention
property [cmdProp] is from command line property argument -PcmdProp
command line argument -PcmdProp is not given.

property [fromGradleProp] is from gradle.properties
This is property from gradle.properties

property [emvProperty] is from environment[ORG_GRADLE_PROJECT_emvProperty]
no emvironment variable[ORG_GRADLE_PROJECT_emvProperty]

property [systemProp.fromSystemProperties] in gradle.properties is set to System properties
This property is set to System properties

properties in gradle.properties can be overriden with java parameter -Dorg.gradle.project.<property name>
run gradle with parameter -Dorg.gradle.project.overrideProp, then this message will be changed.

BUILD SUCCESSFUL

Total time: 0.985 secs

-PcmdProp=yeah!-Dorg.gradle.project.overrideProp=fooを与えて実行してみます。

$ gradle graProCon -PcmdProp=yeah! -Dorg.gradle.project.overrideProp=foo
property [cmdProp] is from command line property argument -PcmdProp
yeah!

property [fromGradleProp] is from gradle.properties
This is property from gradle.properties

property [emvProperty] is from environment[ORG_GRADLE_PROJECT_emvProperty]
wlyeeee

property [systemProp.fromSystemProperties] in gradle.properties is set to System properties
This property is set to System properties

properties in gradle.properties can be overriden with java parameter -Dorg.gradle.project.<property name>
foo

BUILD SUCCESSFUL

Total time: 1.02 secs

さらに環境変数ORG_GRADLE_PROJECT_emvPropertywlyeeeeと設定して実行してみます。

$ echo $ORG_GRADLE_PROJECT_emvProperty
wlyeeee
$ gradle graProCon -PcmdProp=yeah! -Dorg.gradle.project.overrideProp=foo
property [cmdProp] is from command line property argument -PcmdProp
yeah!

property [fromGradleProp] is from gradle.properties
This is property from gradle.properties

property [emvProperty] is from environment[ORG_GRADLE_PROJECT_emvProperty]
wlyeeee

property [systemProp.fromSystemProperties] in gradle.properties is set to System properties
This property is set to System properties

properties in gradle.properties can be overriden with java parameter -Dorg.gradle.project.<property name>
foo

BUILD SUCCESSFUL

Total time: 0.76 secs

コマンドライン引数および環境変数からプロパティを設定できることがこれらの例からわかるかと思います。


ちなみに、プロパティのnullチェックを行わずにスクリプトを書く場合、-Pでプロパティを渡さないと設定フェーズでGradleが失敗するので、デフォルト値をgradle.propertiesに設定しておくのがよいです。

amazon.co.jp