8

私はScalaにかなり慣れていないので、JRubyを使用して数分で作成した次のようなものを提供する非常に単純なコマンドラインパーサーを構築する必要があります。

java -jar demo.jar --help

Command Line Example Application

Example: java -jar demo.jar --dn "CN=Test" --nde-url "http://www.example.com" --password "password"

For usage see below:

    -n http://www.example.com
    -p, --password             set the password
    -c, --capi                 set add to Windows key-store
    -h, --help                 Show this message
    -v, --version              Print version

ホタテはうまくいくように見えますが、うまくいく簡単な例を見つけることができないようです!私が見つけたすべての例は断片化されているようで、何らかの理由で機能しません。

アップデート

この例は機能することがわかりましたが、mainメソッド内の実際の引数にバインドする方法がわかりません。

import org.rogach.scallop._; 

object cmdlinetest {
  def main(args: Array[String]) 

    val opts = Scallop(List("-d","--num-limbs","1"))
      .version("test 1.2.3 (c) 2012 Mr Placeholder")
      .banner("""Usage: test [OPTION]... [pet-name]
                |test is an awesome program, which does something funny
                |Options:
                |""".stripMargin)
      .footer("\nFor all other tricks, consult the documentation!")
      .opt[Boolean]("donkey", descr = "use donkey mode")
      .opt("monkeys", default = Some(2), short = 'm')
      .opt[Int]("num-limbs", 'k',
      "number of libms", required = true)
      .opt[List[Double]]("params")
      .opt[String]("debug", hidden = true)
      .props[String]('D',"some key-value pairs")
      // you can add parameters a bit later
      .args(List("-Dalpha=1","-D","betta=2","gamma=3", "Pigeon"))
      .trailArg[String]("pet name")
      .verify

    println(opts.help)
  }
}
4

3 に答える 3

8

さて、私はもっと例を追加しようとします:)

この場合、ScallopConfを使用する方がはるかに優れています。

import org.rogach.scallop._

object Main extends App {
  val opts = new ScallopConf(args) {
    banner("""
NDE/SCEP Certificate enrollment prototype

Example: java -jar demo.jar --dn CN=Test --nde-url http://www.example.com --password password

For usage see below:
    """)

    val ndeUrl = opt[String]("nde-url")
    val password = opt[String]("password", descr = "set the password")
    val capi = toggle("capi", prefix = "no-", descrYes = "enable adding to Windows key-store", descrNo = "disable adding to Windows key-store")
    val version = opt[Boolean]("version", noshort = true, descr = "Print version")
    val help = opt[Boolean]("help", noshort = true, descr = "Show this message")

  }

  println(opts.password())
}

それは印刷します:

$ java -jar demo.jar --help

NDE/SCEP Certificate enrollment prototype

Example: java -jar demo.jar --dn CN=Test --nde-url http://www.example.com --password password

For usage see below:

  -c, --capi              enable adding to Windows key-store 
      --no-capi           disable adding to Windows key-store 
      --help              Show this message 
  -n, --nde-url  <arg>     
  -p, --password  <arg>   set the password 
      --version           Print version 
于 2012-10-25T15:18:40.370 に答える
1

ドキュメントを読みましたか?getあなたがしなければならないのはあなたが望むそれぞれのオプションを呼び出すことだけのようです:

def get [A] (name: String)(implicit m: Manifest[A]): Option[A]

メソッド呼び出しで期待されるリターンタイプを指定する必要があるようです。次のようなものを試してください。

val donkey = opts.get[Boolean]("donkey")
val numLimbs = opts.get[Int]("num-limbs")
于 2012-10-25T02:18:06.467 に答える
0

コマンドライン引数を解析するための迅速で汚い方法を探しているだけの場合は、引数を解析するための非常に必要最低限​​の方法であるpirateを使用できます。上記で説明した使用法を処理すると、次のようになります。

import com.mosesn.pirate.Pirate

object Main {
  def main(commandLineArgs: Array[String]) {
    val args = Pirate("[ -n string ] [ -p string ] [ -chv ]")("-n whatever -c".split(" "))
    val c = args.flags.contains('c')
    val v = args.flags.contains('v')
    val h = args.flags.contains('h')
    val n = args.strings.get("n")
    val p = args.strings.get("p")

    println(Seq(c, v, h, n, p))
  }
}

もちろん、あなたのプログラムでは、commandLineArgsの代わりに合格します"-n whatever -c"

残念ながら、pirateはGNUスタイルの引数も、バージョンやヘルプテキストのオプションもまだサポートしていません。

于 2012-10-25T05:01:23.680 に答える