Lazybonesによるプロジェクトテンプレート管理(1): Lazybones概要/Hello Lazybones

Lazybonesとは?

Lazybonesはプロジェクトテンプレートからプロジェクトのひな形を自動作成するツールです。

Railsのscaffoldや、Mavenarchetype:generateに近いメージですが、特定のフレームワークやビルドツールに依存しない汎用的なテンプレート管理ツールになっています。(元々はRatpackにプロジェクト新規作成用のコマンドラインツールが提供されていないことを不満に思って作成したそうです。)
とはいえ、Lazybonesのテンプレート作成機能がGradleベースであることや、post-installスクリプトをGroovyで記述することなどから、Gradleプロジェクトのテンプレート管理ツールとして使われることを想定していると考えてよいのではないかと思います。

Lazybones概要

  • テンプレートはzip形式のアーカイブで、基本的にはプロジェクトのひな形となるファイル・ディレクトリをアーカイブに含めます。
  • テンプレートはBintrayから配布できます(バージョン管理可能)。
  • テンプレートには静的なファイルだけでなく、テンプレートエンジンによって生成する動的なファイルを含めることができます。テンプレートエンジンの処理はpost-installスクリプト(Groovyスクリプト)に記述します。
  • post-installスクリプトには対話処理を含めることができます。例えば、自動生成するクラスファイルのパッケージ名などをユーザーに入力させることができます。
  • サブテンプレート機能によって、プロジェクトの初期生成後にファイルを追加生成できます。(例えば後からコントローラークラスを追加するなど。)

テンプレート配布方法

デフォルトではBintrayの pledbrook/lazybones-templates リポジトリが検索対象となります。
コンフィグレーションでカスタムリポジトリを追加することができるので、例えば自分のBintrayリポジトリを検索対象に追加することも可能です。
また、Bintrayにアップロードせずに、テンプレートのzipファイルをWebサーバーやファイルサーバーにアップロードしておき、URLを直接指定する方法もあります。(いちいちURLを指定するのが面倒なら、コンフィグレーションでURLに別名をつけることもできます。)
テンプレートの開発方法は後日紹介しようと思いますが、興味のある方はこちらを参照してみてください。静的なファイルのみであれば、テンプレート作成はそれほど難しくないです。
Template developers guide · pledbrook/lazybones Wiki · GitHub

インストール方法

2014/12/28現在の最新バージョンは0.8です。
GVMが利用可能であれば、以下でインストールするのが簡単でよいでしょう。

$ gvm install lazybones

バイナリのzipファイルを展開してもよいです。以下からダウンロードして展開し、bin/以下にパスを通してください。
https://bintray.com/pledbrook/lazybones-templates/lazybones/0.8/view/files

使ってみる

以下のコマンドで公式リポジトリのテンプレート一覧を取得できます。

$ lazybones list
Available templates in pledbrook/lazybones-templates

aem-multimodule-project
afterburnerfx
afterburnergfx
angular-grails
asciidoctor-gradle
dropwizard
gaelyk
gradle-plugin
gradle-quickstart
groovy-app
groovy-lib
java-basic
lazybones-project
nebula-plugin
ratpack
ratpack-lite
spring-boot-actuator

試しにSpring Bootのプロジェクトを生成してみましょう。
テンプレートの詳細情報を確認するには「info」コマンドを利用します。

$ lazybones info spring-boot-actuator
Fetching package information for 'spring-boot-actuator' from Bintray
Name: spring-boot-actuator
Latest: 1.0.1.RELEASE
Owner: pledbrook
Versions: 0.1, 1.0.1.RELEASE, 0.2

提供されているバージョンが確認できましたので、1.0.1.RELEASEからプロジェクトを生成してみます。
プロジェクトの生成には「create」コマンドを利用します。「help <コマンド名>」で各コマンドの詳細が確認できます。

$ lazybones help create
Creates a new project from a template.

USAGE: create <template> <version>? <dir>

where template = The name of the project template to use.
version = (optional) The version of the project template to use. Uses
the latest version of the template by default.
dir = The name of the directory in which to create the project
structure. This can be '.' to mean 'in the current
directory.'

Option Description
------ -----------
-P Add a substitution variable for file
filtering.
-h, --help Displays usage.
--spaces Sets the number of spaces to use for
indent in files.
--with-git Creates a git repository in the new
project.

プロジェクトを生成したいディレクトリに移動し、以下を実行して「mybootapp」ディレクトリ以下にプロジェクトを新規生成します。

$ lazybones create spring-boot-actuator 1.0.1.RELEASE mybootapp

もしくは、以下のようにしてもかまいません。

$ mkdir mybootapp
$ cd mybootapp
$ lazybones create spring-boot-actuator 1.0.1.RELEASE .

プロジェクトのファイル一式が生成され、最後にREADME.mdの内容が表示されます。

# Spring Boot Actuator Sample

You have just created a simple Spring Boot project in Groovy incorporating the
Actuator. This includes everything you need to run the application. In this
case, that's a simple JSON endpoint.

In this project you get:

* A Gradle build file
* An application class, `SampleApplication`, implementing a single JSON endpoint
* A JUnit test case for `SampleApplication`

You can build and run this sample using Gradle (>1.6):

```
$ gradle run
```

If you want to run the application outside of Gradle, then first build the JARs
and then use the `java` command:

```

生成されたファイル一式は以下のようになっています。

$ tree
.
├── README.md
├── build.gradle
└── src
├── main
│   ├── groovy
│   │   └── sample
│   │   └── SampleApplication.groovy
│   └── resources
│   └── application.properties
└── test
└── groovy
└── sample
└── SampleApplicationTests.groovy

README.mdに従って実行してみます。(このテンプレートにはGradle Wrapperが含まれていないので、別途Gradleを導入しておく必要があります。)

$ gradle run
:compileJava UP-TO-DATE
:compileGroovy
:processResources
:classes
:run

. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.0.1.RELEASE)

2014-12-28 01:05:53.866 INFO 51749 --- [ main] sample.SampleApplication : Starting SampleApplication on nobusue-MacBookPro.local with PID 51749 (/Users/nobusue/work/mybootapp/build/classes/main started by nobusue)
2014-12-28 01:05:53.924 INFO 51749 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6ae0286d: startup date [Sun Dec 28 01:05:53 JST 2014]; root of context hierarchy
・・・
[org.springframework.boot:type=Endpoint,name=configurationPropertiesReportEndpoint]
2014-12-28 01:05:57.278 INFO 51749 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http
2014-12-28 01:05:57.279 INFO 51749 --- [ main] sample.SampleApplication : Started SampleApplication in 4.282 seconds (JVM running for 4.92)
> Building 80% > :run

無事Spring Bootアプリケーションが起動しました。

まとめ

spring-boot-actuatorテンプレートではアプリケーションのクラス名などは決め打ちになっていますが、post-installスクリプトを追加すればユーザーの入力に従ってクラス名を変更することなどが可能です。そのため、GitHubなどでテンプレートプロジェクトを公開するより、より使いやすい形で提供することができそうです。
なぜか日本語情報の少ないLazybonesですが、シンプルながら要所をおさえた作りになっており、なかなか使えそうです。
次回以降、テンプレート作成と公開について紹介していく予定です。