8

У меня есть класс:HelpVerbOption не работает - Командная строка Parser C#

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

В this документации (в последней части) говорит:

... Анализатор будет проходить нуль в мастер-класс GetUsage (строка) также если пользователь просил индекс справки с:

$ мерзавец помощь

или команда глагола, если пользователь запросил в явном инструкции о том, как использовать конкретный глагол:

$ мерзавец помощи совершить

...

Я пытаюсь типа: MyApp.exe help verb1 но видеть только базу help (как будто я набираю неправильный глагол, или help глагол, или что-то еще). Но я хочу увидеть справочное сообщение, относящееся к указанному глаголу. Почему это не работает?

В ваших приложениях эта функция работает правильно?

ответ

2

Для меня это работает с использованием указанного подхода, но только если я вызываю свое приложение без --help -option (например, MyApp batch). Когда я использую MyApp --help batch, поведение будет таким, как описано вами.

Однако мы не можем работать так же, как для help -option.

EDIT: Мне удалось получить эту работу, изменяя код 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 здесь. Поэтому мы заменяем это на args[1], который содержит действительный глагол, например commit.

EDIT2: Для того, чтобы сделать эту работу для --help также мы также должны урезать первый Arg (args[0]) от - -character

if (string.Compare(args[0].Trim('-'), helpInfo.Right.LongName, GetStringComparison(_settings)) == 0) 
+0

Можете ли вы помочь мне сделать это изменение в моем проекте? Я использую 'CommanLine' в качестве библиотеки. Поэтому я не могу изменить его исходный код. Затем я клонирую репо из git и пытаюсь найти функцию «TryParseHelpVerb» или «DisplayHelpVerbText», но ничего не могу найти. Что мне нужно сделать? – gek0n

+1

Загрузите исходный код, измените его соответствующим образом и создайте его как lib. – HimBromBeere

+0

Для всех, кого я должен заметить: вам нужно изменить и скомпилировать «стабильную» ветвь. Когда он успешно скомпилирован, вам необходимо заменить эти библиотеки в папке «bin \ debug» и в папке «packages \ CommandLineParser \ lib \ net45». Удачи! – gek0n

Смежные вопросы