lazybones templateをカスタマイズしてみる

この記事は、G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2015 Advent Calendar 2015 - Qiita の 21 日目の記事です。



lazybones template 事始め

実際 lazybonesは、気軽にプロジェクトを作れるのでみたいな話はあるけど*1
カスタマイズして見るみたいな話はあまり出てこないので、公式のチュートリアルを触ってみた辺りのメモなど

日本だと下記の記事ぐらいかな。。

0)チュートリアルで作られる gradllew warperが凄く古い
> lazybones create lazybones-project my-lzb-templates

  • gradle-2.9.zip辺りに指定を変更してから実行しましょう
  • そのまま動かすとローカルキャッシュがガンガン貯まるよな・・*2 *3
  • warper/gradle-warper.properties
#distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
distributionUrl=file\:/opt/gradle-2.9-bin.zip

1)写経していてまず躓くのが
> touch src/main/java/.retain
な記載。

> mkdir -p src/main/java/
> touch src/main/java/.retain
と読み替えないとダメでは?とか思ってしまったりも(苦笑

2)このチュートリアル
> gradlew installTemplate<テンプレート名>
or
> gradlew installAllTemplates

でローカルのレポジトリに installされたものは

- $HOME/.lazybone/template
--  <テンプレート名>.zip

な感じで template/<テンプレート名>.zip配置されますが

lazybones 自体は通常のテンプレートはNWアクセス前提のため
lazybones list ではローカルにインストールされる物は表示されない

> lazybones list --cached
でのみ表示される *4

しかも ローカルのみにインストールされたプロジェクトは

  • NG)lazybones create grooid-new-project hoge
  • OK)lazybones create grooid-new-project 1.1.5 hoge

な感じで バージョン指定も必要で ちょっと面倒。

でローカルでも手軽にとして記載されている方法が

  • $HOME/.lazybones/config.groovy で
  • $HOME/.lazybones/config.groovy の通常の書き方
bintrayRepositories = [
    "marioggar/grooid-templates",
    "pledbrook/lazybones-templates" //公式テンプレート
]

ただこの上記の書き方だと、勿論bintrayにNWアクセスしにいくので

できればオフライン用途が多い自分としては、下記の書き方で書くかなと*5

templates {
    mappings {
        grooidNewProject = "file:${System.getenv('HOME')}/.lazybones/templates/grooid-new-project-1.1.5.zip"
        this."grooid-new-project" = "file:${System.getenv('HOME')}/.lazybones/templates/grooid-new-project-1.1.5.zip"
    }
}

で使うときは
> lazybones create grooidNewProject hoge
or
> lazybones create grooid-new-project fuga
みたいに書く。

で後は

  • ask文で対話式にして変数化して頑張ってく。
  • ask文にした箇所は -P変数名=XXXで応答スキップは出来る

一応 テンプレート自体は、デフォルトだと下記3種から選択可能

Template file Resulting file Processing
App.groovy App.groovy Registered default template engine
App.groovy.gtpl App.groovy Groovy template engine
App.groovy.hbs App.groovy Handlebars template engine

Handlebars自体はvert.x や ratpack 等で採用されているテンプレート形式 とのこと

一応proxyを使いたい場合は

  • $HOME/.lazybones/config.groovy でproxy記載
systemProp {
    http {
        proxyHost = "localhost"
        proxyPort = 8181
    }
    https {
        proxyHost = "localhost"
        proxyPort = 8181
    }
}



lazybone template をカスタマイズしてみよう

gr8confagenda のissue辺りで、

  • [lazybonesのテンプレート作ってよ〜]

と gr8confagenda の issueでリクエストが書かれていて、

  • ちょっと試してみようかな?
  • いやいや誰が作ってるでしょう?
    • 有りました! というのが今回のお話。

でも色々と依存ライブラリのバージョンが古いようなので書き換えてみる

まず

git clone https://github.com/mariogarcia/grooid-templates.git
cd grooid-templates
gradlew tasks //☆

を行う。*6

この段階で
bintrayのupload記述でエラーになるのでその箇所をコメントにする

  • grooid-templates/build.gradle
lazybones {
    licenses = ["Apache-2.0"]
    repositoryName = "marioggar/grooid-templates"
    //repositoryUsername = bintrayUser
    //repositoryApiKey = bintrayKey
}

次にテンプレートを書き換える

  • grooid-templates/templates/grooid-new-project
  • gradle/warper/gradle-warper.properties
#distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
distributionUrl=file:/opt/gradle-2.9-bin.zip
  • lazybones.groovy
// --------------- QUESTIONS ------------------
props.defaultPackage    = ask('DEFAULT source code package ? [grooid.app]: ', 'grooid.app', 'defaultPackage')
props.minSdkVersion     = ask('MIN version of SDK you want to target ? [8]: ', '8', 'minSdkVersion')
props.targetSdkVersion  = ask('MAX version of SDK you want to target ? [22]: ', '22', 'targetSdkVersion')
props.buildToolsVersion = ask('DEFAULT version for Android Build Tools ? [23.0.2]: ', '23.0.2', 'buildToolsVersion')
props.androidSupportV4  = ask('DEFAULT version for Android support v4 ? [23.+]: ', '23.+', 'androidSupportV4')
  • build.gradle
buildscript {
    repositories {
		maven { url "https://jitpack.io" }
        jcenter()
    }
    dependencies {
        //classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'com.android.tools.build:gradle:+'
        //classpath 'org.codehaus.groovy:gradle-groovy-android-plugin:0.3.6'
		classpath 'com.github.groovy:groovy-android-gradle-plugin:1b77dd6763'
        classpath 'net.kaleidos.gradle.plugins:emerger:0.0.2'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'groovyx.grooid.groovy-android'
apply plugin: 'net.kaleidos.gradle.plugins.emerger'

android {

    compileSdkVersion ${targetSdkVersion}
    buildToolsVersion "${buildToolsVersion}"

    defaultConfig {
        minSdkVersion ${minSdkVersion}
        targetSdkVersion ${targetSdkVersion}
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    packagingOptions {
        exclude 'LICENSE.txt' // Needed by Spock/Android
    }

    lintOptions {
        abortOnError false
    }

    buildTypes {
        debug {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

}

repositories {
    jcenter()
    mavenCentral()
}

dependencies {

    // Android tools
    compile 'com.android.support:support-v4:${androidSupportV4}'
    // Groovy version
    compile 'org.codehaus.groovy:groovy:2.4.4:grooid'
    // Groovy Json handling
    compile ('org.codehaus.groovy:groovy-json:2.4.0-rc-1') {
        transitive = false
    }

    // Getting rid of boiler plate code
    compile 'com.arasthel:swissknife:1.3.1'
    // Rest handling
    compile 'com.squareup.retrofit:retrofit:1.9.0'
    // Imaging
    compile 'com.squareup.picasso:picasso:2.5.2'

    // Spock/Android
    androidTestCompile "com.andrewreitz:spock-android:1.2.1"
    androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
    androidTestCompile('org.spockframework:spock-core:1.0-groovy-2.4') {
        exclude group: 'org.codehaus.groovy'
        exclude group: 'junit'
    }
}

と書き換えて

  • grooid-templates ルート直下で

> gradlew installAllTemplates
でローカルキャッシュにテンプレートを入れなおせばOK。

*1:StackOverFlowで検索かけると何故かratpackとかよりgriffonばかり出てくる<苦笑

*2:ランタイムキャッシュに上手くヒットしない場合はやたらとランタイムを複数DLしてきますが。。。

*3:だからローカルパスのgradle-XXX.bin.zip 等指定する方が良いです

*4:--cached 指定は gradlewでいう --offlineにあたるもの

*5:winだとUSERPROFILEが環境変数の相手になるかと

*6:gradlew tasksをする前に 2.9-all.zip辺りに差し替えること