是否可以禁用发布而不在sbt中禁用publishLocal?

时间:2019-09-13 21:31:28

标签: sbt

我有一个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
}

警告该任务总是被评估。

有没有办法做到这一点?

1 个答案:

答案 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范围前缀