Пример сценария scopt3 не компилируется

Я пытаюсь использовать scopt3 в своем проекте, но получаю ошибки компиляции даже для примера кода на странице scopt3 Github:

val parser = new scopt.OptionParser[Config]("scopt") {
  head("scopt", "3.x")
  opt[Int]('f', "foo") action { (x, c) =>
    c.copy(foo = x) } text("foo is an integer property")
  opt[File]('o', "out") required() valueName("<file>") action { (x, c) =>
    c.copy(out = x) } text("out is a required file property")
  opt[(String, Int)]("max") action { case ((k, v), c) =>
    c.copy(libName = k, maxCount = v) } validate { x =>
    if (x._2 > 0) success else failure("Value <max> must be >0") 
  } keyValueName("<libname>", "<max>") text("maximum count for <libname>")
  opt[Seq[File]]('j', "jars") valueName("<jar1>,<jar2>...") action { (x,c) =>
    c.copy(jars = x) } text("jars to include")
  opt[Map[String,String]]("kwargs") valueName("k1=v1,k2=v2...") action { (x, c) =>
    c.copy(kwargs = x) } text("other arguments")
  opt[Unit]("verbose") action { (_, c) =>
    c.copy(verbose = true) } text("verbose is a flag")
  opt[Unit]("debug") hidden() action { (_, c) =>
    c.copy(debug = true) } text("this option is hidden in the usage text")
  note("some notes.\n")
  help("help") text("prints this usage text")
  arg[File]("<file>...") unbounded() optional() action { (x, c) =>
    c.copy(files = c.files :+ x) } text("optional unbounded args")
  cmd("update") action { (_, c) =>
    c.copy(mode = "update") } text("update is a command.") children(
    opt[Unit]("not-keepalive") abbr("nk") action { (_, c) =>
      c.copy(keepalive = false) } text("disable keepalive"),
    opt[Boolean]("xyz") action { (x, c) =>
      c.copy(xyz = x) } text("xyz is a boolean property"),
    checkConfig { c =>
      if (c.keepalive && c.xyz) failure("xyz cannot keep alive") else success }
  )
}

ошибки:

1) не найден тип Config
Я подумал, что это был com.typesafe.config.Config, но когда я импортирую, я получаю "velue copy не является членом com.typesafe.config.Config". Откуда приходит Config?

2) не найдено значение foo
Все аргументы метода.copy() помечены как "не найденные значения" (я полагаю, это связано с предыдущей ошибкой в ​​Config)

Я на скале 2.11.6 / SBT 0.13.8

Любая помощь?

1 ответ

Решение

scopt не имеет ничего общего с typesafe-config.

Если вы внимательно прочитали README, вы заметите, что Config определяется прямо перед кодом, который вы вставляете здесь:

case class Config(foo: Int = -1, out: File = new File("."), xyz: Boolean = false,
  libName: String = "", maxCount: Int = -1, verbose: Boolean = false, debug: Boolean = false,
  mode: String = "", files: Seq[File] = Seq(), keepalive: Boolean = false,
  jars: Seq[File] = Seq(), kwargs: Map[String,String] = Map())

Это просто пример объекта, который содержит все параметры программы.

Идея в том, что вы параметризуете OptionParser с любым объектом конфигурации, который вы хотите. Например

case class Foo(name: String)

val parser = new scopt.OptionParser[Foo]("foo") {
  opt[String]('n', "name") action { (n, foo) => foo.copy(name = n) }
}
val res = parser.parse(args, Foo("default")) 
Другие вопросы по тегам