2015年10月15日木曜日

Cygwin でパス指定時に No such file or directory

Cygwin 上で突如パス指定が No such file or directory とエラーが出て嵌った・・・

ホームディレクトリから指定した場合
ls ~/.bash_profile
/bin/ls: /cygdrive/d/home/.bash_profile: No such file or directory
絶対パス
ls /cygdrive/d/.bash_profile
/bin/ls: /cygdrive/d/home/.bash_profile: No such file or directory
カレントディレクトリ
ls ./.bash_profile
./.bash_profile
どうやら相対パスの場合見えるようだ

次に cygdrive を見てみると
ls /cygdrive/
/bin/ls: /cygdrive/: No such file or directory
そもそもこれがみえない・・・
今朝方、Windows Update と Norton のインストールを行ったためアンインストールしてみる。
が、変わらない・・・
その他、/usr 以下に作っていたディレクトリも見えなくなっている・・・
そこで / から追ってみようと ls を叩いてみると
ls /
Git Bash.vbs
README.portable
ReleaseNotes.rtf
bin
cmd
doc
etc
git-bash.bat
git-cheetah
git-cmd.bat
lib
libexec
share
ssl
ん? /usr /var 等が見当たらない。
そして git の文字が・・・
そういえば、最近 MSysGit に PATH を通した記憶が。
エクスプローラで MSysGit のディレクトリを見てみると同じフォルダ構成になっている。
PATH を消してみるとなおった

どうやら PATH を .bash_profile に設定した後、再読み込みも再起動もしていなかったらしい・・・
MSysGit にある bin の以下にコマンドがありこちらを使用していた模様。

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 にするとうまくいかない・・・難しい・・・