我在build.sbt中定义了一个自定义任务:
val doSmth = taskKey[Unit]("smth")
doSmth := {
version := "1.0-SNAPSHOT"
}
但它不会改变版本。我真正想要的是拥有自定义sbt发布任务,它将发布与我添加的repo相同的版本。除此之外,普通sbt assembly
进程正在使用增量版本方案。所以我想创建任务,设置版本,执行sbt发布,然后将版本返回到以前的值。我已经做了所有事情,但在更改版本时被阻止了。有没有办法从build.sbt?
这有可能吗?我想我也可以从sbt publish
命令复制代码(就像有人在一个主题中提到的那样),但在我看来,这是最糟糕的解决方案。
由于
答案 0 :(得分:2)
version
是sbt中的设置。可能settings
和tasks
之间的区别是你需要在sbt中理解的第一件事,否则你将很难使用该工具。
设置是不可变的,并在sbt启动时(或多或少)初始化。在那之后,他们无法改变。另一方面,任务就像功能一样。每当你打电话给他们时,他们都会被重新评估。
您现在看到让任务改变设置是不可能的。它只是在sbt中没有意义。
但是,您可以做的是在任务的上下文中掩盖一个设置。这正是您对version in publish := "SNAPSHOT-1.0"
所做的。我不认为还有其他更好的方法可以做到这一点。
答案 1 :(得分:1)
我通过更改sbt publish
任务的版本找到了一个可能的解决方案,但它在SBT中真的很奇怪且不直观。例如,我试过
version := sys.env.getOrElse("BUILD_NUMBER", "1.0")
version in publish := "SNAPSHOT-1.0"
我还尝试使用以下方法在Test和Compile配置中定义不同的版本:
version in Compile := sys.env.getOrElse("BUILD_NUMBER", "1.0")
version in Test: = "SNAPSHOT-1.0
但我无法让它发挥作用。 SBT表现得很奇怪。是否可以在一个任务中使用某个设置的不同值而不是在所有其他任务中使用它的值?