在执行模块化/多文件scala作为shell脚本时忽略包更改

时间:2014-07-08 21:29:18

标签: shell scala shebang

当我有一个scala程序作为从包中提取的shell脚本时,如果我修改了该包,那么即使我重新编译,shell脚本也看不到这些更改。

这是一个非常简单的例子:

one.scala

package myPackage
object one {
  val value = "one"
}

main.scala

import myPackage._
object Main extends App {
  println( one.value )
}

现在,如果我按如下方式运行它,一切都按预期运行:

$ scalac one.scala main.scala
$ scala Main
one

现在我将main.scala转换为shell脚本

#/usr/bin/env scala
import myPackage._
println( one.value )

并执行它

$ chmod 755 main.scala
$ ./main.scala
one

一切都很好,直到我修改包并尝试引用它

two.scala

package myPackage
object two {
  val value = "two"
}

并修改我的主要参考它:

#/usr/bin/env scala
import myPackage._
println( one.value )
println( two.value )

现在编译并运行它并收到一条奇怪的错误消息:

$ scalac one.scala two.scala
$ ./main.scala
.../main.scala:4: error: not found: value two
println( two.value )
         ^

但它就在那里。它只是因为某种原因没有把它拿起来。所以让我们尝试改变主要的回归......

//#!/usr/bin/env scala
import myPackage._
object Main extends App {
  println( one.value )
  println( two.value )
}

编译并运行

$ scalac one.scala two.scala main.scala
$ scala Main
one
two

现在将其转换回在shebang

下运行
#!/usr/bin/env scala
import myPackage._
//object Main extends App {
  println( one.value )
  println( two.value )
//}

运行它:

$ scalac one.scala two.scala
$ ./main.scala
.../main.scala:4: error: not found: value two
println( two.value )
         ^

说什么?!这里发生了什么?我该如何解决?

我用CLASSPATH =和=“尝试过它。”和= pwd

我尝试修改shebang:

#!/bin/sh
exec scala -cp . "$0" "$@"
!#

它运行:

$ ./main.scala
one
two

非常有趣。所以它接受了改变。现在让我们再次更改包

one.scala

package myPackage
object one {
  val value = "one"
  val and = "and
}

main.scala

#!/bin/sh
exec scala -cp . "$0" "$@"
!#
import myPackage._
//object Main extends App {
    println( one.value )
    println( one.and )
    println( two.value )
//}

有效地再次表现出错误:

./main.scala:8: error: value and is not a member of object myPackage.one
println( one.and )
             ^

所以,改回shebang。没有骰子。尝试不同的shebang。没有帮助。但是,如果我将它作为一个类运行,它就可以工作。

其他人可以重现这个吗?关于这里发生了什么的任何想法?

$ uname -a
Darwin <hostname> 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64
$ scala -version
Scala code runner version 2.11.1 -- Copyright 2002-2013, LAMP/EPFL

1 个答案:

答案 0 :(得分:0)

使用scala -nc来避免运行编译守护程序。

这可能是重复的。

如果我错了,因为; tldr综合症。