lazybones templateをカスタマイズしてみる
この記事は、G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2015 Advent Calendar 2015 - Qiita の 21 日目の記事です。
- 昨日は ligun - Qiita さんのお話です
- 明日は it__ssei - QiitaさんのGroovyでJSON返すAPIサーバを作る(Embedded Jetty) - Qiitaのお話です
lazybones template 事始め
実際 lazybonesは、気軽にプロジェクトを作れるのでみたいな話はあるけど*1
カスタマイズして見るみたいな話はあまり出てこないので、公式のチュートリアルを触ってみた辺りのメモなど
- GitHub - pledbrook/lazybones: A simple project creation tool that uses packaged project templates.
- Template developers guide · pledbrook/lazybones Wiki · GitHub
日本だと下記の記事ぐらいかな。。
0)チュートリアルで作られる gradllew warperが凄く古い
> lazybones create lazybones-project my-lzb-templates
- 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
しかも ローカルのみにインストールされたプロジェクトは
な感じで バージョン指定も必要で ちょっと面倒。
でローカルでも手軽にとして記載されている方法が
- $HOME/.lazybones/config.groovy で
- templates.mappings.エイリアス名 で定義
- $HOME/.lazybones/config.groovy の通常の書き方
bintrayRepositories = [ "marioggar/grooid-templates", "pledbrook/lazybones-templates" //公式テンプレート ]
ただこの上記の書き方だと、勿論bintrayにNWアクセスしにいくので
できればオフライン用途が多い自分としては、下記の書き方で書くかなと*5
- $HOME/.lazybones/config.groovy のfileマッピング
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でリクエストが書かれていて、
- ちょっと試してみようかな?
- いやいや誰が作ってるでしょう?
- 有りました! というのが今回のお話。
でも色々と依存ライブラリのバージョンが古いようなので書き換えてみる
- GitHub - grooida/grooid-templates: Lazybones templates for Groovy/Android development
- forkされて android wearのテンプレートが追加されているのが
まず
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。