Gradleプラグインを作成してみた
-
Upload
shinya-sakemoto -
Category
Engineering
-
view
956 -
download
7
Transcript of Gradleプラグインを作成してみた
Gradleプラグインを 作成してみた
2015/1/15 @sakebook
http://github.com/sakebook http://hatenablog.sakebook.com
自己紹介
酒本伸也 @sakebook
JX通信社(Vingow)
Android Developer & 初級ライフロガー
最近iOSも少し触る
Gradleプラグイン使ってますか
こんなの
apply plugin: ‘robolectric’
試しに作ってみた
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
導入
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
導入
apply plugin: ‘versioning'
MavenCentralにもあげてないし作成途中
要望募集!
${module}/build.gradle
動かせるようになるまでの共有
プロジェクト構成
- build.gradle // 公開に必要な情報を記入 | - gradle // Gradle本体 | - src | - main | - groovy // Groovyソースを配置 | - resource | - META-INF | - gradle-plugins | -**.properties // **にはapplyで呼び出したい名前
**.propertiesの中身
Plugin<Project>を実装したクラスを指定
implementation-class= com.sakebook.gradle.versioning.plugin.VersioningPlugin
class VersioningPlugin implements Plugin<Project> { }
versioning.properties
VersioningPlugin.groovy
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
ローカルのMavenリポジトリにupload
uploadArchives { repositories { mavenDeployer { repository(url: 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath) } } }
builg.gradle
$./gradlew clean uploadArchives
Taskのアクション指定方法
@TaskAction アノテーションを使いTask実行時に行われるアクションを指定
class MajorTask extends VersioningTask {
@TaskAction def majorVersionUp() { readPropertyFile(BuildType.MAJOR) } }
MajorTask.groovy
DSL定義
versioning {} を定義
VersioningPlugin.groovyproject.extensions.create("versioning",
VersioningExtention.class)
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
作成してみて
簡単なものなら別gradleファイルにして読み込む程度が良い粒度だと感じた。
Taskの依存関係やマルチプロジェクトをいじる際に力を発揮しそう
Groovyが書けるときっともっと楽しくなる。
参考コード
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
以上