Я использую GNOME много-много лет, так что после всех этих лет я просто могу сказать, что он мне очень нравится.
Как пользователь, у меня был отличный опыт, но как у разработчика у меня совсем нет опыта; Итак, справедливо сказать, что это моя первая попытка узнать что-то о технологиях разработчиков GNOME.
Обработка аргументов командной строки в GJS
Будучи старым школьником, я решил начать изучать, как обрабатывать аргументы командной строки в GJS. Идея состоит в том, чтобы отныне делать свои собственные скрипты на GJS вместо bash.
Итак, давайте начнем, первое, что вы должны знать, это то, что аргументы командной строки в GJS хранятся в var ARGV:
#!/usr/bin/gjs // handle1.js print(ARGV);
выполнение этого небольшого фрагмента кода показывает, как хранятся аргументы командной строки:
$ ./handling1.js --option1 --option2 -t file --option1,--option2,-t,file
Тогда вам просто нужно разобрать ARGV и обработать каждую опцию с помощью кода… Легко, верно? Ну, это звучит скучно и сложно. Здесь в дело вступают библиотеки GNOME; Поискав в документации GObject, я обнаружил, что существует «стандартный» способ обработки аргументов командной строки с использованием GApplication (часть библиотеки GIO).
Согласно официальной документации, GApplication является основой любого приложения и предоставляет, среди прочего, средства для разбора аргументов командной строки. Важно отметить, что следующий код намного сложнее и требует от вас знания многих концепций написания приложений на GJS (если вы ничего не знаете о программировании GJS, хорошим местом для начала будет GJS wiki). Итак, вот код:
#!/usr/bin/gjs // handling2.js const System = imports.system; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const Handling = new Lang.Class({ Name: ‘Handling’, Extends: Gio.Application, _version: ‘0.1’, _init: function() { this.parent({ application_id: ‘handling.example.com’, flags: Gio.ApplicationFlags.FLAGS_NONE }); this.add_main_option(‘version’, ‘v’.charCodeAt(0), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, “Shows program version”, null); GLib.set_application_name(“Handling”); }, vfunc_activate: function() { this.parent(); }, vfunc_startup: function() { this.parent(); }, vfunc_handle_local_options: function(options) { if (options.contains(‘version’)) { print(this._version); return 0; } return -1; }, vfunc_shutdown: function() { this.parent(); } }); (new Handling()).run([System.programInvocationName].concat(ARGV));
Соответствующие части:
- Класс должен «расширять» Gio.Application (или любой подкласс).
- ApplicationFlags должны быть установлены при инициализации объекта. По умолчанию — FLAGS_NONE.
- Каждый аргумент для обработки определяется с помощью метода add_main_option. Вы можете определить столько параметров, сколько хотите, используя этот метод. В этом примере я решил обрабатывать «версию программы».
- Место, где вы «обрабатываете» каждый аргумент, находится в методе vfunc_handle_local_options. Если возвращаемое значение функции является неотрицательным, то синтаксический анализ оставшихся аргументов останавливается и процесс завершается.
Теперь давайте протестируем пример кода:
$ ./handling2.js --version 0.1 $ $ ./handling2.js -v 0.1 $ $ ./handling2.js --help Usage: gjs [OPTION...] Help Options: -h, --help Show help options --help-all Show all help options --help-gapplication Show GApplication options Application Options: -v, --version Shows program version $ $ ./handling2.js --force Unknown option --force
Удивительно, но использование GApplication не только предлагает стандартный способ обработки аргументов командной строки, но также анализирует общие параметры как «помощь» и отлавливает недопустимые аргументы.
И это все, есть и другие способы обработки аргументов командной строки, которые я покажу по мере изучения.