加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:46:04 所属栏目:安全 来源:网络整理
导读:在我的build.sbt中,我想要一个带有输入参数的任务,在我的代码中调用main方法,但是我想在调用方法之前解析参数. 这是InputKey定义: val clearDatabase = inputKey[Unit]("Clear database,arguments: endpoint user password") 我想使用的解析器: val databa
在我的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,password)
  case _ =>
    sys.error("Supported arguments: "endpoint" or "endpoint username password"")
}

然后我知道要将输入参数传递给main方法,我需要使用与上面定义的InputKey参数化的fullRunInputTask:

fullRunInputTask(clearDatabase,Compile,"my.code.ClearDatabaseTask")

现在,即使在调用main方法之前,如何将对fullRunInputTask的调用与使用databaseTaskParser(在给出错误的参数集时显示错误)相结合?

解决方法

好的,我自己也找到了一种方法.

这里最重要的是我需要使用runTask而不是fullRunInputTask,但是我需要将它包装在动态输入任务中才能使用解析器.然后我需要对它进行评估以获取inputKey的InputTask值.

所以实际的任务定义是:

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就会失败并在my.code.ClearDatabaseTask中运行main方法,如果给出一个或三个,则传递所有参数,而不需要在该方法中进行额外的验证.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读