2016-07-06 2 views
5

(앞으로 긴 질문, 간단한 tl, 아래쪽에 dr). 어떤으로, "0.1 : MYLIB com.example"-두 개의 ScalaJS SBT 프로젝트간에 DependsOn 사용

내가 SBT와 내장이 개 ScalaJS 프로젝트가 다음 디렉토리 구조

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에서 "MyApp를"과 "MYLIB가"라는 이슈를 수출 myapp에 대한 libraryDependency로 사용되었습니다.

myapp 및 mylib는 별도의 저장소에 있으며 자체 빌드 파일을 포함하며 완전히 개별적으로 빌드 할 수 있어야합니다. 즉, 개별 빌드 구성을 포함해야합니다.

생산시에는 별도로 을 작성하여 myapp을 별도로 제작하기 전에 메이븐 인공물로 게시해야합니다.

그러나 개발 중에 각 변경 후에 publishLocal을 사용할 필요없이 둘을 병렬로 개발할 수 있도록 이들을 부모 SBT 프로젝트에 병합 할 수 있기를 바랍니다. appJVM, appJS, libJVMlibJS - 전통 (안 scalajs)에서

사업이
$ROOT/build.sbt: 

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

그러나 ScalaJS, 우리는 실제로 각 모듈 내부에 두 개의 프로젝트가 매우 쉬울 것이다. 따라서 위의 구성은 집합 루트 프로젝트 만 찾고 실제로 dependsOn 구성을 실제 JVM 및 JS 프로젝트에 적용하지 않습니다.

이상적으로는 불행하게도이 다음

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

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

처럼 뭔가를 할 수 있도록하고 싶습니다

(각 build.sbt 즉 MyApp를하고 MYLIB 두 개의 프로젝트, 집계 루트 프로젝트가 포함) 단지 서브 프로젝트 자체를 임포트하는 대신 루트 내에 새로운 프로젝트를 생성합니다.

또한

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

(예) 경로의 다양한 조합을 시도했다 그러나 이것은 궁극적으로 내가 같은 대항 실행 계속 mylib

에 build.sbt 파일의 구성을 볼 수 없습니다

문제 - 기존 다중 프로젝트 SBT 프로젝트를 부모 sbt 파일로 가져올 때 루트 프로젝트를 가져 오지만 dependsOn 구성을 추가 할 수있는 방식으로 기존 다중 모듈 SBT 파일에서 하위 프로젝트를 가져 오는 방법을 제공하지 않습니다. 그것에.

TL, 나는 정의 된 여러 프로젝트와

  • root/mylib/build.sbt

정의 된 여러 프로젝트와

  • root/myapp/build.sbt이있는 경우 박사

    대신 root/build.sbt로 개별 하위 프로젝트를 가져 오는 것이 가능 하위 프로젝트의 루트 프로젝트?

    즉 다중 프로젝트 빌드의 두 레이어를 가질 수 있습니까?

  • +0

    내 scalajs와 SBT의 지식은 정확히 세 내가 JVM과 JS 사이의 분할이 scalajs 프로젝트, 또는 무엇을 의미에 대한하지만 내 플러그인 버전 0.6.4 도입되었을 때 모르는 이 작업을 수행 할 것입니다 : 1)이 부분적 경우에 도움이 알려줘이 에 따라 2) 응용 프로그램의 fastOptJs 작업을 확인 앱에 lib 디렉토리에서 lib 디렉토리에 복사 출력의 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") 
    
    관련 문제