Sbt scalajsphantomjsenv不';从npm安装phantomjs时不工作

Sbt scalajsphantomjsenv不';从npm安装phantomjs时不工作,sbt,scala.js,Sbt,Scala.js,我试图使用通过npm安装的phantomjs来执行ScalaJ的单元测试 当我运行测试时,我得到以下错误: /usr/bin/env:node:没有这样的文件或目录 我相信这是因为phatomjs与npm一起安装时如何加载节点: 以下是phantomjs的第一行: #/usr/bin/env节点 如果我将第一行更改为节点可执行文件的硬代码(这涉及修改npm安装的文件,因此它充其量只是一个临时解决方案): #/主页/bjackman/cgta/opt/node/default/bin/node 一

我试图使用通过npm安装的phantomjs来执行ScalaJ的单元测试

当我运行测试时,我得到以下错误:

/usr/bin/env:node:没有这样的文件或目录

我相信这是因为phatomjs与npm一起安装时如何加载节点:

以下是phantomjs的第一行:

#/usr/bin/env节点

如果我将第一行更改为节点可执行文件的硬代码(这涉及修改npm安装的文件,因此它充其量只是一个临时解决方案):

#/主页/bjackman/cgta/opt/node/default/bin/node

一切正常

顺便说一句,我使用phantom.js是因为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。

更新:Scala.js()中的相关错误已经修复。这应该在没有解决办法的情况下起作用

这确实是Scala.js(问题)中的一个bug。供日后参考;如果要修改jsEnv的环境,有两个选项(这同样适用于Node.js和PhantomJS):

  • 将其他环境变量作为参数传入(就像@KingCub的示例中一样):

    传入的值将优先于默认值

  • 覆盖
    getVMEnv

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

  • 读取/修改super.getVMEnv提供的环境
  • 使您的环境依赖于
    runJS
    方法的参数

  • 这同样适用于传递给可执行文件的参数。

    除了注释外:
    jsDependencies
    自动将模块添加到
    libraryDependencies
    ,因此无需重复。看起来更像是一个bug报告,而不是一个问题。你介意把这个(和解决方法)归档到GitHub上吗?谢谢
     protected def getVMEnv(args: RunJSArgs): Map[String, String] =
       sys.env ++ additionalEnv // this is the default