我正在使用SBT 0.13.2,我希望通过执行编译任务的方式触发我的任务。我知道我可以使用triggeredBy
方法实现此目的,如taskDefinition.triggeredBy(compile in Compile)
中所述。
我有build.sbt
我的自定义任务定义。
问题在于我无法理解为什么以下工作符合预期
val triggeredTask = taskKey[Unit]("Triggered by compile")
triggeredTask <<= Def.task {
println("TRIGGERED BY COMPILE")
}.triggeredBy(compile in Compile)
但是下一个不起作用(compile
执行得很好,但我的任务没有被触发)
val triggeredTask = taskKey[Unit]("Triggered by compile")
triggeredTask := Def.task {
println("TRIGGERED BY COMPILE")
}.triggeredBy(compile in Compile).value
我的理解是SBT 0.13使<<=
过时了,:=
就足够了。
答案 0 :(得分:1)
我可能会误解你要做的事情。
如果我让你的例子更加冗长,那就像这样:
val triggeredTaskKey = taskKey[Unit]("Triggered by compile")
val anonymousTask = Def.task {
println("TRIGGERED BY COMPILE")
}.triggeredBy(compile in Compile)
// I imagine the macro doing something like this
triggeredTaskKey <<= anonymousTask map (identity)
这也不会触发compile
上的匿名任务。
请注意,<<=
是set
的精美版本,用于提取位置信息。 set
只是Def.setting(key, value, position)
的别名,后者又创建了一个新的Setting
实例。请注意,内部创建的设置实例具有这3个参数的构造函数。
我认为sbt中没有办法声明没有键的设置(我可能在这里错了)。但是,您似乎想要创建一个没有密钥的设置(触发)。
这可能是由错误引起的,我不确定sbt是否应该递归地遍历依赖项以查找triggeredBy
中具有info
密钥的任务。但目前却没有(如trigger
method所示。
从理论上讲,你可以通过绑定到某个任意键的正确触发器来创建设置。我不确定这是怎么回事。
答案 1 :(得分:0)
我知道问题集中在SBT 0.13.x
上,但是如果SBT 1.3.4
this example仍然存在困惑,并且可以很好地完成addressing the v0.x bug:
lazy val task1 = taskKey[Unit]("task 1")
lazy val task2 = taskKey[Unit]("task 2")
task1 := println("Task 1")
task2 := println("Task 2")
task2 := (task2 triggeredBy task1).value
因此,键入task1
应该同时打印“任务1”和“任务2”。当然,您可以triggeredBy compile.In(Compile)
代替“ {task1”之类的自定义taskKey