Подтвердить что ты не робот

NDesk.Options: как правильно регистрировать требуемые параметры?

Я пытаюсь использовать класс OptionSet следующим образом:

  string resultsFileName = null;
  bool isHelp = false;

  var p = new OptionSet() {
    { "r=|resultsFile=",  "The file with the results", v => { resultsFileName = v; } }
    { "h|help", "Show this help", v => { isHelp = (v != null); } },
  };

  try
  {
    p.Parse(args);
  }
  catch (OptionException e)
  {
    Console.WriteLine("Invalid arguments: " + e.Message);
    ShowHelp(p);
    return;
  }

Таким образом, ожидается, что потребуется опция resultsFile (согласно документации: http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionValueType.html). Однако, когда я запускаю программу как есть (т.е. Без аргументов командной строки), исключение не выбрасывается. Пожалуйста, помогите.

Обновление:. Он выглядит в отладчике, например, когда не заданы параметры командной строки, метод private void AssertValid (int index) никогда не будет достигнут до throw new OptionException.

4b9b3361

Ответ 1

Это дубликат Как обеспечить требуемые параметры командной строки с помощью NDesk.Options? и ответ то же: NDesk.Options не поддерживает это.

Цитата:

В соответствии с OptionValueType.Required docs = в спецификации параметра не применяется к OptionSet в целом, но только для значения для этого конкретного параметра.

Важность этого действительно актуальна только в двух сценариях, поэтому сначала рассмотрим парсер OptionSet:

string a = null;
string b = null;
var options = new OptionSet {
    { "a=", v => a = v },
    { "b=", v => b = v },
};

Сценарий 1, где важно, что OptionSet.Parse() работает в однопроходном режиме только для прямого доступа и не смотрит на значения опций, чтобы определить, должны ли они "быть". Таким образом, рассмотрим:

options.Parse(new[]{"-a", "-b"});

Результатом этого будет то, что a имеет значение "-b", а b - null. Поскольку обработчик для -a требует значения, он всегда получает следующее значение (если только значение не "закодировано" в исходную опцию, например -a=value).

Второе место, где это важно, - это параметр, требующий значения, последний параметр, и для него нет значения:

options.Parse(new[]{"-a"});

Это вызовет OptionException, так как обработчик для -a требует значения, и никакого значения не будет.

Следовательно, если у вас есть опция, которая сама необходима (в отличие от опции, требующей значения), вам необходимо вручную проверить это:

string dir = null;
new OptionSet {
    { "o=", v => dir = v },
}.Parse (args);

if (dir == null)
    throw new InvalidOperationException ("Missing required option -o=DIR");