【问题标题】:Gradle/Kotlin equivalent to Python's InvokeGradle/Kotlin 相当于 Python 的 Invoke
【发布时间】:2019-11-22 07:57:48
【问题描述】:

我已经使用 Python 的 Invoke 几年了,我就是喜欢它。我可以使用文档快速编写构建任务,并自动解析自定义标志。我几乎完全消除了在 README 文件中编写 sn-ps 代码的需要,我认为这很棒。

我目前正在构建一个 Kotlin+Gradle 项目,并且正在寻找具有类似功能的插件/库。

使用 Gradle/Kotlin,您可以记录特定任务并将它们分组,但是为了定义自定义标志,默认方法是使用 -D-P 设置 Java 系统属性。这行得通,但与 Invoke 相比它还不够,因为我每次都必须检查该属性是否存在。

此外,似乎没有内置方法来记录每个自定义标志。

您知道可以与 Invoke 相媲美的插件/库吗?

【问题讨论】:

  • 为什么不只是一个 Makefile?否则,您可以使用 JVM 语言编写任何 CLI 解析器
  • @cricket_007 make 工作正常,但是,记录目标、使用自定义标志编写目标以及记录标志并不像使用 Invoke 那样容易。使用 make 我通常通过 env-vars 传递“自定义标志”,这是次优的,并且每次都需要检查是否设置了 env-var。 Invoke 为您完成所有无聊的工作。
  • @cricket_007 一般来说,我想避免为 JVM 语言构建 Invoke :) ...但是我也不愿意在基于 JVM 的项目中包含这个 Python 依赖项。
  • 我不知道有这么好的东西,但也许这已经足够接近了github.com/remkop/picocli

标签: python gradle kotlin build-automation


【解决方案1】:

我对 Invoke for Python 不熟悉,因此我可能不适合提供答案。但是,如果您想将值从命令行传递到 Gradle 任务,除了使用项目属性之外,还有其他方法。一种是指定自定义命令行标志。

如果这不是您所要求的,而是希望为您的最终应用程序(而不是构建系统)提供一个命令行解析器,那么就像 cmets 中已经提到的那样,Picocli 之类的东西就可以了。

这是一个用 Kotlin 编写的 Gradle 任务示例,它读取一个可选的命令行标志:

open class OptionsExample
@javax.inject.Inject constructor(objectFactory: ObjectFactory) : DefaultTask() {
    @get:Internal
    @Option(option = "name", description = "Who to say hello to.")
    val name = objectFactory.property<String>()

    init {
        group = "example"
        description ="Says hello."
    }

    @TaskAction
    fun printMessage() {
        logger.lifecycle("Hello ${name.getOrElse("stranger")}")
    }
}

tasks.register("hello", OptionsExample::class)

这将注册一个名为 hello 的任务,该任务会打印由标志给出的名称,或者它不存在的默认消息。

不带标志执行时:

$毕业你好 > 任务:你好 你好,陌生人 在 2 秒内构建成功 1 个可操作的任务:1 个已执行

使用标志执行时:

$ gradle hello --name 世界 > 任务:你好 你好世界 在 1 秒内构建成功 1 个可操作的任务:1 个已执行

打印帮助页面时:

$ gradle -q help --task 你好 hello的详细任务信息 小路 :你好 类型 选项示例 (Build_gradle$OptionsExample) 选项 --name 向谁问好。 描述 打招呼。 团体 例子

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2018-05-16
    • 2018-05-27
    • 2017-06-22
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多