mike-neckのブログ

Java or Groovy or Swift or Golang

Gradle3.0で一部が激しく変更されるっぽい感じが漂う件

gradleは単なるタスク実行基盤ツールですが、僕が3~4年前に人から「gradleなんてクッソマイナーで型もないgroovy(偏見)のツールなんて誰が使うか」と言われてた頃から比べると、Androidでの採用もあり、かなり普及した感があります。

さて、そんなだいぶ馴染んできたgradleですが、gradle3.0のデザインドキュメントを読んでいると、Javaだけのプロジェクトならそれほど変わらないかもしれないのですが、nativeと一緒のプロジェクトにおいては激しく変更される(より親密になる)ような感じがあります。


Gradle2.4で新しい(というかバイナリービルドでは使われていた)機能のドキュメントにその変更について若干見え隠れしています。これは以前書いたエントリーを参照下さい。

mike-neck.hatenadiary.com

【補足】なお、この記事は5月に書いたものですが、すでにいくつかのAPIが非推奨(`@Deprecated`)になっています。 * `CollectionBuilder`は非推奨になり`ModelSet`を代わりに使うようにすること

先ほどの記事自体を書いた時にドキュメントを読んでいたわけですが、そこに次のような文が書かれています。

This chapter describes and documents what is essentially the foundation for the Gradle 3.0 and the next generation of Gradle builds. It is being incrementally developed during the Gradle 2.x stream and is in use for Gradle's support for building native binaries.

Rule based model configuration

意訳すると…

この章ではGradle3.0(次世代のGradle)の基礎になることが述べらている。この部分はGradle2.Xの間に少しずつ開発され、ネイティブサポートでは実際に使われていく


少し気にしてはいたのですが、今日Gradle Forumを眺めていて、ふとバイナリービルドの方法が気になってgoogleで検索などしていたら、Gradle3.0のデザインドキュメントを発見しました。

github.com

斜め読みしていると、

  • Java5(使ってる人いるの?!)はサポートしない
  • Gradle1.0の前にあったDSLはなくす
  • AntベースのScalaビルドはやめる
  • Copyタスク(JarWarも含む)を結構変える
  • 依存性グラフを変更する
  • DSLAPIで引数がStringObjectになってるメソッドオーバーロードしているやつは変える
    • task.dependsOnとか変わるっぽい
    • ファイルを指定する場合はこれまでは from file('dirName/fileName.txt')だったのがfrom 'dirName/fileName.txt'になるっぽい(参照 DSL enhancement - implicit Type Coercion)
    • ClosureActionを引数にとるやつも変える(まあ、多分Closure記法のままでよいので見た目は変わらない)
  • TaskleftShiftOperator(<<)やめる
    • task myTask << {println 'this is myTask'}とかできなくなると思われる(task.doLast使えということっぽい)
  • サブプロジェクトは親プロジェクトを継承しなくなる(サブプロジェクトでMissingPropertyが発生した場合は親プロジェクトのpropertyを探しに行ってた)

と、まあこんな感じで、「ん?特に劇的変更じゃなくね?」と思われるかもしれないのですけど、新しいjavaプラグインを使った場合のビルドスクリプトを読むと、かなり変わっていることがわかります。

github.com

参考になるドキュメントは、このあたり…

github.com


以上、未だにスクリプトを書くときにDSLドキュメントを読むようなgradleちからのない僕が雑に斜め読みしただけなので、実際はタイトルにあるほど激しく変更されるわけではないかもしれません:-p

全体的にはRule Based Model Configurationがベースになるような感じで、nativeとJava双方の親和性が高くなる感じがします。

なので、この恩恵を一番受けるのは、多分Androidを開発していて、nativeとJavaの両方を使っている人かなという気もします。

心に余裕ができたらデザインドキュメントを翻訳してみるかもしれませんが、精神障害者の僕にこころの余裕などあるわけがなく…(´・ω・`)