2016-07-06 53 views
5

(提前提出長問題,簡化tl;博士在底部)。在兩個ScalaJS SBT項目之間使用DependsOn

我有SBT建成兩個ScalaJS項目 - 「MYAPP」 和 「MYLIB」,在下面的目錄結構

root/build.sbt 

root/myapp/build.sbt 
root/myapp/jvm/ 
root/myapp/js/ 
root/myapp/shared/ 

root/mylib/build.sbt 
root/mylib/jvm 
root/mylib/js 
root/mylib/shared 

lib出口命名的神器 「com。示例:MYLIB:0.1」,這是用作庫的依賴關係myapp

MYAPP和MYLIB是在單獨的存儲庫,包含自己的構建文件,並且應該能夠完全建立獨立(即它們必須包含自己個人的構建配置)。

在生產中,它們將分開構建,mylib首先作爲maven工件發佈,然後分別構建myapp

但是,在開發中,我希望能夠將它們合併到父SBT項目中,以便在每次更改後無需使用publishLocal即可並行開發這兩個項目。

在傳統的(不scalajs)項目,這將是很容易

$ROOT/build.sbt: 

lazy val mylib = project 
lazy val myapp = project.dependsOn(mylib) 

但是在ScalaJS,我們其實有每個模塊內的兩個項目 - appJVMappJSlibJVMlibJS。因此,上述配置只能找到聚合根項目,並且不會將dependsOn配置正確應用於實際的JVM和JS項目。

(即MYAPP和mylib中build.sbt各包含兩個項目,合計項目根)

理想情況下,我想能夠做到像下面

lazy val mylibJVM = project 
lazy val myappJVM = project.dependsOn(mylibJVM) 

lazy val mylibJS = project 
lazy val myappJS = project.dependsOn(myappJS) 

不幸的是這只是在根中創建新項目而不是自己導入子項目。

我也嘗試的路徑不同組合(如)

lazy val mylibJVM = project.in(file("mylib/jvm")) 

但這並不見mylib

在build.sbt文件中的配置最終我一直對同跑起來問題 - 將現有的多項目SBT項目導入到父sbt文件時,它會導入根項目,但似乎沒有提供從現有多模塊SBT文件導入子項目的方式,這種方式允許我添加dependsOn配置到它。

TL;博士

如果我有

  • root/mylib/build.sbt與定義的多個項目和
  • root/myapp/build.sbt與定義

多個項目是否有可能各個子項目導入root/build.sbt代替來自子模塊的根項目?

即,我可以有兩層多項目構建。

+0

我scalajs和SBT知識正是一歲,當被介紹爲scalajs項目,甚至它意味着什麼,但我的插件0.6.4版本的JVM和js之間的分裂,我不知道,我這樣做: 1)創建依賴於從LIB lib和副本輸出的fastOptJs任務到App 2)使應用程序的fastOptJs任務複印機任務取決於這個 讓我知道,如果這部分在這種情況下,幫助我可以嘗試幫助更多。 – 0fnt

回答

0

在花了很多時間挖掘SBT源代碼之後,我設法找出了一個解決方案。這不是乾淨的,但它的工作原理。 (對於獎勵積分,它可以正確導入到IntelliJ中)。

// Add this function to your root build.sbt file. 
// It can be used to define a dependency between any 
// `ProjectRef` without needing a full project definition. 
def addDep(from:String, to:String) = { 
    buildDependencies in Global <<= (
    buildDependencies in Global, 
    thisProjectRef in from, 
    thisProjectRef in to) { 
    (deps, fromref, toref) => 
     deps.addClasspath(fromref, ResolvedClasspathDependency(toref, None)) 
    } 
} 

// `project` will import the `build.sbt` file 
// in the subdirectory of the same name as the `lazy val` 
// (performed by an SBT macro). i.e. `./mylib/build.sbt` 
// 
// This won't reference the actual subprojects directly, 
// will but import them into the namespace such that they 
// can be referenced as "ProjectRefs", which are implicitly 
// converted to from strings. 
// 
// We then aggregate the JVM and JS ScalaJS projects 
// into the new root project we've defined. (Which unfortunately 
// won't inherit anything from the child build.sbt) 

lazy val mylib = project.aggregate("mylibJVM","mylibJS") 
lazy val myapp = project.aggregate("myappJVM","myappJS") 

// Define a root project to aggregate everything 
lazy val root = project.in(file(".")).aggregate(mylib,myapp) 


// We now call our custom function to define a ClassPath dependency 
// between `myapp` -> `mylib` for both JVM and JS subprojects. 
// In particular, this will correctly find exported artifacts 
// so that `myapp` can refer to `mylib` in libraryDependencies 
// without needing to use `publishLocal`. 
addDep("myappJVM", "mylibJVM") 
addDep("myappJS","mylibJS") 
相關問題