2016-07-06 5 views
5

(先に長い質問、簡略化されたtl、下段にdr)。2つのScalaJS SBTプロジェクトの間でDependsOnを使用する

私はSBTで構築された2つの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.example 0.1:MYLIB" という名前のアーティファクトをエクスポートして、そのmyappのlibraryDependencyとして使用されます。

myappとmylibは別々のリポジトリにあり、独自のビルドファイルを含み、完全に別々にビルドできる必要があります。つまり、独自のビルド設定が必要です。

生産時には、は、別にmyappをビルドする前に、mavenアーティファクトとして最初に公開されます。

しかし、私はこれらを親SBTプロジェクトにマージして、変更するたびにpublishLocalを使用することなく両方を並行して開発できるようにしたいと考えています。 appJVMappJSlibJVMlibJS - これはScalaJSでしかし

$ROOT/build.sbt: 

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

非常に簡単になり、伝統的な(ないscalajs)プロジェクトで

、我々は、実際には2つの各モジュール内のプロジェクトを持っています。そのため、上記の設定では、集約ルートプロジェクトのみが検出され、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ファイルにインポートするとき、ルートプロジェクトをインポートしますが、サブプロジェクトを既存のマルチモジュールSBTファイルからインポートしてdependsOn構成を追加できるようにはなりませんそれに。

TL;私は定義された複数のプロジェクトを持つ

  • root/mylib/build.sbt

定義された複数のプロジェクトを持つ

  • root/myapp/build.sbtをお持ちの場合は、DR

    ではなくroot/build.sbtに、個々のサブプロジェクトをインポートすることは可能ですサブプロジェクトからのルートプロジェクトの?

    つまり、マルチレイヤービルドのレイヤーを2つ用意できますか?

  • +0

    マイscalajsとSBTの知識は正確歳だと私は、JVMとJSの間で分割がscalajsのプロジェクトのために導入されたときに知っている、あるいはそれが何を意味するのかが、私のプラグインのバージョン0.6.4ではありません、Iこれを行うだろう: 1)が、これは部分的に、その場合には役立ちます場合は、私に教えてください。この に依存 2)アプリのfastOptJsタスクを作るのアプリにLIBからlibとコピー出力のfastOptJsタスクに依存コピータスクを作成しますIもっと助けようとすることができます。 – 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") 
    
    関連する問題