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 № 1AKTUALIZACJA: 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):
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.
Nadpisanie
getVMEnv
:protected def getVMEnv(args: RunJSArgs): Map[String, String] = sys.env ++ additionalEnv // this is the default
Umożliwi to:
- Czytaj / modyfikuj środowisko dostarczone przez
super.getVMEnv
- Uczyń swoje środowisko zależnym od argumentów
runJS
metoda.
- Czytaj / modyfikuj środowisko dostarczone przez
To samo dotyczy argumentów przekazywanych do pliku wykonywalnego.