giter8はversion0.3.2から、lsを使って自動でデフォルト値にlibraryの最新版を指定できるようになってる件

version0.3.2って、このblogを書いてる時点からもう3ヶ月まえですが、今更気づいたというか。英語はわかるひとは、以下読みましょう

https://github.com/n8han/giter8/blob/0.3.2/notes/0.3.2.markdown

例えばこんな感じ
https://github.com/softprops/unfiltered.g8/blob/a7fed217f6025b3dcbff1253aebc797e3ca75f01/src/main/g8/default.properties#L3


この機能がないと、以前まではライブラリの新しいversionが出るたびに、versionの部分の数文字のためだけにコミットしないといけなくて若干めんどくさいことになりますよね。*1
例えば、unfilteredのコミッターである softprops さんのgithubには、以下のようにunfilteredに関するg8のtemplateが大量にありますが

https://github.com/softprops/unfiltered.g8
https://github.com/softprops/unfiltered-websockets.g8
https://github.com/softprops/unfiltered-oauth-server.g8
https://github.com/softprops/unfiltered-gae.g8
https://github.com/softprops/unfiltered-basic-auth.g8
https://github.com/softprops/unfiltered-oauth-client.g8
https://github.com/softprops/unfiltered-oauth2-server.g8

unfilteredのversionを上げただけで、これらのtemplateのdefault.propertiesのunfilteredのversionを上げないといけませんよね。勿論、default.propertiesはあくまでもデフォルトを定義しておくだけなので、その部分が最新版でなくてもtemplate作成時に、(最新版を使いたければ)使う側が最新版のversionを入力すればいいわけですが、まぁ普通はみんな最新版使うでしょうし、デフォルト値は最新版になっていることに越したことはないですよねーという。

使い方は特に説明することないですし、以下、ソースコードを地味に追ってみます。(このblog書いてる時点で最新版のtagであるversion0.4.0)

まず、giter8のなかで、default.propertiesを読み込んで、lsの記法の場合を処理してるのがこのあたり
https://github.com/n8han/giter8/blob/0.4.0/app/src/main/scala/defaults.scala#L9-14
https://github.com/n8han/giter8/blob/0.4.0/app/src/main/scala/parser.scala#L13
parser combinator 使ってますね。
で、parseに成功したら、lsのサーバーにhttpのrequest投げて、最新版を問い合わせるわけですが、それにはlsのlibraryを使ってます

https://github.com/n8han/giter8/blob/0.4.0/project/build.scala#L54-55

なぜかちょうどいいtagがなかったのか、直接hash値を使って、githubを参照してます。こんな風にsbtにはgithub上にあるsbtプロジェクトを直接参照する機能がついてます。詳しくはsbtのwikiのこのあたり
https://github.com/harrah/xsbt/wiki/Full-Configuration
sbtのドキュメントはgithubのwikiからscala-sbt.orgに移りました!


で、lsのほうですが、これですね
https://github.com/softprops/ls/blob/cd84ac3fdbba7074bc565107f5c02bc0104cfcde/library/src/main/scala/client.scala#L44-55

これ使うと、lsに設定してあれば、そのライブラリの最新versionが取得できようになっているようです。

この機能使えるのにもかかわらず、使っていないものがある程度あると思うので*2使えるならば使いましょう。




で、ここで話は終わるはずだったのですが、これ書いたついでに、あるプロジェクトのdefault.propertiesをlsを使ったものに変えて、pull requestを送ろうとしたらこんな問題に遭遇(・ω・`)

giter8-plugin g8-test task fail when contains ls properties

giter8-pluginでテストすると、

ls(unfiltered, unfiltered)

という部分を解析せずに、そのまま ls(unfiltered, unfiltered) という部分がversion番号として認識したまま、依存解決をしようとしちゃってます。pluginとappのモジュールに、全く依存関係がなくて、appのほうは、lsを解析しているのに対して、pluginのほうはこのあたり

https://github.com/n8han/giter8/blob/0.4.0/plugin/src/main/scala/giterate-plugin.scala#L33-38

が、単にpropertie fileを読み込んで、 Map[String, String] にしてるだけで全く考慮されてませんね・・・。直してみようかともおもったけど、

  • pluginをappに依存させるようにしたほうがいいのか?
  • lsを解析している部分をappから切り出して、coreとかcommonとか新たにモジュール作ったほうがいいのか? *3

とか考えて、それほど簡単に直りそうもなかったのでとりあえずissue報告だけしました(・ω・`)

追記:
もう、これが修正された新しいversionでてます!
https://github.com/n8han/giter8

*1: というかめんどくさかったからこの機能いれたのでしょうね

*2:そのライブラリ自体がlsに登録されてて、それがちゃんと更新されていなければ意味ないから、すべてに対して使えるわけではないが・・・

*3: そんな感じで別branchで作ってるっぽい? https://github.com/n8han/giter8/blob/c5af17660e883604a2c514ca2e5d085a759b4fb5/project/build.scala