エントリー
こんにちは同僚。 長い間、Habrには何も書きませんでした。 そこで、私はこの迷惑な誤解を修正することにしました。
少し前に仕事を変えました。現在取り組んでいるプロジェクトでは、Gradleを使用してビルドしています。 さらに、プロジェクトは非常に緩やかで複雑であり、その中のGradleスクリプトは非常に困難です。 だから私は少しグラドルを学ぶ必要があると決めました。 学習手順の1つとして、独自のプラグインを作成することにしました。 このプラグインは、私の親友Gennady hamsterksuによって作成されたすばらしいannotated-sqlライブラリ専用です 。 私はこのプロジェクトを個人プロジェクトで使用しているため、それらにアタッチして構成する便利な方法が必要です。 ライブラリは注釈プロセッサを使用するため、プラグインの目的は、これらのプロセッサとgradleアセンブリの友達を作ることです。
挑戦する
プラグインを開始する前に、まずプラグインから取得するものを決定しましょう。
ライブラリは、データベーススキーマを記述するためにコードで使用する注釈付きのjarと、コードにリンクしていないがコンパイル段階で使用されるプロセッサ付きのjarの2つの部分で構成されています。 プラグインは、これらのjarファイルの場所を決定する必要があります(理想的には、ダウンロードする必要がありますが、これは、Maven Centralでホストするために私たちの1人が到達した後です)。 その後、彼はプロセッサを使用するようにJavaコンパイルプロセスを構成する必要があります。
最初に、ライブラリを機能させるプラグインなしでスクリプトにどのような変更を加えるかを考えてみましょう。
構成
プロセッサをコードにリンクしたくないため、個別の依存関係構成を定義し、asqlaptと呼びます。
configurations { asqlapt }
構成します。
dependencies { asqlapt fileTree(dir: 'libs.apt', include: '*.jar') }
ここで、asqlaptの依存関係はプロジェクトのlibs.aptフォルダーにあると言います。
コンパイルの変更
次のステップは、コンパイラーに割り込んで、プロセッサーを指すようにすることです。 これを行うコードを見てみましょう。
android.applicationVariants.all { variant -> def aptOutput = file("$buildDir/source/apt_generated/$variant.dirName") variant.javaCompile.doFirst { aptOutput.mkdirs() variant.javaCompile.options.compilerArgs += [ '-processorpath', configurations.asqlapt.getAsPath(), '-processor', 'com.annotatedsql.processor.provider.ProviderProcessor,com.annotatedsql.processor.sql.SQLProcessor', '-s', aptOutput ] } }
そのため、Androidアプリケーションのアセンブリのバージョンごとに、次の手順を実行します。
- 生成されたクラスが収まるフォルダーを定義します。
- ビルドオプションごとにjavaCompileタスクがあります。 doFirstメソッドを使用して、このタスクに専念できます。 ここで、コンパイラーに引数を追加し、プロセッサーとプロセッサー自体へのパス、および結果を保存するフォルダーを指定します
原則として、必要なのはそれだけです。 しかし、これをプラグインとして設計したいのですよね?
プラグインの作成
ドキュメントに書かれているように、プラグインはルートプロジェクトのbuildSrcフォルダーに配置する必要があります。 このパパとbuild.gradleを次のコンテンツで作成します。
apply plugin: 'groovy' dependencies { compile gradleApi() compile localGroovy() }
src / main / resources / META-INF / gradle-plugins / annotatedsql.propertiesファイルでプラグインを次のように宣言します。
implementation-class=com.evilduck.annotatedsql.AnnotatedSqlPlugin
これでルーチンは終了し、コードが完成しました。 プラグインコードはGroovyで記述されています。
クラスを作成しましょう:
public class AnnotatedSqlPlugin implements Plugin<Project> { private Project project public void apply(Project project) { this.project = project } }
これは、プラグインのブランクがどのように見えるかです。 applyメソッドでアクションを実行し始めます。
最初に必要なことは、依存関係の構成を追加することです。
def setupDefaultAptConfigs() { project.configurations.create('apt').with { visible = false transitive = true description = 'The apt libraries to be used for annotated sql.' } project.configurations.create('annotatedsql').with { extendsFrom project.configurations.compile visible = false transitive = true description = 'The compile time libraries to be used for annotated sql.' } project.dependencies { apt project.fileTree(dir: "$project.projectDir/libs-apt", include: '*.jar') annotatedsql project.files("$project.projectDir/libs/sqlannotation-annotations.jar") } }
このメソッドは、aptとannotatedsqlの2つの構成を作成します。 1つ目はプロセッサ用、2つ目はAPI用です。 次に、これらの構成をデフォルト値で初期化します。
次のステップは、コンパイラーを構成することです。
def modifyJavaCompilerArguments() { project.android.applicationVariants.all { variant -> def aptOutput = project.file("$project.buildDir/source/$extension.aptOutputDir/$variant.dirName") variant.javaCompile.doFirst { aptOutput.mkdirs() variant.javaCompile.options.compilerArgs += [ '-processorpath', project.configurations.apt.getAsPath(), '-processor', 'com.annotatedsql.processor.provider.ProviderProcessor,com.annotatedsql.processor.sql.SQLProcessor', '-s', aptOutput ] } } }
新しいものもありません。 しかし、待って、拡張機能とは何ですか。 Gradleを使用すると、プラグインを作成する際の拡張機能であるオブジェクトを作成できます。 これらは、プラグイン構成を保存する単純なPOGOオブジェクトです。 私たちアンドロイド開発者に最も近い拡張子はアンドロイドです。 はい、これはアセンブリを構成するAndroidオブジェクトにすぎません。 拡張機能の発表方法を見てみましょう。
class AnnotatedSqlExtension { public String aptOutputDir }
そして、プラグインのapplyメソッドで:
extension = project.extensions.create("annotatedsql", AnnotatedSqlExtension) extension.with { aptOutputDir = "aptGenerated" }
拡張機能を初期化し、プロジェクトに添付します。
実際、ここにプラグイン全体があります。
完全なコード
public class AnnotatedSqlPlugin implements Plugin<Project> { private Project project private AnnotatedSqlExtension extension public void apply(Project project) { this.project = project project.apply plugin: 'android' extension = project.extensions.create("annotatedsql", AnnotatedSqlExtension) extension.with { aptOutputDir = "aptGenerated" } setupDefaultAptConfigs() modifyJavaCompilerArguments() } def setupDefaultAptConfigs() { project.configurations.create('apt').with { visible = false transitive = true description = 'The apt libraries to be used for annotated sql.' } project.configurations.create('annotatedsql').with { extendsFrom project.configurations.compile visible = false transitive = true description = 'The compile time libraries to be used for annotated sql.' } project.dependencies { apt project.fileTree(dir: "${project.projectDir}/libs-apt", include: '*.jar') annotatedsql project.files("${project.projectDir}/libs/sqlannotation-annotations.jar") } } def modifyJavaCompilerArguments() { project.android.applicationVariants.all { variant -> def aptOutput = project.file("$project.buildDir/source/$extension.aptOutputDir/$variant.dirName") variant.javaCompile.doFirst { aptOutput.mkdirs() variant.javaCompile.options.compilerArgs += [ '-processorpath', project.configurations.apt.getAsPath(), '-processor', 'com.annotatedsql.processor.provider.ProviderProcessor,com.annotatedsql.processor.sql.SQLProcessor', '-s', aptOutput ] } } } }
それでは、どのように使用するか見てみましょう。
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.6.+' } } apply plugin: 'android' apply plugin: 'annotatedsql' repositories { mavenCentral() } android { // } /* * , aptOutputDir */ //annotatedsql { // aptOutputDir = "customAptOutputDir" //} /* * , */ //dependencies { // apt project.fileTree(dir: "${project.projectDir}/libszzz-apt", include: '*.jar') // annotatedsql project.files("${project.projectDir}/libszzz/sqlannotation-annotations.jar") //}
ご覧のとおり、ライブラリを適切な場所に配置した場合、スクリプトに追加する必要があるのは、
apply plugin: 'annotatedsql'
すでに述べたように、理想的には、ライブラリjarを中央リポジトリに配置すると、それらを手動でプロジェクトに追加する必要が完全になくなります。 Gradleはそれらをダウンロードし、人里離れた場所に置きます。 残念ながら、リポジトリはありませんが、これはプラグインで制御できるものではありません。 ただし、ライブラリがリポジトリに読み込まれたと仮定すると、ローカルの依存関係をリモートのものに変更するだけで済みました。 次のようなもの:
project.dependencies { apt 'com.hamsterksu.asql:something-version' annotatedsql 'com.hamstersku.asql:something-else-version' }
この場合、行う必要があるのは、プロジェクトにプラグインを追加するだけです(プラグインは、Androidプラグインと同様にリポジトリに置くこともできます)。
apply plugin: 'annotatedsql'
完了
最後に、これがGradle機能の氷山の一角であると言いたいです。 それでも、これが誰かがGradle用のプラグインとGradle全般の作成を理解し始めるのに役立つことを願っています。 個人的には、発見すればするほど、このビルドシステムに夢中になります。
これで私はさよならを言うことを急ぐ。 ご清聴ありがとうございました!