S-JIS[2015-12-19/2016-04-12] 変更履歴

Asakusa Framework build.gradle

Asakusa FrameworkGradleプラグインで使用するbuild.gradleのメモ。


概要

AsakusaFWのGradleプラグインは独自のGradleタスクを用意している。
build.gradleにアプリケーションの定義を書く。


group

groupはAsakusaFW 0.8.0で記述するようになった。[2016-04-10]

group 'com.example'

これはDMDLから生成されるデータモデルクラス等のパッケージ名に使用される。


buildscript

buildscriptには、AsakusaFWのGradleプラグイン自体の定義が書かれている。

buildscript {
    repositories {
        maven { url 'http://asakusafw.s3.amazonaws.com/maven/releases' }
//      maven { url 'http://asakusafw.s3.amazonaws.com/maven/snapshots' }
    }
    dependencies {
〜
    }
}

ここに記述されているrepositoriesは、AsakusaFWのGradleプラグインのダウンロード元となるMavenリポジトリー。
(開発するAsakusaアプリケーションが利用するライブラリーをダウンロードする為のリポジトリーを指定したい場合は、repositoreisブロックを追加する必要がある)


AsakusaFW 0.7

buildscript {
〜
    dependencies {
        classpath group: 'com.asakusafw', name: 'asakusa-gradle-plugins', version: '0.7.6'
    }
}

ここに記述されているversionは「AsakusaFWのGradleプラグインのバージョン」であり、「開発するAsakusaアプリケーション(AsakusaFW)のバージョン」ではない。


AsakusaFW 0.8

Asakusa on Spark等を使う場合(AsakusaFW 0.8.0以降)は、dependenciesにasakusa-gradle-pluginsを書かなくてもよい。[2016-04-10]

buildscript {
〜
    dependencies {
        classpath group: 'com.asakusafw.spark', name: 'asakusa-spark-gradle', version: '0.3.0'
        classpath group: 'com.asakusafw.m3bp', name: 'asakusa-m3bp-gradle', version: '0.1.0'
    }
}

この場合、AsakusaFW本体のバージョンは自動的に判定される。


AsakusaFW 0.9

AsakusaFW 0.9.0で、ディストリビューション(のバージョン)を指定するようになった。[2016-12-10]

buildscript {
〜
    dependencies {
        classpath group: 'com.asakusafw.gradle', name: 'asakusa-distribution', version: '0.9.0'
    }
}

Asakusa on SparkAsakusa on M3BPには個別のバージョン(0.3.2や0.1.2等)が振られているが、組み合わせられるバージョンは決まっている。
ディストリビューションのバージョンを指定すれば、個々のコンポーネントは使用できるバージョンが自動的に選択される。


task wrapper

task wrapperは、Gradleラッパーの定義そのもの。(これによりgradlewコマンドが使えるようになる)

task wrapper(type: Wrapper) {
    distributionUrl 'http://services.gradle.org/distributions/gradle-2.8-bin.zip'
    jarFile file('.buildtools/gradlew.jar')
}

ここに記述されているバージョン(上記の例だと2.8)は、gradlewコマンドのバージョン。
Shafu(Eclipseプラグイン)ではこのバージョンは使われない。Eclipseの設定で別途指定する必要がある)


AsakusaFW 0.8.0以降はGradleラッパーの指定は内部で行われているようで、build.gradle上に出てこない。[2016-04-10]


apply plugin

applyは、Gradleのプラグインの定義。

AsakusaFW 0.7以前:

apply plugin: 'asakusafw'
apply plugin: 'asakusafw-organizer'
apply plugin: 'eclipse'

AsakusaFW 0.8.0以降:

apply plugin: 'asakusafw-sdk'
apply plugin: 'asakusafw-organizer'
apply plugin: 'asakusafw-mapreduce'
apply plugin: 'asakusafw-spark'
apply plugin: 'asakusafw-m3bp'
apply plugin: 'eclipse'
apply plugin: 'idea'

AsakusaFW 0.8.0以降は、「asakusafw」は「asakusafw-sdk」に改名された。[2016-04-10]
また、バッチアプリケーションの種類に応じたプラグイン(「asakusafw-mapreduce」「asakusafw-spark」等)を指定する。

それと、Eclipseだけでなく、InelliJ IDEAが使えるようになったらしい。


asakusafw

asakusafwは、Asakusaアプリケーションの定義。

AsakusaFW 0.7以前:

asakusafw {
    asakusafwVersion '0.7.6-hadoop1'

    modelgen {
        modelgenSourcePackage 'com.example.modelgen'
    }
    compiler {
        compiledSourcePackage 'com.example.batchapp'
    }
}

asakusafwVersionは、AsakusaFWのバージョン。
AsakusaFW 0.7系では、Hadoop1系とHadoop2系を指定するようになった。(従来は指定は特に無く、Hadoop1系が対象だった)
(Hadoop1系とHadoop2系を切り替える場合は、ここのバージョンの他に、dependenciesにあるhadoop-clientのバージョンも変える必要がある。マイグレーションガイド(およびデプロイメントガイド)を参照)

modelgenSourcePackageは、DMDLのコンパイルによって生成されるクラスのパッケージ名。
compiledSourcePackageは、Asakusaアプリケーションをコンパイルして生成されるクラスのパッケージ名。
これらのパッケージ名は自分のプロジェクトに合わせて変更する。


AsakusaFW 0.8.0以降:

AsakusaFW 0.8.0以降は、asakusafwVersionは明記しない。[2016-04-10]
buildscriptのdependenciesで指定されたプラグインによって自動的にAsakusaFWのバージョンが判別される為。

また、modelgenSourcePackageやcompiledSourcePackageも指定しなくてよくなった。
パッケージ名はgroupで指定する。


asakusafw.sdk

SDKプロパティーは、AsakusaFW 0.9.0で追加された。[2016-12-10]

AsakusaFW 0.9.0はディストリビューション方式になったので、buildscriptのdependenciesでディストリビューションのバージョンを指定すれば、主なコンポーネント(coreとかdmdlとか)は自動的に含まれる。
Asakusa on MapReduce/Spark/M3BPといったコンポーネントを入れたい場合はapply pluginを個別に指定するが、Direct I/OWindGateは自動的に含まれる。

WindGateを無効にしたい(依存ライブラリーから外したい)場合は、SDKプロパティーで指定する。

asakusafw {
    sdk {
        windgate false
    }
}

参考: Asakusa Gradle Plugin リファレンスの規約プロパティのSDKプロパティ


asakusafwOrganizer

AsakusaFW 0.6.0以降:

asakusafwOrganizer {
    asakusafwVersion asakusafw.asakusafwVersion
}

AsakusaFW 0.7.0以降:

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
    }
}

AsakusaFW 0.7.0でプロファイルという考え方が導入された。
これにより、環境(本番環境とステージング環境とか)に応じて設定を変えるのが容易になった。


独自ファイル追加(AsakusaFW 0.7.0以降)

gradlew assembleコマンドを実行することにより、デプロイメントアーカイブ(AsakusaFW 0.8までのデフォルトでは「asakusafw-0.7.6-hadoop1.tar.gz」といったファイル名)が生成される。
デプロイメントアーカイブを実行環境(Hadoopクラスター)に持っていって解凍することにより、Asakusaバッチを実行することが出来るようになる。

このデプロイメントアーカイブに、自分独自のファイル(設定ファイル等)を含めることが出来る。
src/distの下にディレクトリーやファイルを置き、profilesにそのディレクトリーを指定する。

例えば以下のようにsrc/dist/commonというディレクトリーを作ったとする。

このディレクトリーを含める為に、build.gradleのprofiles.prodに以下のような定義を追加する。

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
        }
    }
}

これでgradlew assembleコマンドを実行すると、生成されたデプロイメントアーカイブの中にはsrc/dist/commonにあったファイルが含まれる。


複数のディレクトリーを含めることも出来る。

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
            put 'src/dist/prod'
        }
    }
}

あるいは

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
        }
        assembly.into('.') {
            put 'src/dist/prod'
        }
    }
}

複数環境対応(AsakusaFW 0.7.0以降)

asakusafwOrganizerの中で指定している「profiles.prod」は、本番環境用のプロファイルを意味している。
この「prod」に当たる部分(プロファイル名)を変えることで、複数のプロファイル(複数の環境に対応したプロファイル)を作ることが出来る。
プロファイル名は自由に付けられるが、prodは本番環境、devは単体テストの実行環境(gradlew installAsakusafwコマンドで作成される)で使われるものとして予約されている。

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
            put 'src/dist/prod'
        }
    }
    profiles.stage {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
            put 'src/dist/stage'
        }
    }
}

これでgradlew assembleコマンドを実行すると、2つのデプロイメントアーカイブが作られる。
デフォルトでは、本番用(prod)は「asakusafw-0.7.6-hadoop1.tar.gz」、stageというプロファイルは「asakusafw-0.7.6-hadoop1-stage.tar.gz」といったファイル名になる。(ファイル名にプロファイル名が含まれるが、prodの時だけは省略される)


特定の環境のデプロイメントアーカイブのみを作りたい場合は、assembleの代わりに「assembleAsakusafw_プロファイル名」を使う。

全環境のデプロイメントアーカイブを生成する例
$ ./gradlew clean assemble
本番環境用のデプロイメントアーカイブを生成する例
$ ./gradlew clean mapreduceCompileBatchapps sparkCompileBatchapps assembleAsakusafw_prod
プロファイル名stageのデプロイメントアーカイブを生成する例
./gradlew clean mapreduceCompileBatchapps sparkCompileBatchapps assembleAsakusafw_stage

※assembleだとバッチのコンパイルも行われるが、「assembleAsakusafw_プロファイル名」はアーカイブを作るだけでコンパイルは実行されないので、compileBatchapp(AsakusaFW 0.8の場合はmapreduceCompileBatchapps)(Spark版バッチを作りたい場合はsparkCompileBatchapps)も一緒に指定する必要がある。


ファイル内容の置換(AsakusaFW 0.7.0以降)

src/distの下のファイルをデプロイメントアーカイブに含める際に、ファイルの内容を置換することが出来る。
置換する値はプロファイル毎に指定できるので、同じファイルに対して環境毎に値を変えることが出来ることになる。

置換したいファイルでは、置換したい箇所を@で囲んだ変数名(名前は自由に付けてよい)で指定する。
@で囲むのは、Antのcopyタスクがそうだったなw

src/dist/common/core/conf/asakusa-resources.xml:

〜
	<property>
		<name>com.asakusafw.directio.root.fs.path</name>
		<value>@directioRootFsPath@</value>
	</property>
</configuration>

そして、build.gradleのプロファイルのreplaceで具体的な値を指定する。

build.gradle:

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
            replace 'asakusa-resources.xml', directioRootFsPath: 'hdfs://hadoopCluster:8020/'
        }
    }
    profiles.stage {
        asakusafwVersion asakusafw.asakusafwVersion
        assembly.into('.') {
            put 'src/dist/common'
            replace 'asakusa-resources.xml', directioRootFsPath: 'hdfs://devCluster:8020/user/hishidama'
        }
    }
}

replaceには、置換対象となるファイル名置換する値を記述する。
ファイル名は「'*.properties'」の様にワイルドカードで指定することも出来る。

複数の変数を使う場合はreplaceを複数記述する。


デプロイメントアーカイブ名の変更(AsakusaFW 0.7.0以降)

AsakusaFW 0.8までは、デプロイメントアーカイブのデフォルトのファイル名は「asakusafw-バージョン-プロファイル名.tar.gz」(本番環境用prodの場合はプロファイル名は省略される)だった。
AsakusaFW 0.9.0で、デフォルトのアーカイブファイル名は「プロジェクト名.tar.gz」になった。[2016-12-10]

デプロイメントアーカイブのファイル名は以下のようにarchiveNameで指定することが出来る。

asakusafwOrganizer {
    profiles.prod {
        asakusafwVersion asakusafw.asakusafwVersion
        archiveName "${project.name}.tar.gz"
    }
}

dependencies

dependenciesは、アプリケーションが依存するライブラリーを指定する。

dependencies {
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-core', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-directio', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-windgate', version: asakusafw.asakusafwVersion

    provided (group: 'org.apache.hadoop', name: 'hadoop-client', version: '1.2.1') {
        exclude module: 'junit'
        exclude module: 'mockito-all'
        exclude module: 'slf4j-log4j12'
    }
}

AsakusaFW 0.8以前では、デフォルトではasakusa-sdkのcoreやdirectioといったライブラリーが指定されている。
AsakusaFW 0.9では基本的なライブラリーは自動的に入るようになったので、デフォルトではbuild.gradleにdependenciesは存在しない。[2016-12-10]


例えばAsakusaFW 0.8以前でスモールジョブ実行エンジンを使って単体テストを行う場合、以下のようにasakusa-sdk-test-emulationを追加する。

dependencies {
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-core', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-directio', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-windgate', version: asakusafw.asakusafwVersion
    testRuntime group: 'com.asakusafw.sdk', name: 'asakusa-sdk-test-emulation', version: asakusafw.asakusafwVersion
〜
}

その他、AsakusaFWのデフォルトのMavenリポジトリー以外の場所にあるライブラリーを使いたい場合は、 repositoriesを追加してMavenリポジトリーを指定する。
buildscriptブロック内にあるrepositoriesはGradleプラグインの為の指定であり、そこにリポジトリーを追加してもAsakusaアプリケーション本体では使われない)

repositories {
    maven { url 'http://hishidama.github.io/mvnrepository' }
}

dependencies {
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-core', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-directio', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sdk', name: 'asakusa-sdk-windgate', version: asakusafw.asakusafwVersion
    compile group: 'com.asakusafw.sandbox', name: 'asakusa-directio-dmdl-ext', version: asakusafw.asakusafwVersion
    compile group: 'jp.hishidama.asakusafw', name: 'asakusafw-spi', version: '0.+'

    testRuntime group: 'com.asakusafw.sdk', name: 'asakusa-sdk-test-emulation', version: asakusafw.asakusafwVersion
    testRuntime group: 'jp.hishidama.asakusafw', name: 'asakusafw-tester', version: '0.+'
〜
}

Gradleプラグインへ戻る / AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま