Интерфейс cli что это
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
CLI (Command Line Interface)
Интерфейс командной строки (англ. Command line interface, CLI ) — разновидность текстового интерфейса(TUI) между человеком и компьютером, в котором инструкции компьютеру даются в основном путём ввода с клавиатуры текстовых строк (команд), в UNIX-системах возможно применение мыши. Также известен под названием консоль.
Интерфейс командной строки противопоставляется системам управления программой на основе меню, а также различным реализациям графического интерфейса.
Формат вывода информации в интерфейсе командной строки не регламентируется; обычно это также простой текстовый вывод, но может быть и графическим, звуковым и т. д.
Содержание
Назначение
На устройстве-консоли, которое печатало текст на бумаге, интерфейс командной строки был единственным возможным. На видеотерминалах интерфейс командной строки применяется по таким причинам:
Если программа полностью или почти полностью может управляться командами интерфейса командной строки и поддерживает пакетный интерфейс, умелое сочетание интерфейса командной строки с графическим предоставляет пользователю очень мощные возможности.
Формат команды
Наиболее общий формат команд (в квадратные скобки помещены необязательные части):
[символ_начала_команды]имя_команды [параметр_1 [параметр_2 […]]]
Символ начала команды может быть самым разным, однако чаще всего для этой цели используется косая черта ( / ). Если строка вводится без этого символа, выполняется некоторая базовая команда: например, строка «Привет» в IRC эквивалентна вводу « /msg Привет ». Если же такой базовой команды нет, символ начала команды отсутствует вообще (как, например, в DOS).
Параметры команд могут иметь самый разный формат. В основном применяются следующие правила:
Например, в некоей абстрактной игре может быть такая команда:
Применение
Основные сферы применения интерфейса командной строки:
В операционных системах
Основное применение интерфейса командной строки — интерфейс операционной системы. В Windows язык командной строки не имеет чёткой стандартизации, однако существует стандарт командной строки POSIX и его модификация в рамках GNU.
В компьютерных играх
Изначально консоль в играх использовалась для отладки.
Как только появился интерфейс командной строки, стали появляться и игры, его использующие, особенно актуально это было на тех платформах, где более сложные интерфейсы (графические) было невозможно реализовать вследствие аппаратных ограничений.
Наиболее ярким примером игр, использующих интерфейс командной строки, могут быть названы текстовые квесты, а также сетевые многопользовательские ролевые игры — MUD. Команды в таких играх вводятся на так называемом псевдоестественном языке.
Во многих графических играх присутствует консоль для облегчения доступа к настройкам игры, поскольку в сложных играх реализовать все команды через систему меню неудобно. Первая такая игра — Quake. Стандартная кнопка для вызова консоли —
Интерфейс, который предоставляется моддераторам, не всегда позволяет менять меню; но он всегда позволяет добавлять свои консольные команды. Например, в DotA (карте для игры Warcraft III) режим игры задаёт участник, играющий синими, через консоль.
Что такое GUI и CLI
Когда вы переходите на Linux, то, читая статьи по теме или общаясь на форумах, часто сталкиваетесь с такими терминами, как GUI, CLI и реже TUI. В этой небольшой статье мы расскажем, что они означают, и разберёмся, в каком контексте эти аббревиатуры обычно встречаются.
Справедливости ради отметим, что термины GUI, CLI и TUI популярны не только в Linux-среде. Эти слова – часть общекомпьютерного жаргона, и их можно услышать в любых технических обсуждениях, а не только в тех, которые связаны с Linux.
GUI – графический интерфейс пользователя
GIMP: GUI-приложение для обработки изображений
В Linux возможность графически взаимодействовать с операционной системой предоставляется так называемой средой рабочего стола. Поверх неё можно пользоваться GUI-приложениями, такими как GIMP, VLC, Firefox, LibreOffice, файловый менеджер и т.д. для решения различных задач.
VLC: медиапроигрыватель с GUI
Именно GUI открыл мир компьютеров для обычных пользователей; без него информационные технологии оставались бы уделом гиков.
CLI – интерфейс командной строки
CLI (Command Line Interface) – это программа в командной строке, которая читает вводимые команды и выполняет запрошенные действия. В целом, любая программа, которой можно пользоваться через команды из терминала, попадает в эту категорию.
APT: пакетный менеджер с CLI в Debian-based дистрибутивах
У старых компьютеров не было мыши или других манипуляторов для управления операционной системой. Всё взаимодействие выполнялось через текстовый ввод и вывод, т.е. через CLI.
Если вам кажется, что это сложно, подумайте об ещё более древних вычислительных машинах, у которых не было даже экрана, на котором отображается набираемый текст. Ввод команд распечатывался принтером на бумаге. Лично мне ни разу в жизни не доводилось пользоваться таким компьютером. Ближайший аналог из того, с чем я имел дело – это схемы на микроконтроллерах, которыми я занимался во время учёбы.
Ушёл ли CLI в прошлое? Вовсе нет. У командной строки есть свои преимущества, особенно если речь идёт о настройке Linux на глубинном уровне: поднятии сетевого брандмауэра, организации локальной сети или даже управлении пакетами.
Со всеми этими вопросами можно разобраться и с помощью GUI-программ, но CLI даёт более прямой и прицельный доступ к операционной системе. В любом случае, работа GUI-приложений также основана на обращении к ОС с помощью команд (которые прописаны в их программном коде).
Многие известные утилиты с GUI представляют из себя графическую обёртку для инструментов CLI. Например Handbrake, популярный медиа-конвертер с открытым исходным кодом, является GUI-надстройкой над CLI-приложением ffmpeg.
Рабочее окно Handbrake
Конечно, пользоваться командной строкой сложнее, чем графическим интерфейсом. Однако не стоит переживать по этому поводу. Как правило, для решения повседневных задач достаточно графического управления Linux. Тем не менее, знание основных команд часто бывает весьма полезным.
TUI – текстовый пользовательский интерфейс
Этот термин встречается реже, чем первые два. TUI (Text User Interface) – это наполовину CLI и наполовину GUI. Непонятно, что это значит? Разберёмся поподробнее.
Как было сказано выше, работа со старыми компьютерами была целиком основана на CLI. Однако некоторый ограниченный спектр возможностей GUI можно имитировать и в текстовом терминале. Это и будет TUI: в отличие от интерфейса командной строки, в нём представлено больше виджетов и доступно управление как и с клавиатуры, так и с помощью мыши.
Links: терминальный браузер
TUI – это сокращение для text-based user interface (текстовый пользовательский интерфейс) или terminal user interface (терминальный пользовательский интерфейс). Слово “текстовый” в этом словосочетании означает, что всё показанное на экране, в сущности, представляет собой большой текст – набор символов, с помощью которого имитируются различные элементы управления, а слово “терминальный” – что обратиться к этому интерфейсу возможно только из терминала.
TUI-приложения не так популярны, как GUI и CLI, но примеров можно найти множество. Так, к этой категории относятся текстовые браузеры и текстовые игры.
Ещё один случай, когда TUI может встретиться – это если в процессе установки кодеков на Ubuntu необходимо принять EULA или сделать выбор из нескольких предложенных вариантов настройки. TUI сложнее в управлении, чем GUI и часто требует обучения, но пользоваться им всё-таки проще, чем командной строкой.
Выводы
Программы с TUI часто относят в категорию CLI, поскольку их интерфейс доступен только из текстовой консоли. Какого мнения на этот счёт будете придерживаться вы – выбор за вами. Надеюсь, вам понравилась эта статья и теперь вы знаете что такое GUI, CLI и TUI.
Что такое CLI?
Введение в CLI
CLI обозначает интерфейс командной строки / интерфейс командной строки. В основном это интерфейс, в котором пользователь может взаимодействовать с операционной системой для выполнения некоторых задач не с помощью графического интерфейса, а путем ввода некоторых команд. Затем интерпретатор командного языка интерпретирует эти команды, и система выполняет соответствующие действия.
В прежние дни, когда графические интерфейсы пользователя (GUI) не были хорошо разработаны и использовалась операционная система DOS, все действия, которые нужно было выполнить, выполнялись с помощью команд. Пользователь обычно писал команды в DOS-приглашении, интерпретатор попытался бы распознать эту команду, и если он распознал команду как действительную, то соответствующая задача была выполнена.
Какова цель CLI?
В компьютерах более раннего поколения, когда операционные системы на основе графического интерфейса не разрабатывались, компьютеры использовали некоторые основанные на командах операционные системы, такие как MS-DOS, Apple-DOS, Unix и т. Д. Любое взаимодействие человека с этими ОС осуществлялось с помощью некоторых команд, которые позже были интерпретированы интерпретатором, который выполнял роль промежуточного программного обеспечения между человеческими командами и машинным языком ОС.
Некоторые из наиболее распространенных повседневных задач, связанных с CLI, заключались в том, чтобы перейти в каталог, создать новый, создать файл, записать текст в файл, удалить файл, показать файлы в папке и т. Д.
Тем не менее, даже в современном мире операционных систем с графическим интерфейсом, когда у нас есть наиболее интерактивные и простые способы взаимодействия с операционной системой путем выполнения щелчков мышью, посещения веб-сайтов и т. Д. CLI по-прежнему используется во многих местах для выполнения некоторых основных задач., Наиболее частое и частое использование CLI выполняется программистами, которые используют этот инструмент для добавления / установки компонентов в свои приложения. Они также используют интерфейс командной строки для автоматического выполнения некоторых системных настроек на сервере в зависимости от сценария, так что им фактически не нужно работать на сервере. Как правило, они сохраняют командный файл или сценарий PowerShell, который запускает команды CLI на сервере и выполняет необходимые операции / конфигурации.
Почему мы это используем?
В настоящее время, как мы все знаем, компьютеры прошли долгий путь от инструментов командной строки до более продвинутого и сложного графического интерфейса пользователя, который является очень простым и простым в использовании функциями для любого пользователя, работающего с компьютером и выполняющего работу.
Однако в конфигурации компьютерной системы интерфейс командной строки все еще находит широкое применение. В настоящее время CLI в основном используется программистами или системными администраторами для выполнения некоторых из их важных задач, которые в противном случае потребовали бы много времени и усилий, если бы они выполнялись с помощью графического интерфейса пользователя.
Чтобы понять это лучше и более подробно, давайте рассмотрим использование CLI для программистов и системных администраторов отдельно.
Использование CLI системными администраторами
Под системными администраторами здесь подразумевается человек / команда, которая следит за инфраструктурой в мире ИТ. Администратор может быть целой командой большой организации, которая следит за всеми компьютерными системами, работающими в организации, и поддерживает благополучие каждой отдельной системы. Системный администратор может также обратиться к человеку, который работает техническим инженером, чтобы исправить проблемы, связанные с системой для пользователей, которые обычный пользователь не может решить самостоятельно. Эти системные администраторы широко используют CLI для проверки конфигурации системы на уровне ОС, выполнения некоторых задач непосредственно на уровне ОС, которые в противном случае потребовали бы загрузки дополнительного программного обеспечения для графического интерфейса.
Помимо таких задач, системный администратор в крупной организации также должен контролировать все системы относительно последних установленных обновлений программного обеспечения или ОС на компьютере, периодически выполнять некоторые задачи в каждой системе с помощью автоматизации, что исключает необходимость запуска этих задач вручную на ежедневной основе. Еще одним важным применением является то, что конфигурацию можно изменить удаленно, просто выполнив некоторые команды на компьютере без необходимости физического присутствия в том же месте, что и компьютер, и выполнения этой задачи вручную.
Все это сокращает много времени и усилий при использовании интерфейса командной строки, а также гарантирует, что риск безопасности можно отслеживать и избежать даже в крупных организационных структурах с минимальной человеческой работой.
Использование CLI разработчиками приложений / программистами
Разработчики приложений также широко используют инструменты CLI для своей повседневной работы. Если обычный пользователь открывает приложение с помощью графического интерфейса, ему потребуется гораздо меньше времени, чтобы перейти к значку и щелкнуть по нему.
Еще одним важным применением для программистов является написание кода для разрабатываемого ими приложения. В большинстве случаев программистам необходимо добавлять ссылки на определенные сторонние библиотеки в свое приложение для взаимодействия с внешним миром, которое может включать принтер, подключенный к тому же компьютеру, базу данных, в которой хранятся данные приложения, или даже файл. сервер, который находится в любой точке мира и имеет некоторые файлы, которые используются приложением. Теперь у разработчика есть возможность добавить эти ссылки / библиотеки через графический интерфейс, который снова будет занимать некоторое время. Кроме того, при поиске библиотеки в графическом интерфейсе вам предоставляется несколько опций, основанных на поведении поисковой системы. Иногда это может привести к тому, что разработчик установит неправильную ссылку.
Однако, если пользователь знает точную библиотеку / ссылку, которую он хочет, он может использовать CLI для установки этой конкретной библиотеки в одной команде. Одним из наиболее распространенных и мощных интерпретаторов командной строки, используемых программистами для этой задачи, является диспетчер пакетов Nu-get (NPM), который широко используется программистами во всем мире для очень эффективного выполнения этой задачи.
Команды CLI
Некоторые из наиболее распространенных команд консоли, которые даже обычный пользователь может найти полезными в своей работе, перечислены ниже:
| Название команды | использование | пример |
| компакт диск | Перейдите в каталог, указанный в команде | CD Desktop / |
| компакт диск.. | Для перемещения вверх на один каталог из текущего каталога | компакт диск.. |
| Ls | Список всех файлов и каталогов в рабочем каталоге | Ls |
| MkDir | Создать новый каталог с указанным именем внутри рабочего каталога | Личный кабинет |
| ср | Скопируйте файл в рабочем каталоге в указанный каталог | cp learning.txt Личный / |
| Чисто | Очистить текущее окно CLI | Чисто |
| выход | Выход из окна CLI | выход |
| Помогите | Получите помощь относительно всех команд и их использования | Помогите |
| Помогите | Вы также можете указать команду, для которой требуется помощь, чтобы получить подробное описание | помочь компакт-диск |
Преимущества и недостатки CLI
Как и с любым другим инструментом / технологией в мире компьютеров, CLI также имеет свои преимущества и недостатки.
Преимущества:
Недостатки:
Вывод
Благодаря этой статье мы смогли многое узнать о CLI, что это такое, что и как он используется, где он используется чаще и наиболее важно, почему CLI все еще используется в современном мире привлекательной графики в компьютерах. Подводя итог, можно сказать, что хотя пользовательский интерфейс на компьютерах и ОС прошел долгий путь от CLI до GUI, нужно понимать, что CLI все еще находит широкое применение и применение в конфигурациях и мониторинге на уровне OS.
Это также может сократить часть вашего драгоценного времени, если вы выполняете какое-то повторяющееся задание с графическим интерфейсом, который вы можете автоматизировать с помощью команд. В целом, CLI требует, чтобы вы помнили некоторые команды, и может немного запутать в начале. Но если вы достаточно терпеливы и энергичны, то этот старый инструмент все же может творить чудеса для вас, помогать вам сэкономить драгоценное время и обеспечивать высокую надежность при выполнении некоторых важных задач.
Рекомендуемые статьи
Документация по интерфейсу Command-Line (CLI)
Интерфейс командной строки центра приложений — это единое средство для запуска служб центра приложений из командной строки. Интерфейс командной строки — это мощный инструмент для использования служб центра приложений и создания сценариев для выполнения последовательности команд. В настоящее время вы можете войти в систему и просмотреть или настроить все приложения, к которым у вас есть доступ в центре приложений.
Дополнительные сведения об установке CLI и поддерживаемых в настоящее время командах см. в репозитории GITHUB CLI центра приложений.
Приступая к работе
Предварительные требования
Рекомендуемая версия Node.js — 12 или более поздняя.
Установка
Использовать команды CLI центра приложений можно двумя способами, не запуская их appcenter login раньше:
Выполнение первой команды CLI
Дополнительные сведения о списке команд интерфейса командной строки см. в репозитории GITHUB CLI центра приложений.
Из-за ограничений, касающихся анализа имен приложений, имена приложений не должны начинаться с дефисов или других неоднозначных символов, которые могут запутать средства синтаксического анализа стиля GNU. Дополнительные сведения см. в связанном выпуске CLI.
Использование прокси-сервера
Интерфейс командной строки можно использовать через прокси-сервер. Для этого необходимо настроить npm config и указать переменную среды с адресом прокси-сервера. Обратите внимание, что адреса прокси должны быть указаны с помощью протоколов (например, http:// ).
Конфигурация NPM
Чтобы настроить использование прокси-сервера в NPM, необходимо выполнить команды:
Переменная среды
Чтобы настроить команду запуска переменной среды, выполните следующие действия:
Построение приложений командной строки (CLI)
Данная статья написана под влиянием книги Дэвида Коупленда «Build Awesome Command-Line Application in Ruby» (купить, скачать и изучить дополнительные материалы). Большая её часть будет посвящена проектированию дизайна CLI-приложений вне зависимости от используемого языка. По ходу будут обсуждаться и вещи специфичные для ruby, но не страшно, если вы его не знаете, кода будет не слишком много. Можно считать эту статью довольно подробным обзором вышеупомянутой книги с вкраплениями собственного опыта. Книжку рекомендую!
Для начала я задам вопрос. Если посмотреть на сообщества IT-шников, можно заметить, что несмотря на обилие программ с красивым графическим интерфейсом, приложения командной строки остаются весьма популярны. Почему?
Ответов несколько. Во-первых, это красиво удобно — если вы можете описать задачу командой в командной строке, то её гораздо проще автоматизировать, чем если вам приходится анализировать передвижения мыши и клики на разные пункты меню. Во-вторых, это даёт возможность комбинировать программы невероятным числом способов, чего сложно добиться с помощью графических интерфейсов.
В значительной степени философия Unix базируется на том принципе, что множество маленьких утилит, каждая из которых умеет делать свою конкретную задачу — это лучше, чем одна многофункциональная программа-универсал. И это одна из причин успеха Unix-систем в мире IT-шников.
Наверное, каждый понимает, что обычного пользователя вряд ли удастся сманить от GUI к CLI, давайте сосредоточимся на нас, «компьютерщиках» и конкретизируем наши пожелания к CLI-приложениям.
Общие требования
Easy to use
Утилитки и программные пакеты. Что удобнее?
Итак, все приложения можно условно поделить на два типа: утилитки и программные пакеты (в оригинале, Command Suite).
Первый тип — это приложения, которые имеют одну цель, один режим работы. Примеров этому типу программ бесчисленно, почти всех Unix-команды такие: ls, grep, diff,… (рубисты могут вспомнить, например, команду rspec) Удобство этих программ в том, что их возможности проще запомнить и труднее в них запутаться. Кроме того, их проще склеивать в цепочки для последовательной обработки. Тут будет уместной следующая аналогия. Представьте, что вы строите дом, притом дом не типового образца. Гораздо удобнее строить его из кирпичей, а не из монолитных блоков, ведь кое-где вам эти блоки пришлось бы подпиливать, а где-то пришлось бы заделывать стыки камнями. Да и блоки можно только подъемным краном тягать, тогда как кирпичи можно класть руками.
Второй тип программ можно сравнить с швейцарским ножом или кухонным комбайном. Иногда они крайне удобны. Посмотрите на git (в мире руби сразу вспоминаются gem, rails, bundle) — одна программа, а сколько всего умеет. И коммитить/чекаутиться может, и ищет в истории сама, и изменения между файлами считает. Так что grep, diff и прочее в неё встроено, ничего комбинировать с гитом и не надо, сам всё умеет. Если вернуться к аналогии с домом, то у гита есть типовой проект на каждый случай жизни (и попробуй ещё запомни их все).
И всё же, не всем программам стоит быть многофункциональными: всё равно все варианты использования вы не переберете. В подтверждение этого тезиса предлагаю вам представить себе «мультитул», который умеет делать cd, ls, pwd, diff, df и ещё кучу полезных операций одной командой, только опции надо будет слегка менять (например, filesystem change, filesystem show, filesystem where итд). Будете такой пользоваться? Думаю, что выкинете за излишнюю громоздкость. Хотя программные пакеты и бывают чрезвычайно удобными, имеет смысл хорошенько подумать, прежде чем писать своего кентавра с восемью щупальцами.
Кстати, если вы написали десяток утилит, а потом поняли, что хотите, чтобы это был программный пакет, то это не так уж и сложно поправить. Достаточно написать обертку, которая будет маршрутизировать команды. Вы, возможно не знаете, но git состоит из десятков утилиток типа git-commit, git-show, git-hash-object, git-cat-file, git-update-index итд, которым передает управление команда git, основываясь на типе команды и опциях (разумеется, за одной командой может стоять целая цепочка из вызовов утилит). Так что даже крупные проекты начинать лучше с набора небольших программ, которые вы в дальнейшем будете комбинировать. Их проще писать, отлаживать, поддерживать и использовать.
Синтаксис аргументов командной строки или «в этом доме есть свои традиции».
Соглашения по использованию опций
Почему желательно всегда иметь длинный вариант опции
Различия в параметрах командной строки для однофункциональных и многофункциональных приложений
В сообществе ruby большая часть приложений командной строки использует либо OptionParser, либо библиотеки на его основе. В разделе про конфигурацию — когда мы узнаем чуть больше — я приведу пример кода, сделанного написанного с помощью OptionParser.
Helpful
Чтобы ещё больше облегчить пользователю запуск команды, можно сделать автодополнение команды на уровне шелла (работает не во всех шеллах). Это позволит по нажатию на кнопку tab автоматически дополнять названия команд, имена файлов итд. У пользователя будет меньше шансов сделать орфографическую ошибку, и он потратит намного меньше времени на написание команды.
Tab-completion делается следующим образом: методу Readline.completion_proc=(block) передается блок, возвращающий массив возможных дополнений по строке уже введенного текста, вот и вся задача. Например:
Plays well with others
Не будем обсуждать вопрос о необходимости удобного взаимодействия программ, каждый, кто работал в Unix может сам оценить, насколько это важно. Главный вопрос — как добиться этого?
Коды возврата
Потоки ввод-вывода и поток ошибок. Пайпы
Подумайте о том, для чего в вашей программе могут понадобиться потоки ввода и вывода. Что вы пишете в поток вывода, а что — в поток ошибок. Разберемся сначала со вторым вопросом: чем отличаются потоки вывода(stdout) и ошибок(stderr)? Тем, что один поток идет в пайп, а другой — нет. Поток stderr используют для вывода не только ошибок, но и для вывода любой информации о процессе работы, такой как стадия выполнения программы, отладочная информация итп. Эта информация не должна попасть на вход другой программы, она нужна лишь для удобства пользователя. Поток stdout используется для всей остальной информации, такой как результат работы программы.
Сигналы
Has sensible defaults but is configurable
Повторю, стандартные сценарии использования должны быть доступны без указания тысячи опций. Нестандартные сценарии не обязаны быть простыми в использовании, но должны быть все-таки доступными. Кроме того, набор опций-по-умолчанию должен быть настраиваемым.
Для этого служат файлы вида
Рассмотрим, как эти опции загрузить.
Если у вас стоит задача настройки программного пакета — это делается таким же конфигурационным файлом. Только в хэше на этот раз должны быть как глобальные опции, так и опции каждой команды — во вложенном хэше.
Есть и другие способы записи данных в конфигурационный файл, YAML — просто один из самых легко читаемых. Так или иначе, настройка через конфигурационные файлы — широко используемая техника. Так настраиваются, например, утилиты gem и rspec, а также git.
Installs painlessly
Даже очень хорошее приложение никто не будет использовать, если процесс его установки слишком сложен. К счастью, в мире руби есть rubygems — менеджер пакетов, который позволяет устанавливать и обновлять программы в одну строчку:
gem install/update gemname
Про то, как создавать гемы я писать не буду, об этом на хабре уже была отличная статья, если вы ещё не умеете этого делать — прямо сейчас оторвитесь от моей статьи и уделите полчаса своего времени этому вопросу. Это очень просто, очень удобно и жизненно необходимо, если вы собираетесь заниматься ruby и дальше.
Когда вы будете создавать свой гем, вам предстоит указывать номер версии. Есть весьма последовательное соглашение под названием «семантическое версионирование». Формат версий состоит из трех чисел: Major.Minor.Patch. Младшее число — патч-левел отвечает только за багфиксы. Среднее число меняется при изменениях API, являющихся обратно-совместимыми. И старшее число меняется при внесении изменений, рушащих обратную совместимость. Заметьте, не цифра, а число, так что номер версии легко может быть таким: 1.13.2.
Семантическое версионирование полезно тем, что в зависимостях можно указывать не точную версию гема, а версию с точностью до патч-левела или до minor-версии. Таким образом вы получаете возможность, ничего не делая с вашим собственным пакетом, получать исправления, устраняющие баги в пакетах зависимостей. Но в то же время вы имеете возможность запретить версиям зависимостей измениться слишком сильно, чтобы не получить с очередным апдейтом изменения API, несовместимые с вашим пакетом.
Помните, я упоминал, что rubygems создает bat-обертку? Это нужно потому что bat-файл аргументы командной строки понимает и может передать их скрипту, вызвав скрипт надлежащим образом. Таким образом rubygems решает эту проблему. Но есть и ложка дёгтя: такой каскад вызовов существенно замедляет старт приложения. Иногда программа Hello World запускается пять секунд. После того как приложение запущено, всё работает с нормальной скоростью, но процесс запуска приложений неприятно долгий (насколько я понимаю, Windows-процессы вообще более тяжеловесны, чем Unix-процессы). Это может раздражать, когда вы после каждого изменения кода запускаете, например, rspec. Или каждые пять минут тратите пять секунд дожидаясь реакции git-а (который тоже страдает от этой проблемы, хоть и написан не на ruby). Но это цена, которую приходиться платить за совместимость программ с Windows, по-другому — никак.
Fails gracefully
Gets new features and bug fixes easily
Отдельный вопрос — как тестировать корректную работу с файлами конфигурации. Автор советует сделать возможность переопределять настройки этих файлов через переменные окружения. Я лично считаю это неэлегантным и оставлю любопытному читателю возможность залезть в книгу и самостоятельно посмотреть связанные с этим рекомендации.
Delights users
Немного замечаний про красивости в формате вывода.
Таблицы
Предположим, что ваша утилита выводит список самых популярных блогеров: имя, количество постов, комментариев, френдов. Напрашивается очевидный формат вывода: нарисовать табличку. Решение столь же прямолинейное — воспользуйтесь гемом terminal-table.
Цвета
Ещё один вид красивостей вы встретите, если воспользуетесь одной из утилит для сравнения файлов. Вы увидите строчки с плюсиками и минусиками для добавленных и удаленных строк. Но кроме того эти строчки для удобства раскрашены в различные цвета: красный/зеленый. Раскрашивание цветов в консоли выполняется добавлением специальных эскейп-последовательностей в местах смены цвета. Два популярных решения — гемы rainbow и term-ansicolor. Используются они тоже весьма прямолинейно, почитайте их мануалы. Надо отметить, что — увы — не все терминалы нормально поддерживают работу с цветами. Стандартный Windows-терминал для некоторых программ вместо цветных строк выдает цифры кодирующие эти цвета, а для других работает корректно. Так что проверьте работу гемов в разных терминалах, прежде чем начинать использовать их в коде.
Дэвид Коупленд напоминает, что почти 10% людей страдают дальтонизмом. Из этого следует, что цвет должен лишь помогать ориентироваться в выводе программы, а не брать на себя функцию единственного канала передачи данных. Если в утилите diff убрать плюсики и минусики, то существенная часть людей потеряет возможность воспользоваться результатами работы. Поэтому в раскрашенном выводе должны быть и цвета, и другие данные, имея которые, цвета перестают быть необходимыми.
Важное замечание! Когда ваша утилита выдает текст в machine-readable формате — желательно, чтобы форматирование цветов было отключено. В противном случае сторона, принимающая входные данные, имеет шанс заработать «несварение желудка» от специальных символов в строке.
Интерактивное общение с пользователем
Ещё одна библиотека предназначена для обеспечения интерактивности. Readline, о котором я уже говорил. Итак, к вашим услугам: запоминание истории пользовательских ответов и автодополнение. Также в rubygems и thor есть специальные модули отвечающие за взаимодействие с пользователем и предоставляющие такие методы, как say и ask.
Какого типа бывают интерактивные приложения? Вспомните irb и rails console. Автор книги приводил ещё один пример: предположим, вам приходит крупный JSON-объект и вы хотите исследовать, что в нем есть. Для этого можно написать интерактивный просмотрщик JSON, который позволяет бродить по иерархии командами cd, ls, а также изменять его командами rm и mknode. Пример приведен исключительно для того, чтобы разбудить ваше воображение. Можете придумать ещё сотню применений интерактивным приложениям.
Берегите нервы пользователя
Стоит, правда, немного вас предостеречь: в окне терминала потоки stderr и stdout смешаны, так что вы можете начать затирать не те данные, которые нужно.
В заключение не могу не рассказать о нескольких популярных библиотеках.
Если вы хоть немного проработали с руби-проектами, наверняка уже встречали команду rake, а может и команду thor. Это — специализированные библиотеки, позволяющие при помощи специального DSL описать набор утилиток, как набор задачи автоматизации.
Rake — это улучшенный аналог программы make для ruby. Он заглядывает в Rakefile текущего или родительского каталога и ищет там описание задачи. Например, bundler создает для каждого нового гема Rakefile с набором задач: build, install, release, что позволяет инсталлировать и публиковать собственные гемы одной командой. Одной из отличительных фишек rake является система зависимостей между задачами — так rake release сначала выполнит задачу build и только затем release. К сожалению, передавать аргументы в rake то ли нельзя, то ли нетривиально. На хабре, кстати, уже был вводный пост про rake.
Thor — система похожая на rake. Она помимо прочего позволяет «устанавливать» задачи в систему. Подробнее лучше посмотреть в других источниках.
Я упоминаю об этих библиотеках, поскольку они могут облегчить вам жизнь, если вам не нужна никакая сложная обработка опций и аргументов. Простые программные пакеты вполне описываются в терминах этих двух известных библиотек. В частности, в Ruby on Rails они обе используются для задач типа запуска генераторов, миграций, очистки кэша приложения итп.
Большую часть повествования я использовал для разбора опций OptionParser из стандартной библиотеки ruby. Это весьма удобная библиотека, однако некоторые считают её довольно тяжеловесной и пишут обертки. Некоторые обертки концентрируются на том, чтобы упростить задание опций, некоторые — на том, чтобы сделать хэш опций доступным глобально итд. Если вам покажется, что OptionParser вас тормозит, можете подобрать одну из готовых оберток (список можно найти на сайте книги — см. начало статьи) или сделать свою.
Есть у OptionParser и другие недостатки: она не способна отличить глобальные опции от локальных в программном пакете (это разделение мы сами сделали; вообще говоря, оно ниоткуда не следует, кроме успешного применения концепции в некоторых крупных проектах, таких как git). Ещё одна особенность OptionParser-а (это не прописано в спецификации и я полагаю, что это баг) — то что отрицательные числа в аргументах он понимает как опции. Полагаю, что рано или поздно этот баг исправят, но если ваша программа принимает числовые аргументы — будьте осторожны и тщательно тестируйте программу.
Для построения программных пакетов автор книги Дэвид Коупленд сделал весьма неплохой гем GLI. Он различает глобальные опции, опции команды и распознает саму команду. Проект живой и периодически получает обновления.
Кроме того, не могу не упомянуть довольно сырой, но крайне любопытный проект — docopt. Это — библиотека, которая по строке подсказки генерирует парсер опций, тогда как OptionParser и родственные библиотеки делают наоборот. Эта библиотека изначально написана на python и портирована на довольно большое количество языков. Про её возможности можно почитать здесь. Думаю, при должном внимании сообщества, она может превратиться в крайне удобную и мощную библиотеку.








