2015-03-31 24 views
12

Tôi đang làm việc trên một dự án chéo Scala.js trong đó thư mục jvm thể hiện ứng dụng máy chủ của tôi và js đại diện cho mã scala.js của tôi.đích biên soạn Scala.js

Bất cứ khi nào tôi biên dịch mã scala.js qua sbt crossJS/fastOptJS JS được biên dịch kết thúc bằng ./js/target/scala-2.11/web-fastopt.js.

Tôi cần phải có tệp JS được biên dịch này có thể truy cập trong tài nguyên của dự án máy chủ trong thư mục jvm, vì vậy tôi có thể quản lý nó thông qua ứng dụng web của tôi. Tôi nghĩ rằng tôi phải làm một cái gì đó với artifactPath nhưng tôi dường như không thể nhận được bất kỳ kết quả từ các thí nghiệm của tôi cho đến nay.

Trả lời

5

Bạn chỉ có thể thiết lập artifactPath của nhiệm vụ fastOptJS (hoặc fullOptJS nhiệm vụ) đến (quản lý) các nguồn tài nguyên thư mục của dự án JVM của bạn:

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

này sẽ đặt nó trong thư mục, nếu bạn chạy tác vụ fastOptJS. Tuy nhiên, nó sẽ không được bao gồm trong nhiệm vụ resources của sbt và nó sẽ không tự động được kích hoạt, nếu bạn khởi chạy máy chủ của mình. Do đó:

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

Một vài lưu ý:

  • Bước đầu tiên là chỉ cần thiết, nếu máy chủ web của bạn không chỉ phục vụ cho các thư mục cụ thể. Nếu không thì điều thứ hai là đủ, vì điều này sẽ thêm tệp vào tài nguyên; nơi nó nằm là thứ yếu.
  • Đặt crossTarget, như trong câu trả lời @ochrons cũng sẽ xuất tất cả các tệp .class.sjsir trong thư mục tài nguyên.
  • Hãy xem số sbt-play-scalajs của Vincent Munier để tích hợp sbt-web/Scala.js ngoài (hộp này theo một cách tiếp cận hơi khác: Cách sao chép tệp từ dự án js, thay vì đặt trực tiếp tệp đó vào dự án JVM. Hữu ích nếu bạn có nhiều dự án JVM).
4

Bạn có thể định cấu hình plugin SBT Scala.js để xuất tệp JavaScript trong thư mục bạn chọn. Ví dụ như thế này:

// 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", 

này cũng sẽ lưu trữ -jsdeps.js và .js.map tập tin trong cùng một thư mục, trong trường hợp bạn muốn sử dụng những trong ứng dụng web của bạn.

Để biết ví dụ hoàn chỉnh hơn, hãy xem this tutorial giải quyết nhiều vấn đề khác về việc tạo ứng dụng Scala.js phức tạp hơn.

+0

sharedProject là gì? – ses

+0

sharedProject trong ngữ cảnh này có nghĩa là một dự án chéo Scala.js chẳng hạn như: 'lazy val shared = (crossProject.crossType (CrossType.Pure) trong tệp (" shared "))' – ochrons

0

Hoặc đơn giản là:

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

So sánh với giải pháp gzm0 của bạn không tái