如何使用 Mono.GetOptions?

Mono.GetOptions 是做什麼的?問的好。
如果你曾經在 Linux 下開發過 console 應用程式,相信你對於getopt這個 library 應該不陌生才對。
Mono.GetOptions 就是一個類似 getopt 的組件。

這裡主要是介紹怎麼使用,下面就列出步驟:

  1. 安裝Mono
  2. 在 AssemblyInfo.cs 裡面加入:
    //填入簡單的用法說明,顯示 help 時會用到
    [assembly: Mono.UsageComplement("[-t:param] [-o] [-h] [-v] [-u]")]
    //填入關於這程式的說明,也是顯示 help 時會用到
    [assembly: Mono.About("A sample about how to use Mono.GetOptions")]
    //作者
    [assembly: Mono.Author("your_name")]
    //有錯誤時可以通報誰,可填可不填
    [assembly: Mono.ReportBugsTo("your_name@your_domain.com")]
    //更詳細的說明,可填可不填
    [assembly: Mono.AdditionalInfo("This is a sample about how to use Mono.GetOptions.  It's only a small program.  If you want to know more about Mono.GetOptions, you can hack Mono.GetOptions source code.")]
    //是屬於哪個套件,可填可不填
    [assembly: Mono.IsPartOfPackage("Samples")]
    

    然後在原來的地方應該會有這些:

    [assembly: AssemblyTitle("Mono.GetOptions Sample")]
    [assembly: AssemblyProduct("getoptions_sample")]
    [assembly: AssemblyCopyright("your_name or your_organization")]
    [assembly: AssemblyVersion("1.0.*")]
    

    請記得都填入。

  3. 引用 Mono.GetOptions 組件,用SharpDevelop的話,可以很方便的選 Add mono reference。
  4. 記得 using Mono.GetOptions。
    using Mono.GetOptions;
  5. 新增一個類別,繼承 Options。
    using System.Collections.Generic;
    class ProgramOptions : Options
    {
    private string _outputFolder = "output";
    public string OutputFolder
    {
    get { return _outputFolder; }
    set { _outputFolder = value; }
    }
    private List _templateFolders;
    // 表示最多容許兩個,參數可以用 -t 或是 --template
    // 用法大致是 -t:test 或 --template:test
    [Option(2, "Template folder, default is 'default'", 't', "template")]
    public WhatToDoNext DoTemplate( string s )
    {
    //Console.WriteLine( "template={0}", s );
    _templateFolders.Add( s );
    return WhatToDoNext.GoAhead;
    }
    // 預設只容許一個,參數是 -o 或 --output
    [Option("Output folder, default is 'output'", 'o', "output")]
    public WhatToDoNext DoOutput( string s )
    {
    //Console.WriteLine( "output={0}", s );
    _outputFolder = s;
    return WhatToDoNext.GoAhead;
    }
    public ProgramOptions()
    {
    // 表示同時接受 Linux / Windows 的命令列常態用法
    this.ParsingMode = OptionsParsingMode.Both;
    _templateFolders = new List();
    }
    }
    
  6. 在 Main 裡面使用剛剛新增的類別:
    ProgramOptions options = new ProgramOptions();
    options.ProcessArgs(args);
    foreach( string s in options.TemplateFolders )
    Console.WriteLine( "Template folder = {0}", s );
    Console.WriteLine( "Output folder = {0}", options.OutputFolder );
    

    就這麼簡單。

  7. Build 以後,你可以在命令列模式或是 linux 的 console 模式下試試看了~這邊我假設你編譯出來的目的檔是 your_program:
    $your_program -h
    $your_program --help
    $your_program --template:t1 --template:t2 --output:o1
    $your_program -t:t1 -t:t2 -o:o1
    $your_program -u
    $your_program -V
    $your_program --version
    

getopt有興趣的話,可以參考getopt
這是對岸同志寫的介紹,很簡短:

  • Mono项目提供的一个控制台程序辅助包GetOptions – 自由、创新、研究、探索…… – 博客园
  • 這篇也是 Tutorial,寫的很好:The PumaCode.org Blog :: GetOpt style command line processing in C# with Mono.GetOptions