gpt4 book ai didi

scala - 如何将输入解析器与 fullRunInputTask 结合起来?

转载 作者:行者123 更新时间:2023-12-01 04:48:49 24 4
gpt4 key购买 nike

在我的 build.sbt 中,我想要一个带有调用 main 的输入参数的任务。方法在我的代码中,但我想要参数 解析 在调用方法之前。

这是 InputKey 定义:

val clearDatabase = inputKey[Unit]("Clear database, arguments:  endpoint user password")

我想使用的解析器:
val databaseTaskParser = sbt.Def.spaceDelimited("endpoint username password").map(_.toList).map {
case List(endpoint) => (endpoint, "", "")
case List(endpoint, username, password) => (endpoint, username, password)
case _ =>
sys.error("Supported arguments: \"endpoint\" or \"endpoint username password\"")
}

然后我知道要将输入参数传递给 main 方法,我需要使用 fullRunInputTask使用上面定义的 InputKey 参数化:
fullRunInputTask(clearDatabase, Compile, "my.code.ClearDatabaseTask")

现在,我如何将调用组合到 fullRunInputTask使用 databaseTaskParser (在给出一组错误的参数时显示错误) 甚至之前 main方法被调用?

最佳答案

好吧,我自己找到了方法。

这里最重要的是我需要使用 运行任务 而不是 fullRunInputTask ,但我需要将它包装在 中动态输入任务为了使用解析器。然后我需要evaluate获取 InputTask我的值(value) inputKey .

所以实际的任务定义是:

clearDatabase := Def.inputTaskDyn {
runTask(Compile, "my.code.ClearDatabaseTask", databaseTaskParser.parsed:_*)
}.evaluated

现在我还需要修改解析器,使其不返回元组,而是返回列表或序列,但仍要验证是否传递了正确数量的参数。我是这样做的:
val databaseTaskParser = sbt.Def.spaceDelimited("endpoint username password").map(_.toList).map {
case args if List(1, 3).contains(args.length) => args.padTo(3, "")
case _ =>
sys.error("Supported arguments: \"endpoint\" or \"endpoint username password\"")
}

这可以解决问题: sbt clearDatabase如果给定零个或两个参数,则失败并运行 main my.code.ClearDatabaseTask 中的方法如果给出一或三个参数,则传递所有参数,无需在该方法内进行额外验证。

关于scala - 如何将输入解析器与 fullRunInputTask 结合起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43871246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com