Gradleプラグインを作成してみた

16
Gradle プラグインを 作成してみた 2015/1/15 @sakebook http://github.com/sakebook http://hatenablog.sakebook.com

Transcript of Gradleプラグインを作成してみた

Page 1: Gradleプラグインを作成してみた

Gradleプラグインを 作成してみた

2015/1/15 @sakebook

http://github.com/sakebook http://hatenablog.sakebook.com

Page 2: Gradleプラグインを作成してみた

自己紹介

酒本伸也 @sakebook

JX通信社(Vingow)

Android Developer & 初級ライフロガー

最近iOSも少し触る

Page 3: Gradleプラグインを作成してみた

Gradleプラグイン使ってますか

こんなの

apply plugin: ‘robolectric’

Page 4: Gradleプラグインを作成してみた

試しに作ってみた

android-versioning-gradle-plugin

versionNameとverisonCodeをタスクから操作する

$./gradlew major #1.2.3 -> 2.0.0 $/.gradlew minor #1.2.3 -> 1.3.0 $./gradlew patch #1.2.3 -> 1.2.4

Page 5: Gradleプラグインを作成してみた

導入

buildscript { repositories { mavenLocal() // リポジトリにあげるまでは必要 jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0' classpath 'com.github.sakebook:gradle-versioning:0.0.1' } }

builg.gradle

Page 6: Gradleプラグインを作成してみた

導入

apply plugin: ‘versioning'

MavenCentralにもあげてないし作成途中

要望募集!

${module}/build.gradle

Page 7: Gradleプラグインを作成してみた

動かせるようになるまでの共有

Page 8: Gradleプラグインを作成してみた

プロジェクト構成

- build.gradle // 公開に必要な情報を記入 | - gradle // Gradle本体 | - src | - main | - groovy // Groovyソースを配置 | - resource | - META-INF | - gradle-plugins | -**.properties // **にはapplyで呼び出したい名前

Page 9: Gradleプラグインを作成してみた

**.propertiesの中身

Plugin<Project>を実装したクラスを指定

implementation-class= com.sakebook.gradle.versioning.plugin.VersioningPlugin

class VersioningPlugin implements Plugin<Project> { }

versioning.properties

VersioningPlugin.groovy

Page 10: Gradleプラグインを作成してみた

classpath の定義

classpath ‘com.github.sakebook:gradle-versioning:0.0.1'

classpath ${group}:${archivesBaseName}:{version}

ここの設定がclasspathを決める

group = 'com.github.sakebook' archivesBaseName = 'gradle-versioning' version = '0.0.1'

builg.gradle

Page 11: Gradleプラグインを作成してみた

ローカルのMavenリポジトリにupload

uploadArchives { repositories { mavenDeployer { repository(url: 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath) } } }

builg.gradle

$./gradlew clean uploadArchives

Page 12: Gradleプラグインを作成してみた

Taskのアクション指定方法

@TaskAction アノテーションを使いTask実行時に行われるアクションを指定

class MajorTask extends VersioningTask {

@TaskAction def majorVersionUp() { readPropertyFile(BuildType.MAJOR) } }

MajorTask.groovy

Page 13: Gradleプラグインを作成してみた

DSL定義

versioning {} を定義

VersioningPlugin.groovyproject.extensions.create("versioning",

VersioningExtention.class)

Page 14: Gradleプラグインを作成してみた

class VersioningPlugin implements Plugin<Project> {

@Override void apply(Project project) {

def extention = project.extensions.create("versioning", VersioningExtention.class)

project.task('info') << { println "versionName: ${extention.versionName}" println "tagName: ${extention.tagName}" println "versionCode: ${extention.versionCode}" }

project.task("major", type: MajorTask) project.task("minor", type: MinorTask) project.task("patch", type: PatchTask) } }

VersioningPlugin.groovy

Page 15: Gradleプラグインを作成してみた

作成してみて

簡単なものなら別gradleファイルにして読み込む程度が良い粒度だと感じた。

Taskの依存関係やマルチプロジェクトをいじる際に力を発揮しそう

Groovyが書けるときっともっと楽しくなる。

Page 16: Gradleプラグインを作成してみた

参考コード

https://github.com/DeployGate/gradle-deploygate-plugin

https://github.com/robolectric/robolectric-gradle-plugin

https://github.com/mcxiaoke/gradle-packer-plugin

https://android.googlesource.com/platform/tools/base/+/gradle_1.0.0

https://github.com/sakebook/android-versioning-gradle-plugin

以上