Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个ScalaJS SBT项目之间使用DependsOn 太长了,读不下去了。简化的TL;底部的DR)。_Scala_Sbt_Scala.js - Fatal编程技术网

在两个ScalaJS SBT项目之间使用DependsOn 太长了,读不下去了。简化的TL;底部的DR)。

在两个ScalaJS SBT项目之间使用DependsOn 太长了,读不下去了。简化的TL;底部的DR)。,scala,sbt,scala.js,Scala,Sbt,Scala.js,我有两个用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的库依赖

我有两个用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
的库依赖项

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

在生产中,它们将单独构建,
mylib
在单独构建
myapp
之前首先作为maven工件发布

然而,在开发过程中,我希望能够将它们合并到父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)
不幸的是,这只是在根目录中创建新项目,而不是导入子项目本身

我还尝试了各种路径组合(例如)

但是在
mylib的build.sbt文件中看不到配置

最终,我还是遇到了同样的问题——当将现有多项目SBT项目导入父SBT文件时,它会导入根项目,但似乎没有提供一种从现有多模块SBT文件导入子项目的方法,这种方法允许我向其添加
dependsOn
配置

tl;博士

如果我有

  • root/mylib/build.sbt
    定义了多个项目
  • root/myapp/build.sbt
    定义了多个项目
是否可以将单个子项目导入到
root/build.sbt
中,而不是从子模块导入根项目


i、 我可以有两层多项目构建吗

在花了大量时间挖掘SBT源代码之后,我终于找到了一个解决方案。这不干净,但很管用。(对于奖励积分,它将正确导入IntelliJ)

//将此函数添加到根build.sbt文件中。
//它可用于定义任何
//`ProjectRef`不需要完整的项目定义。
def addDep(from:String,to:String)={

Global中的buildDependencies我的scalajs和sbt知识已经整整一年了,我不知道jvm和js之间的分离是什么时候为scalajs项目引入的,甚至不知道这意味着什么,但对于我的插件版本0.6.4,我会这样做:1)创建一个复制器任务,该任务依赖于库的fastOptJs任务,并将输出从库复制到应用程序2)Make app的fastOptJs任务依赖于此,请让我知道这是否部分有帮助,在这种情况下,我可以尝试提供更多帮助。
lazy val mylibJVM = project.in(file("mylib/jvm"))
// 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")