ページ

2015/12/16

Gradleで依存関係が含まれているかを判定する方法

|

Gradleのあるプロジェクトが、あるdependencyを直接持っているかどうかは以下で確認できる。

boolean hasDependency(Project project, String group, String module) {
    project.configurations.compile.incoming.resolutionResult.allComponents.any {
        it.group == group && it.name == module
    }
}

しかし、これだと推移的依存関係が判定できない。
つまり、「このプロジェクトにはライブラリAが含まれているか?」を判定したい場合に、「ライブラリAに依存しているライブラリB」を使用している場合は、上記の判定メソッドは false を返してしまう。
この推移的依存関係も判定するには次のようにする。

boolean hasDependency(Project project, String group, String module) {
    project.configurations.compile.incoming.resolutionResult.allComponents.findAll {
        it.getId() instanceof ModuleComponentIdentifier
    }.collect {
        it.getId() as ModuleComponentIdentifier
    }.any {
        it.group == group && it.module == module
    }
}

いずれの場合も、プロジェクトが評価された後でなければ動作しない。
つまり以下のようにafterEvaluateを使う必要がある。

afterEvaluate { Project project ->
    if (hasDependency(project, 'com.example', 'awesomelib')) {
        // 'com.example:awesomelib'が含まれていた場合の処理
    }
}

特に後者の”推移的依存関係が判定できる版”をGradleプラグインで使う場合、
Gradle TestKitでないと正しくテストできないので注意が必要。
普通のProjectBuilderを使ったテストでは
project.evaluate()などとしても正しい結果が得られない模様。

2015/12/16 23:36 追記

GradleプラグインのGroovyファイルでproject.evaluate()しても結果が得られなかったのは、

project.repositories {
    mavenCentral()
}

が入っていなかったからだった。
dependencyを解決できないはずだが、単にproject.evaluate()を呼ぶだけでは何も例外がスローされないらしい。

2015/12/11

IntelliJのインデックス対象から除外する方法

|

IntelliJ IDEAで開発していると、プロジェクト内のファイルが自動的にインデックスされて検索などに利用される。
この機能によって、何かのツールが生成したファイルやログファイルなど、スキャンしてほしくないファイルまでスキャンされ、しかもそれらが頻繁に変更されて何度もスキャンされるため非常に動作が重たくなってしまうことがある。

これを回避するには、build.gradleでideaプラグインを適用して除外してやればいい。

例えばVagrantを使っている場合は.vagrantディレクトリは無視すべきディレクトリなので以下のように書けばいい。

apply plugin: 'idea'

idea {
    module {
        excludeDirs += [
            file('.vagrant'),
        ]
    }
}

これで.vagrantディレクトリ以下のファイルはスキャンされなくなる。
(検索にもヒットしなくなるので注意)
.gitignoreに入れているものは上記のexclude設定も入れておく、という感じ。

Gradle実行時のメモリオプション指定方法

|

Gradleを実行する時のメモリを調整したい場合、いつでも
下記に説明されているようなorg.gradle.jvmargsを使えば良い
とつい最近まで思っていた。
https://docs.gradle.org/current/userguide/build_environment.html
しかしこのオプションが有効なのは、上記で説明されている通り
デーモンとして起動した場合だ。
デーモンとして起動しない場合は適用されないので注意。
だから、gradle.propertiesにorg.gradle.daemon=falseと書いておきながら
org.gradle.jvmargs=...とか書いていても意味がない。

デーモン起動でない場合にメモリなどのJVMパラメータを指定したい場合は
GRADLE_OPTS, JAVA_OPTSを使うといいらしい。
(これも上記ドキュメントで説明されているが)

先日、Travis CIでの実行時にのみメモリ調整が必要なケースがあり、上記の違いを理解した。
なおTravis CIならば、.travis.ymlに例えば

env:
  global:
  - GRADLE_OPTS="-Xmx1024m -Xms256m -XX:MaxPermSize=256m -XX:PermSize=256m"

とか書けばいい。

Spring BootのプロファイルにGitコミットハッシュ値を含める

|

今起動しているSpring Bootアプリはどのコミットでビルドされたものなのか?
を確認できるようにしたいと思い、やり方を探ってみた。

前提として、ビルドにはGradleを使う。
AndroidアプリなどでもGradleを使ってSHAハッシュ値を
アプリの中に含めたりしていたが、それと似たようなことをやる方法。

2015/12/06

AndroidのCIでbuild-toolsの新しいバージョンが見つからない場合の対処

|

久しぶりにAndroid-ObservableScrollViewのAndroid SDKのバージョンなどを
アップデートしたが、Travis CIでもwerckerでもビルドが失敗してしまった。

もちろんローカルでは成功している。

API Levelの問題などではなく、build-tools-23.0.2が見つからなかったというもの。

結論としては、toolsを先にアップデートすれば良い。

2015/12/01

AndroidのテストタスクだけGradleでログ出力する

|

久々のAndroid関連ネタ。
Android-ObservableScrollViewでは、なるべくカバレッジ100%になるようテストを書こうとしている。
しかしテストが増えてきたせいか、Travis CIでのテスト実行中に出力がない時間が10分以上続いてしまい、ビルドが失敗することが多くなってきた。
テスト系のタスクだけもう少しログ出力させられないか?
を解決する方法について紹介する。

まず、テスト系限定でなく、すべてのタスクに対して
INFOレベルでログ出力するのなら
Gradle的には以下のように–infoなどをつければいい。

./gradlew connectedCheck --info

しかしすべてのタスクがINFOレベルで出力されるのは
見づらくなるだけなので避けたい。

2015/11/26

Gradleで表記ゆれをチェックするプラグインgradle-spelling-plugin

|

GradleからCoffeeScript、LESS、Bowerを使うプラグインgradle-web-resource-plugin
に続き、Javaプロジェクトの開発で使えるGradleプラグイン gradle-spelling-plugin を作ったので紹介。

これで何ができるかというと、ブラックリストに単語、表現を登録して、それを探していくだけ。
見つけた場合は、代わりにこれを使ってね、と警告する。
見つけた場合にビルドエラーとするかどうかは設定できる。
それだけ、ではあるのだけれど、ちょうどいいものが見つからなかったので作った。

Gradleを使い出すと、Gradleですべてチェックできるようにしたいと考えるようになる(たぶん)。
そして自動化したいと考える。
だから、grepしたりIDEで検索すればいいものだったとしても
Gradleで使える形になっていることが大事。

↑