我正在尝试使用通过npm安装的phantomjs来执行ScalaJS的单元测试。
当我运行测试时,我收到以下错误:
/usr/bin/env: node: No such file or directory
我认为这是因为使用npm加载节点时phatomjs如何加载节点:
以下是phantomjs的第一行:
#!/usr/bin/env node
如果我将第一行更改为硬编码到节点可执行文件(这涉及修改由npm安装的文件,因此它只是一个临时解决方案):
#!/home/bjackman/cgta/opt/node/default/bin/node
一切正常。
我正在使用phantom.js btw,因为moment.js在NodeJSEnv中不起作用。
查看插件源后,解决方法是:
我将环境从sbt转发到PhantomJSEnv:
import scala.scalajs.sbtplugin.ScalaJSPlugin._
import scala.scalajs.sbtplugin.env.nodejs.NodeJSEnv
import scala.scalajs.sbtplugin.env.phantomjs.PhantomJSEnv
import scala.collection.JavaConverters._
val env = System.getenv().asScala.toList.map{case (k,v)=>s"$k=$v"}
olibCross.sjs.settings(
ScalaJSKeys.requiresDOM := true,
libraryDependencies += "org.webjars" % "momentjs" % "2.7.0",
ScalaJSKeys.jsDependencies += "org.webjars" % "momentjs" % "2.7.0" / "moment.js",
ScalaJSKeys.postLinkJSEnv := {
if (ScalaJSKeys.requiresDOM.value) new PhantomJSEnv(None, env)
else new NodeJSEnv
}
)
有了这个,我可以在单元测试中使用moment.js。
答案 0 :(得分:2)
更新:Scala.js(#865)中的相关错误已得到修复。这应该没有解决方法。
这确实是Scala.js中的一个错误(问题#865)。备查;如果你想修改jsEnv的环境,你有两个选择(这同样适用于Node.js和PhantomJS):
传入其他环境变量作为参数(就像在@ KingCub的例子中一样):
new PhantomJSEnv(None, env)
// env: Map[String, String]
传入的值优先于默认值。
覆盖getVMEnv
:
protected def getVMEnv(args: RunJSArgs): Map[String, String] =
sys.env ++ additionalEnv // this is the default
这将允许您:
super.getVMEnv
runJS
方法的参数。这同样适用于传递给可执行文件的参数。