SBT插件:如何在编译前自动执行自定义任务
让SBT Autoplugin的自定义任务在编译前自动执行的方案
你完全不需要重写compile命令!SBT的任务依赖机制就能完美解决这个问题,而且这是更符合SBT设计理念的做法——通过给compile任务添加前置依赖,让它在执行前自动触发你的自定义配置生成任务,使用插件的项目完全不用修改build.sbt。
具体实现步骤
先定义你的自定义任务
首先在插件里声明并实现生成配置文件的任务,比如:import sbt._ import Keys._ object MyConfigPlugin extends AutoPlugin { override def trigger = allRequirements // 确保插件自动应用到项目 val generateConfig = taskKey[Unit]("Generates default config file if it doesn't exist") generateConfig := { val configPath = baseDirectory.value / "src" / "main" / "resources" / "application.conf" if (!configPath.exists()) { // 写入默认配置内容 val defaultConfig = """ |app { | name = "DefaultApp" | port = 8080 |} """.stripMargin IO.write(configPath, defaultConfig) println(s"Generated default config at: ${configPath.getAbsolutePath}") } }给compile任务添加前置依赖
在插件的projectSettings里,让Compile阶段的compile任务依赖你的generateConfig任务:override def projectSettings: Seq[Setting[_]] = Seq( // 核心配置:让compile执行前先跑generateConfig Compile / compile := (Compile / compile).dependsOn(generateConfig).value ) }
额外说明
- 这样配置后,不仅直接执行
compile命令会触发你的任务,所有依赖compile的命令(比如run、test:compile等)也会自动前置执行generateConfig。 - 如果需要让Test阶段的编译也触发这个任务,只需再添加一行:
Test / compile := (Test / compile).dependsOn(generateConfig).value - 相比重写compile命令,这种依赖方式更灵活,也不容易和其他插件的配置冲突,是SBT官方推荐的任务编排方式。
内容的提问来源于stack exchange,提问作者Timothy Perrigo
相关产品推荐
相关产品推荐

