从npm安装phantomjs时,ScalaJs PhantomJsEnv无法正常工作

时间:2014-07-11 01:45:52

标签: sbt scala.js

我正在尝试使用通过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。

1 个答案:

答案 0 :(得分:2)

更新:Scala.js(#865)中的相关错误已得到修复。这应该没有解决方法。

这确实是Scala.js中的一个错误(问题#865)。备查;如果你想修改jsEnv的环境,你有两个选择(这同样适用于Node.js和PhantomJS):

  1. 传入其他环境变量作为参数(就像在@ KingCub的例子中一样):

    new PhantomJSEnv(None, env)
    // env: Map[String, String]
    

    传入的值优先于默认值。

  2. 覆盖getVMEnv

     protected def getVMEnv(args: RunJSArgs): Map[String, String] =
       sys.env ++ additionalEnv // this is the default
    

    这将允许您:

    1. 阅读/修改super.getVMEnv
    2. 提供的环境
    3. 使您的环境依赖于runJS方法的参数。
  3. 这同样适用于传递给可执行文件的参数。