2016-07-06 14 views
5

(Câu hỏi dài phía trước. Đơn giản tl; dr ở dưới cùng).Sử dụng DependsOn giữa hai dự án SBT ScalaJS

Tôi có hai ScalaJS dự án xây dựng với SBT - "myapp" và "mylib", trong cấu trúc thư mục sau

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 xuất khẩu một artifact có tên là "com.example: mylib: 0.1", mà như được sử dụng làm thư việnDependency cho myapp.

myapp và mylib nằm trong các kho lưu trữ riêng biệt, chứa tệp xây dựng của riêng chúng và có thể được tạo riêng hoàn toàn (nghĩa là chúng phải chứa cấu hình bản dựng riêng của chúng).

Trong quá trình sản xuất, chúng sẽ được xây dựng riêng biệt với mylib được xuất bản lần đầu tiên dưới dạng tạo tác maven trước khi tạo riêng biệt myapp.

Tuy nhiên, trong quá trình phát triển, tôi muốn có thể hợp nhất chúng thành dự án SBT mẹ để cả hai có thể được phát triển song song mà không cần sử dụng publishLocal sau mỗi thay đổi.

Trong một truyền thống (không scalajs) dự án này sẽ là khá dễ dàng

$ROOT/build.sbt: 

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

Tuy nhiên trong ScalaJS, chúng tôi thực sự có hai dự án bên trong mỗi mô-đun - appJVM, appJS, libJVMlibJS. Như vậy, cấu hình trên chỉ tìm thấy dự án gốc tổng hợp và không áp dụng chính xác cấu hình dependsOn cho các dự án JVM và JS thực tế.

(tức myapp và mylib build.sbt mỗi chứa hai dự án, và một dự án gốc tổng hợp)

Lý tưởng nhất là tôi muốn để có thể làm điều gì đó như sau

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

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

Thật không may này chỉ tạo các dự án mới trong thư mục gốc thay vì nhập các dự án con.

Tôi cũng đã cố gắng kết hợp khác nhau của con đường (như)

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

Nhưng điều này không thấy cấu hình trong tập tin build.sbt trong mylib

Cuối cùng tôi tiếp tục chạy lên so với cùng vấn đề - khi nhập dự án SBT nhiều dự án hiện có vào tệp sbt cha mẹ, nó nhập dự án gốc, nhưng dường như không cung cấp cách nhập một dự án con từ tệp SBT đa nhiệm hiện có theo cách cho phép tôi thêm cấu hình dependsOn cho nó.

tl; dr

Nếu tôi có

  • root/mylib/build.sbt với nhiều dự án quy định và
  • root/myapp/build.sbt với nhiều dự án quy định

Có thể nhập tiểu dự án cá nhân vào root/build.sbt thay của dự án gốc từ submodule?

tức là tôi có thể có hai lớp đa bản dựng.

+0

Kiến thức và kiến ​​thức sbt của tôi chính xác một năm và tôi không biết khi nào sự tách biệt giữa jvm và js được giới thiệu cho các dự án scalajs hoặc thậm chí nó có ý nghĩa gì với phiên bản plugin của tôi 0.6.4, tôi sẽ làm điều này: 1) Tạo một nhiệm vụ photocopy mà phụ thuộc vào fastOptJs nhiệm vụ lib và bản sao kết quả từ lib vào ứng dụng 2) thực hiện nhiệm vụ fastOptJs ứng dụng của phụ thuộc vào này Hãy cho tôi biết nếu điều này phần nào giúp trong trường hợp này tôi có thể cố gắng giúp đỡ nhiều hơn. – 0fnt

Trả lời

0

Sau khi dành nhiều thời gian đào qua mã nguồn SBT, tôi đã tìm ra giải pháp. Đây không phải là sạch, nhưng nó hoạt động. (Đối với điểm thưởng, nó nhập chính xác vào 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") 
Các vấn đề liên quan