8

我有一堂课:

class Options
{
    // Remainder omitted (verb1, verb2, verb3)
    [HelpVerbOption]
    public string GetUsage(string verb)
    {
        return HelpText.AutoBuild(this, verb);
    }
}

文档说:

[...] 如果用户请求帮助索引,解析器也会将 null 传递给主类 GetUsage(string):

$ git 帮助

如果用户明确请求如何使用特定动词的说明,则使用动词命令:

$ git 帮助提交

[...]

然后,我输入MyApp.exe help verb1了 ,但我只能看到基本帮助(看起来我输入了错误的动词、help动词或其他东西)。相反,我希望它显示与指定动词相关的帮助信息。为什么它不能正常工作?

4

1 回答 1

2

对我来说,它使用上述方法有效,但前提是我在没有--help-option 的情况下调用我的应用程序(例如MyApp batch)。当我使用MyApp --help batch行为时,正如您所描述的那样。

但是,我们似乎无法为help-option 工作。

编辑:我设法通过修改以下代码来完成这项工作Commandline.Parser.cs

private bool TryParseHelpVerb(string[] args, object options, Pair<MethodInfo, HelpVerbOptionAttribute> helpInfo, OptionMap optionMap)
{
    var helpWriter = _settings.HelpWriter;
    if (helpInfo != null && helpWriter != null)
    {
        if (string.Compare(args[0], helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)
        {
            // User explicitly requested help
            var verb = args.FirstOrDefault(); // <----- change this to args[1];
            if (verb != null)
            {
                var verbOption = optionMap[verb];
                if (verbOption != null)
                {
                    if (verbOption.GetValue(options) == null)
                    {
                        // We need to create an instance also to render help
                        verbOption.CreateInstance(options);
                    }
                }
            }
            DisplayHelpVerbText(options, helpInfo, verb);
            return true;
        }
    }

    return false;
}

问题出现在行

var verb = args.FirstOrDefault();

由于第一个参数 ( args[0]) 被解释为动词或更好的动作(如文档中所述)verb将始终在help这里。因此,我们将 this 替换为args[1]包含实际动词的内容,例如commit

EDIT2:为了使这项工作也适用,我们还应该从-character--help中修剪第一个 arg ( )args[0]-

if (string.Compare(args[0].Trim('-'), helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)
于 2016-09-06T11:06:09.867 回答