SBT未自动检测跨项目源代码变更并重新编译问题
SBT无法正确检测源代码变更并重新编译
我正在构建一个包含两个项目的多项目工程:
- cli:作为根项目的命令行界面,仅支持JVM,用于调用lib库
- lib:跨平台项目(同时支持JVM和JS),供
cli调用,需单独发布
最小示例的build.sbt文件如下:
ThisBuild / scalaVersion := "3.3.1" lazy val lib = crossProject(JSPlatform, JVMPlatform) .crossType(CrossType.Full) .in(file("lib")) .jsSettings(scalacOptions ++= Seq("-scalajs")) lazy val cli = (project in file(".")) .dependsOn(lib.jvm) .aggregate(lib.jvm, lib.js)
位于lib/shared/src/main/scala/mylib/MyLib.scala的库代码为:
package mylib object MyLib { val life = 42 + 0 }
位于src/main/scala/myapp/Main.scala的命令行入口代码为:
package myapp object Main { def main(args: Array[String]): Unit = { println(mylib.MyLib.life) } }
在SBT中运行程序,输出为42。但当我将life的定义修改为life = 42 + 1并重新运行程序时,输出仍为42。
测试中,我于16:02修改了MyLib.scala,16:05重新运行程序。lib/jvm/target目录下的MyLib类文件已更新,但./target目录下的对应类文件未更新,文件时间戳如下:
-rw-r--r-- 1 bwbecker staff 695 7 Mar 16:05 ./lib/jvm/target/scala-3.3.1/classes/mylib/MyLib$.class -rw-r--r-- 1 bwbecker staff 280 7 Mar 16:05 ./lib/jvm/target/scala-3.3.1/classes/mylib/MyLib.class -rw-r--r-- 1 bwbecker staff 52 7 Mar 16:02 ./lib/shared/src/main/scala/mylib/MyLib.scala -rw-r--r-- 1 bwbecker staff 107 7 Mar 15:19 ./src/main/scala/myapp/Main.scala -rw-r--r-- 1 bwbecker staff 1002 7 Mar 15:52 ./target/scala-3.3.1/classes/myapp/Main$.class -rw-r--r-- 1 bwbecker staff 296 7 Mar 15:52 ./target/scala-3.3.1/classes/myapp/Main.class -rw-r--r-- 1 bwbecker staff 695 7 Mar 15:59 ./target/scala-3.3.1/classes/mylib/MyLib$.class -rw-r--r-- 1 bwbecker staff 280 7 Mar 15:59 ./target/scala-3.3.1/classes/mylib/MyLib.class
操作仅使用sbt和vi,无IDE干扰。我推测是build.sbt配置有误,已查阅SBT文档及相关StackOverflow文章,但未发现问题,怀疑与crossProject有关。
使用环境:SBT v1.9.7升级至1.9.9问题依旧,MacOS 14.2.1,openjdk 17.0.9。
内容的提问来源于stack exchange,提问作者bwbecker
相关产品推荐
相关产品推荐

