2011-10-12 109 views
7

我知道這個問題在這裏和其他地方被問過很多次,因爲我正在尋找答案。然而,它仍令我困惑,爲什麼命令行解析器庫不提供這種常見的使用場景,我有一組子命令,每個子命令都有自己的一組必需和可選參數。類似的構造可以在git/svn中找到,但是在他們的情況下,如果我沒有弄錯,子命令是獨立的程序。命令行分析器和缺少子命令和分組?

總之,我所尋求的是一種簡單的方法:

top_command subcmd_A [ command A's options ....] 
top_command subcmd_B [ command B's options ....] 
... 

在Java的世界裏,兩人經常提到的庫是Apache的命令CLI和司法制度評估方案。我沒有看到他們中的任何一位有這樣的想法 - 雖然你可能會調整和定製很多以適應......但是定義一個選項的基本流程,註冊......然後在最後解析它們都不會「如果考慮到不同子命令的情況,驗證和解析器需要以不同的方式運行。

也許這裏的常識是這個應用程序太具體,應該留給應用程序本身處理。我可以想到的一種方法是定義一個BaseCommand類,並且每個子命令都會擴展它並註冊它們自己......以便將其分解以便於管理。如果任何成熟的框架可以做到這一點,我會欣賞任何指針在這裏。

雖然我對當前解析器功能的理解可能是錯誤的,但非常感謝您的任何洞察。

奧利弗

回答

6

嗨只是看看到jcommander這正是支持所描述的場景。 您提到Commons CLI在版本1.X中是正確的,但是CLI2的開發也支持這一點,但不幸的是,這個版本從未發佈過。

+0

我不知道我錯過了這個圖書館,但它看起來很有趣。謝謝。 – Oliver

0

看一看cli-parsec。它的特點(除其他外)正是我相信你想要的:-) https://github.com/dr1fter/cli-parsec

它的功能任意嵌套的子命令(子命令可能有子命令等)。每個子命令都可以定義選項。一個簡單的例子在這裏給出(2子命令與單個選項): https://github.com/dr1fter/cli-parsec/wiki/Example

Maven的片段:

<dependency> 
    <groupId>de.dr1fter</groupId> 
    <artifactId>de.dr1fter.cli-parsec> 
    <version>0.2.1</version> 
</dependency> 
+0

基於您的鏈接的域名/ URL與您的用戶名相同或包含您的用戶名,您似乎已鏈接到您自己的網站。如果你這樣做,你需要透露它是你的網站。如果您不透露它是您自己的網站,則通常將其視爲垃圾郵件。請參閱:[**什麼意思是「良好」的自我推銷?](// meta.stackexchange.com/q/182212)和[如何不成爲垃圾郵件製造者](http://stackoverflow.com/help/promotion )。 – Makyen

1

picocli支持嵌套子命令到任意深度。

主命令定義全局選項,每個嵌套命令的級別都可以添加僅適用於該級別的選項。

CommandLine commandLine = new CommandLine(new MainCommand()) 
     .addSubcommand("cmd1", new ChildCommand1()) // 1st level 
     .addSubcommand("cmd2", new ChildCommand2()) 
     .addSubcommand("cmd3", new CommandLine(new ChildCommand3()) // 2nd level 
       .addSubcommand("cmd3sub1", new GrandChild3Command1()) 
       .addSubcommand("cmd3sub2", new GrandChild3Command2()) 
       .addSubcommand("cmd3sub3", new CommandLine(new GrandChild3Command3()) // 3rd 
         .addSubcommand("cmd3sub3sub1", new GreatGrandChild3Command3_1()) 
         .addSubcommand("cmd3sub3sub2", new GreatGrandChild3Command3_2()) 
           // etc 
       ) 
     ); 

您可能還喜歡它對ANSI樣式和顏色的使用幫助。

請注意,除了選項和位置參數外,使用幫助還列出了註冊的子命令。

enter image description here

的使用幫助,很容易與註釋定製。

enter image description here

  • 基於註解
  • 混帳風格子
  • 嵌套子子
  • 強類型選項參數
  • 強類型的位置參數
  • 自定義類型轉換
  • 多值選項
  • 一個字段有多少爭論消耗
  • 流利的API
  • POSIX風格的集羣短選項
  • GNU風格的長選項
  • 直觀的模型允許任何選項前綴
  • ANSI顏色使用幫助
  • 可自定義使用幫助
  • 單一源文件:包含源代碼以保持您的應用程序單個罐子