【问题标题】:Is it possible to disable publish without disabling publishLocal in sbt?是否可以在不禁用 sbt 中的 publishLocal 的情况下禁用发布?
【发布时间】:2019-09-15 23:47:14
【问题描述】:

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

给出任务总是被评估的警告。

有没有办法做到这一点?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    此代码的问题在于,无论if 结构如何,它都会评估publish.value。我建议阅读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 相同,你应该在上面代码中每次提到publish 的地方添加这个Docker/ 范围前缀。

    【讨论】:

    • publish/skippublishLocal/skip 不同的值,这符合我的希望吗?
    • 是的,它们是不同的。 skip 是一个设置,当你写publish/skip 时,你的范围是publish 任务,所以只有那个任务应该考虑它。我从未将它与publishLocal 一起使用,但我希望它能够以相同的方式工作。试试看。
    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多