seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

lsの使い方

ls-sbt 0.1.0 の時点で書いているので、最新の情報は以下をご確認ください。

http://ls.implicit.ly/
https://github.com/softprops/ls

というか、本家に書いてある内容を順序立てて日本語で書いただけなので本家を見たほうが早いかも、、です。

lsとは?

sbt の dependency 追加を楽にしてくれる仕組みです。

ls.implicit.ly のサーバに登録済の情報を sbt プラグインで取得して build.sbt に反映することができます。

たとえば unfiltered がこのように登録されているので

http://ls.implicit.ly/unfiltered/unfiltered

unfiltered を使いたければ、sbtで

> ls-install unfiltered

とやると、unfiltered の dependency が build.sbt に追記されます。

libraryDependencies += "net.databinder" %% "unfiltered" % "0.5.2"

resolver が独自のものの場合、このように resolver も合わせて追加されます。

> ls-install scalikesolr
resolvers += "scalikesolr-resolver-0" at "http://seratch.github.com/mvn-repo/releases"

libraryDependencies += "com.github.seratch" %% "scalikesolr" % "3.5.0"

単に名前だけを指定した場合は ls に登録済みの最新版が選択されますが、以下のようにバージョンを指定することもできます。

> ls-install unfiltered@0.5.1


ライブラリの name(MavenでいうartifactId) と同じ名前のリポジトリとして GitHub で公開されていて、任意のリポジトリで配布されているライブラリは簡単に登録することができます。

ライブラリの利用側、提供側のそれぞれの手順について以下にまとめます。

共通の前提条件

  • conscript を使えるようにする

https://github.com/n8han/conscript

  • lsinit を使えるようにする
cs softprops/ls

ライブラリの利用側

ls.implicit.ly に登録されたライブラリを使いたい場合は以下の手順です。

lsinit で初期化

sbtコマンドを実行するディレクトリと同じところで以下を実行します。

lsinit

このプロジェクトの sbt で ls-sbt プラグインが使えるようになります。

具体的には「build.sbt」に

seq(lsSettings :_*)

「project/plugins.sbt」に

resolvers ++= Seq(
  "less is" at "http://repo.lessis.me",
  "coda" at "http://repo.codahale.com")

addSbtPlugin("me.lessis" % "ls-sbt" % "0.1.0")

がそれぞれ追加されます。*1

ls にあるか確認する
[user@xxx testgen-sbt]$ sbt
> ls -n unfiltered
[info] Fetching library info for unfiltered
[info] - unfiltered (0.5.2, 0.5.1) # Core library for describing requests and responses
[success] Total time: 1 s, completed Nov 28, 2011 6:49:44 PM
>

「-n」なしだとキーワード検索です。

> ls unfiltered
[info] Fetching library info matching unfiltered
[info] - unfiltered-agents (0.5.2, 0.5.1)           # User-Agent request matchers
[info] - unfiltered-filter-async (0.5.2, 0.5.1)     # Server binding for Java Servlet 3.0 async filters
[info] - unfiltered-filter (0.5.2, 0.5.1)           # Server binding for Java Servlet filters
[info] - unfiltered-jetty-ajp (0.5.2, 0.5.1)        # Jetty AJP server embedding module
[info] - unfiltered-jetty (0.5.2, 0.5.1)            # Jetty server embedding module
[info] - unfiltered-json (0.5.2, 0.5.1)             # Json requset matchers and response functions
[info] - unfiltered (0.5.2, 0.5.1)                  # Core library for describing requests and responses
[info] - unfiltered-netty-server (0.5.2, 0.5.1)     # Netty server embedding module
[info] - unfiltered-netty-websockets (0.5.2, 0.5.1) # WebSockets plan support using Netty
[info] - unfiltered-netty (0.5.2, 0.5.1)            # Netty server binding module
[info] - unfiltered-oauth (0.5.2, 0.5.1)            # OAuth plans for servlet filters
[info] - unfiltered-scalatest (0.5.2, 0.5.1)        # Facilitates testing Unfiltered servers with ScalaTest
[info] - unfiltered-spec (0.5.2, 0.5.1)             # Facilitates testing Unfiltered servers with Specs
[info] - unfiltered-uploads (0.5.2, 0.5.1)          # Support for multi-part uploads for servlet filters
[info] - unfiltered-util (0.5.2, 0.5.1)             # unfiltered-util
[success] Total time: 1 s, completed Nov 28, 2011 6:49:28 PM
>
ls-install で build.sbt に追加
> ls-install unfiltered

で「build.sbt」に

libraryDependencies += "net.databinder" %% "unfiltered" % "0.5.2"

が追加されます。

もう一回「ls-install unfiltered」とやると

> ls-install unfiltered
Discovered library unfiltered@0.5.2
[error] A potential conflict was detected between a currently installed library dependency (unfiltered@0.5.2)
[error] and the library you are intending to install (unfiltered@0.5.2)
[error] You may wish to uninstall version 0.5.2 of this dependency first.
[error] Use 'last' for the full log.

という感じに怒られますが、これはすでに build.sbt に書いてあるからで、やり直したい場合は build.sbt から削除すればOKです。

ls-install は build.sbt に追記して sbt reload するだけです。

sbt update などのコマンドを実行したらそのライブラリを実際にとりにいきます。

ライブラリの提供側

何かしらの Scala ライブラリを GitHub で開発している状態を前提とします。

git clone git@github.com:user/yourapp
cd yourapp
lsinit で初期化

利用側と同じです。lsinit コマンドでこのプロジェクトの sbt で ls を使えるようにします。

lsinit
ls-write-version でひな形作成
sbt ls-write-version

を実行すると「src/main/ls/0.1.0.json」のようなファイルがつくられます。*2
内容は sbt のビルド設定が反映されます。

{
 "organization":"your-organization",
 "name":"yourapp",
 "version":"0.1.0",
 "description":"yourapp",
 "site":"",
 "tags":[],
 "docs":"",
 "licenses": [],
 "resolvers": ["http://scala-tools.org/repo-releases"],
 "dependencies": [],
 "scalas": ["2.9.1","2.9.0-1","2.9.0"],
 "sbt": false
}

scala-tools.org 以外に publish している場合は少なくとも resolvers を書き換える必要があります。

description もよく目に触れるので書き換えた方がよいと思います。

JSON を GitHub に commit & push

必要な修正が終わったら「src/main/ls/***.json」を GitHub に push します。

lsync で ls.implicit.ly に反映

GitHub で修正した JSON を公開したら

sbt lsync

を実行します。

うまくいくと以下のように「Project was synchronized」というメッセージが出力されるはずです。

[user@xxx testgen-sbt]$ sbt lsync
[info] Loading project definition from /home/user/github/testgen-sbt/project
[info] Set current project to testgen-sbt (in build file:/home/user/github/testgen-sbt/)
[info] lsyncing project seratch/testgen-sbt@0.1...
[info] Project was synchronized
[success] Total time: 2 s, completed Nov 28, 2011 4:50:46 PM
[user@xxx testgen-sbt]$

GitHub のユーザ名、リポジトリ名が存在するかはチェックされますが、指定されたリポジトリに配布物があるかはチェックされません。

反映されたか確認

ls.implicit.ly に反映されたかどうかを確認します。

  • ブラウザ

http://ls.implicit.ly/ にアクセスして GitHub ユーザ名かライブラリの名前を入力します。

登録されていれば検索結果に反映されているはずです。

登録済のライブラリであれば、以下の JSON の中に存在するはずです。

curl http://ls.implicit.ly/api/1/libraries

一度公開した ls の JSON ファイルは更新して GitHub に push → sbt lsync すれば、何度でも内容を変更できます。

*1:なので手作業でもできなくはないです

*2:既にある場合は上書きされるので注意