gpt4 book ai didi

scala - 在两个 ScalaJS SBT 项目之间使用 DependsOn

转载 作者:行者123 更新时间:2023-12-03 17:40:08 25 4
gpt4 key购买 nike

(前面的问题很长。简化的tl;底部的博士)。

我有两个使用 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.example:mylib:0.1”的工件,用作 myapp 的 libraryDependency .

myapp 和 mylib 位于不同的存储库中,包含它们自己的构建文件,并且应该能够完全独立地构建(即它们必须包含自己的单独构建配置)。

在生产中,它们将使用 mylib 单独构建。在构建 myapp 之前首次作为 maven 工件发布分别地。

然而,在开发中,我希望能够将它们合并到父 SBT 项目中,以便可以并行开发两者,而无需使用 publishLocal每次更改后。

在传统(不是 scalajs)项目中,这将非常容易
$ROOT/build.sbt:

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

然而在 ScalaJS 中,我们实际上在每个模块中有两个项目 - appJVM , appJS , libJVMlibJS .因此,上述配置仅找到聚合根项目,并没有正确应用 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而不是子模块的根项目?

    即我可以有两层多项目构建吗?

    最佳答案

    在花费大量时间挖掘 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")

    关于scala - 在两个 ScalaJS SBT 项目之间使用 DependsOn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38215087/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com