/ / ScalaJs PhantomJsEnv nie działa, gdy phantomjs jest zainstalowany z npm - sbt, scala.js

ScalaJs PhantomJsEnv nie działa, gdy phantomjs jest zainstalowany z npm - sbt, scala.js

Próbuję używać fantomów jako zainstalowanych przez npm do wykonywania testów jednostkowych dla ScalaJS.

Po uruchomieniu testów pojawia się następujący błąd:

/usr/bin/env: node: No such file or directory

Uważam, że dzieje się tak z powodu sposobu, w jaki phatomjs po zainstalowaniu z węzłem npm ładuje węzeł:

Oto pierwsza linia od fantomów:

#!/usr/bin/env node

Jeśli zmienię ten pierwszy wiersz na kod twardy na plik wykonywalny węzła (wymaga to zmodyfikowania pliku zainstalowanego przez npm, aby było to w najlepszym razie tylko tymczasowe rozwiązanie):

#!/home/bjackman/cgta/opt/node/default/bin/node

Wszystko działa poprawnie.

Używam phantom.js btw, ponieważ moment.js nie działa w NodeJSEnv.

Work Around:

Po przejrzeniu źródła wtyczki znajduje się tutaj obejście:

Przekazuję środowisko z sbt do 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
}
)

Dzięki temu mogę używać moment.js w moich testach jednostkowych.

Odpowiedzi:

2 dla odpowiedzi № 1

AKTUALIZACJA: Odpowiedni błąd w Scala.js (# 865) został naprawiony. Powinno to działać bez obejścia.

To jest rzeczywiście błąd w Scala.js (problem # 865). Dla przyszłego odniesienia; jeśli chcesz zmodyfikować środowisko jsEnv, masz dwie opcje (dotyczy to jednakowo Node.js i PhantomJS):

  1. Podaj dodatkowe zmienne środowiskowe jako argument (tak jak w przykładzie @KingCub):

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

    Przekazane wartości będą miały pierwszeństwo przed wartościami domyślnymi.

  2. Nadpisanie getVMEnv:

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

    Umożliwi to:

    1. Czytaj / modyfikuj środowisko dostarczone przez super.getVMEnv
    2. Uczyń swoje środowisko zależnym od argumentów runJS metoda.

To samo dotyczy argumentów przekazywanych do pliku wykonywalnego.