2015-05-17 62 views
0

我想在我的项目中使用scopt3但我得到编译错误甚至scopt3 Github的页面上的示例代码:scopt3示例脚本不能编译

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)不发现类型配置
我认为它是com.typesafe.config.Config,但是当我导入时我得到“velue副本不是com.typesafe.config.Config的成员”。 Config从哪里来?

2)未找到值富
所有参数.copy()方法被标记为“未找到值”(我想是因为在配置以前的错误)

我在斯卡拉2.11。 6/SBT 0.13.8

任何帮助?

回答

0

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"))