我有一个sbt
项目,其中docker:publishLocal
将在我的机器上创建一个用于测试的docker映像,而docker:publish
会将映像发布到存储库,还发布构建中的jar文件到存储库。
如果我的项目是快照,我想禁用发布到存储库,同时仍然能够构建本地映像。
ThisBuild / publishArtifact := ! isSnapshot.value
对publish
命令执行正确的操作,但是它也会禁用publishLocal
。
我想写类似
if (isSnapshot.value) {
publish := { }
}
但这给了我一个我根本不理解的错误:
[info] Loading project definition from /Users/dev/project
/Users/dev/build.sbt:1: error: type mismatch;
found : Unit
required: sbt.internal.DslEntry
if (isSnapshot.value) {
^
过去的经验表明,重新定义publish
以有条件地调用原始版本是不可能的,因为
publish := {
if (!isSnapshot.value) publish.value
}
警告该任务总是被评估。
有没有办法做到这一点?
答案 0 :(得分:0)
此代码的问题在于,不管publish.value
结构如何,它都对if
求值。我建议阅读task dependencies上的文档。如果要“延迟” if
分支之一中的任务评估,则需要使用dynamic task定义:
publish := Def.taskDyn {
if (isSnapshot.value)
Def.task {} // doing nothing
else
Def.task { publish.value } // could be written as just publish
}.value
但是除了修复代码外,您还应该意识到,针对您想要的功能有一个特殊的设置,称为skip
:
publish/skip := isSnapshot.value
要注意的另一件事是scoping。如果您想覆盖docker:publish
(与新语法中的Docker/publish
相同),则应在上面的代码中每次提及Docker/
时,都添加此publish
范围前缀