2015-03-31 60 views
12

我正在開發一個Scala.js跨項目,其中jvm文件夾代表我的服務器應用程序,js代表我的scala.js代碼。Scala.js編譯目標

每當我編譯我的scala.js代碼通過sbt crossJS/fastOptJS編譯的JS結束在./js/target/scala-2.11/web-fastopt.js

我需要在jvm文件夾中的服務器項目的資源中可以訪問此編譯的JS文件,所以我可以通過我的Web應用程序對其進行服務。我認爲我必須用artifactPath做一些事情,但我目前似乎無法從我的實驗中得到任何結果。

回答

5

你可以簡單的設置fastOptJS任務的artifactPath(或fullOptJS任務)至(管理)的資源,你的JVM項目的目錄:

// In the JS project's settings 
artifactPath in fastOptJS := 
    (resourceManaged in jvm in Compile).value/
    ((moduleName in fastOptJS).value + "-fastopt.js")) 

這將會把它的目錄,如果你運行fastOptJS任務。但是,它不會被包含在sbt的resources任務中,並且如果啓動服務器,它將不會自動觸發。因此:

// In the JVM project's settings 
resources in Compile += (fastOptJS in js).value.data 

有兩點要注意:

  • 的第一步是隻需要,如果你的Web服務器也只爲特定的目錄。否則第二個就足夠了,因爲這已經將文件添加到資源中了;它所處的位置是次要的。
  • 設置crossTarget,就像@ochrons的答案一樣,也會輸出資源目錄中的所有文件.class.sjsir
  • 查看Vincent Munier的sbt-play-scalajs以獲得開箱即用的sbt-web/Scala.js集成(它遵循一種稍微不同的方法:它從js項目複製文件,而不是直接將其放入JVM項目。如果您有多個JVM項目,則很有用)。
4

您可以配置Scala.js SBT插件來輸出您選擇的文件夾中的JavaScript文件。例如像這樣:

// configure a specific directory for scalajs output 
val scalajsOutputDir = Def.settingKey[File]("directory for javascript files output by scalajs") 

// make all JS builds use the output dir defined later 
lazy val js2jvmSettings = Seq(fastOptJS, fullOptJS, packageJSDependencies) map { packageJSKey => 
    crossTarget in(js, Compile, packageJSKey) := scalajsOutputDir.value 
} 
// instantiate the JVM project for SBT with some additional settings 
lazy val jvm: Project = sharedProject.jvm.settings(js2jvmSettings: _*).settings(
    // scala.js output is directed under "web/js" dir in the jvm project 
    scalajsOutputDir := (classDirectory in Compile).value/"web"/"js", 

這也將-jsdeps.js存儲在同一文件夾中的文件.js.map,如果你想使用那些在你的web應用程序。

有關更完整的示例,請查看this tutorial,它解決了創建更復雜的Scala.js應用程序的許多其他問題。

+0

是什麼sharedProject? – ses 2016-05-09 23:26:25

+0

sharedProject在這種情況下是指一個Scala.js交叉項目,例如: 'lazy val shared =(crossProject.crossType(CrossType.Pure)in file(「shared」)) – ochrons 2016-05-11 13:16:02

0

或者乾脆:

artifactPath in (Compile, fastOptJS) := (artifactPath in (Compile, fullOptJS)).value 

比較,以gzm0的解決方案,你不會再