加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:28:55 所属栏目:安全 来源:网络整理
导读:(很久以前的问题.简化tl;底部是博士). 我有两个使用SBT构建的ScalaJS项目 – “myapp”和“mylib”,在以下目录结构中 root/build.sbtroot/myapp/build.sbtroot/myapp/jvm/root/myapp/js/root/myapp/shared/root/mylib/build.sbtroot/mylib/jvmroot/mylib/jsr
(很久以前的问题.简化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首先作为maven工件发布,然后单独构建myapp.

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

在传统(不是scalajs)项目中,这将非常容易

$ROOT/build.sbt:

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

但是在ScalaJS中,我们实际上在每个模块中都有两个项目 – appJVM,appJS,libJVM和libJS.因此,上述配置仅查找聚合根项目,并且未正确将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")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读