Sbt 1.1.4版本中子项目源文件夹无法自动创建问题咨询
解决sbt子项目源文件夹自动创建的问题
针对你使用sbt 1.1.4遇到的子项目源文件夹无法自动创建的问题,这里有几个实用的解决办法:
方法1:自定义sbt任务自动生成源目录
你可以在构建配置中添加一个自定义任务,让sbt在编译或初始化阶段自动创建所需的源文件夹。修改你的build.sbt如下:
val testDeps = Seq( "org.scalactic" %% "scalactic" % "3.0.5", "org.scalatest" %% "scalatest" % "3.0.5" % "test" ) // 定义创建源目录的任务 def createSourceDirsTask = taskKey[Unit]("Creates default source directories for subprojects") createSourceDirsTask := { val baseDirs = Seq( (baseDirectory.value / "src" / "main" / "scala"), (baseDirectory.value / "src" / "main" / "resources"), (baseDirectory.value / "src" / "test" / "scala"), (baseDirectory.value / "src" / "test" / "resources") ) baseDirs.foreach(dir => if (!dir.exists()) IO.createDirectory(dir)) } // 将创建目录任务绑定到compile任务之前,确保编译前目录已存在 compile in Compile := (compile in Compile).dependsOn(createSourceDirsTask).value libraryDependencies ++= testDeps lazy val root = project.in(file(".")) .aggregate( common, analytics, website ) .settings(createSourceDirsTask) lazy val common = project.in(file("common")) .settings( libraryDependencies ++= testDeps, createSourceDirsTask ) lazy val analytics = project.in(file("analytics")) .dependsOn(common) .settings(createSourceDirsTask) lazy val website = project.in(file("website")) .settings(createSourceDirsTask)
这样每次执行sbt compile时,sbt会自动检查并创建所有缺失的标准源目录。
方法2:用sbt内置命令手动生成(快速临时方案)
如果只是一次性需要创建目录,可在sbt交互模式下执行以下命令,为指定子项目生成目录:
# 为common子项目创建主源码目录 sbt "common/run mkdir -p src/main/scala" # 为analytics子项目创建测试源码目录 sbt "analytics/run mkdir -p src/test/scala"
这种方法适合临时补全目录结构,无需修改构建配置。
方法3:借助sbt脚手架插件
如果经常需要新建子项目并自动生成目录结构,可以使用sbt-scaffold插件(sbt 1.1.4兼容其0.2.0版本)。在project/plugins.sbt中添加:
addSbtPlugin("com.eed3si9n" % "sbt-scaffold" % "0.2.0")
之后在sbt交互模式下执行scaffold命令,就能自动为当前项目生成标准的源目录结构。
需要说明的是,sbt本身默认不会自动创建源目录——它假设用户会手动或通过脚手架工具初始化目录,上述方法可以很好地满足自动生成的需求。
内容的提问来源于stack exchange,提问作者flybonzai
相关产品推荐
相关产品推荐

