sbt - 为依赖于项目级别设置的所有项目定义任务
问题描述
我有一个包含许多子项目的大型 SBT 项目。我想添加一个任务,我可以为依赖于项目级设置(如name
)的任何项目运行该任务。
在以下示例中,我定义了一个myTask
仅打印项目名称的任务:
name := "test-project"
val myTask = taskKey[Unit]("")
ThisBuild / myTask := {
println((ThisProject / name).value)
}
val foo = project
val bar = project
我的意图是能够运行sbt foo/myTask
或sbt bar/myTask
执行相同的任务,但考虑到相应的项目设置。但是,如果我使用上面的项目定义来做这件事,我会被test-project
打印出来。
实现我的目标的预期方法是什么?
解决方案
您可以创建一个AutoPlugin
需要位于project
文件夹中的
import sbt._
import sbt.Keys._
object TestPlugin extends AutoPlugin {
object autoImport {
val myTask = taskKey[Unit]("Prints project name")
}
import autoImport._
override def trigger = allRequirements
override def projectSettings: Seq[Def.Setting[_]] = {
Seq(myTask := { println(name.value) })
}
}
由于没有依赖关系,它将自动启用allRequirements
,因此myTask
将附加到定义的所有子项目build.sbt
val foo = project
val bar = project
您可以分别使用命令sbt "foo/myTask"
和sbt "bar/myTask"
printfoo
来测试它bar
。
推荐阅读
- public-key-encryption - 如何使用 NaCl/Sodium 原语隐藏发件人的公钥?
- linux - 在 Linux 中识别跨多个文件的匹配行
- reactjs - 蚂蚁V3。表组件。如何计算列值的总和
- python-3.x - 如何在 Quart 中获取变量
- android - 通过我的应用程序将pdf发送到android 11中的whatsapp时出现发送失败错误
- regex - 如何编写正则表达式以匹配一组逗号分隔的键:值对?
- typescript - 尝试在 Windows 10 中使用 docker 上传容器时出错
- javascript - 如何切换回 Next.js 中的默认语言环境?
- java - 使用 android studio 开发电子邮件应用程序时如何从字段中指定
- aws-lambda - 从 sqs.tf 获取 aws_lambda_event_source_mapping 并在 lambda.tf 中使用