ラベル sbt の投稿を表示しています。 すべての投稿を表示
ラベル sbt の投稿を表示しています。 すべての投稿を表示

2015年4月7日火曜日

System properties を sbt run 時に切り替え

Typesafe Config の設定ファイルを sbt run 時に指定したく、"-Dconfig.file=develo.conf" の指定時に嵌った・・・

System properties の切り替えのみの構成で、

./
 |
 +--build.sbt
 |
 +--project
 |  |
 |  +--build.properties
 |
 +--sampleconfig1
 |  |
 |  +--build.sbt
 |  |
 |  +--src
 |     |
 |     +--main
 |        |
 |        +--scala
 |           |
 |           +--SampleConfig1.scala
 |
 +--sampleconfig1.conf
 |
 +--sampleconfig2
 |  |
 |  +--build.sbt
 |  |
 |  +--src
 |     |
 |     +--main
 |        |
 |        +--scala
 |           |
 |           +--SampleConfig2.scala
 |
 +--sampleconfig2.conf

./build.sbt
name := "sampleconfig"

lazy val sampleconfig1 = project

lazy val sampleconfig2 = project

./project/build.properties
sbt.version=0.13.8

./sampleconfig1/build.sbt
name := "sampleconfig1"

./sampleconfig2/build.sbt
name := "sampleconfig2"

./sampleconfig1/src/main/scala/SampleConfig1.scala
object SampleConfig1 extends Application {
  println("SampleConfig1: " + System.getProperty("config.file"))
}

./sampleconfig2/src/main/scala/SampleConfig2.scala
object SampleConfig2 extends Application {
  println("SampleConfig2: " + System.getProperty("config.file"))
}

まずは sammpleconfig1 から、引数指定で試す。

# sbt
> project sampleconfig1
> run -Dconfig.file=sampleconfig1.conf
SampleConfig1: null

取れない・・・
つぎに、javaOptions を指定。

 ./sampleconfig1/build.sbt
name := "sampleconfig1"

javaOptions in Runtime += "-Dconfig.file=sampleconfig1.conf"

取れない・・・
 ぐぐってみると、initialize を使ってる書き込みがあったので使用してみる。

 ./sampleconfig1/build.sbt
name := "sampleconfig1"

initialize ~= { _ =>
  if (new java.io.File("sampleconfig1.conf").exists)
    System.setProperty("config.file", "sampleconfig1.conf")
}

# sbt
> project sampleconfig1
> run
SampleConfig1: sampleconfig1.conf

おっ取れてる!
うまくいったということで暫くこれでやっていたが、設定ファイルが読めない時が・・・

実は initialize を使用した後に、sampleconfig2 のプロジェクトを追加していて

 ./sampleconfig2/build.sbt
name := "sampleconfig2"

initialize ~= { _ =>
  if (new java.io.File("sampleconfig2.conf").exists)
    System.setProperty("config.file", "sampleconfig2.conf")
}

# sbt
> project sampleconfig2
> run
SampleConfig2: sampleconfig2.conf

この時点では取れているのだが、再度 sampleconfig1 を実行すると

# sbt
> project sampleconfig1
> run
SampleConfig1: sampleconfig2.conf

と他のプロジェクトの設定が取れてしまっていた・・・

なので実行前に設定するタスクを入れることに。

 ./sampleconfig1/build.sbt
name := "sampleconfig1"

val setProperty = TaskKey[Unit]("setProperty") in Compile

setProperty := {
  if (new java.io.File("sampleconfig1.conf").exists)
    System.setProperty("config.file", "sampleconfig1.conf")
}

run in Compile <<= run in Compile dependsOn (setProperty)

 ./sampleconfig2/build.sbt
name := "sampleconfig2"

val setProperty = TaskKey[Unit]("setProperty") in Compile

setProperty := {
  if (new java.io.File("sampleconfig2.conf").exists)
    System.setProperty("config.file", "sampleconfig2.conf")
}

run in Compile <<= run in Compile dependsOn (setProperty)
# sbt
> project sampleconfig1
> run
SampleConfig1: sampleconfig1.conf
> project sampleconfig2
> run
SampleConfig2: sampleconfig2.conf

これでうまくいった

in Compile を in Runtime にするとうまくいかない・・・難しい・・・