Практичне введення в Alire#

Alire - це пакетний менеджер для мови Ada орієнтований на використання вихідних текстів програм у розробці. Його використання полегшує такі операції

  • Встановлення компілятора

  • Створення нової бібліотеки або програми

  • Керування залежностями

Встановлення Alire#

Поставити його не складно. Достатньо завантажити архів із сайту alire.ada.dev або з релізів GitHub, розархівувати і додати папку bin у PATH. Залежностей у Alire небагато і, найімовірніше, вони вже встановлені у кожного розробника - git, curl, unzip.

Перший запуск#

Тепер одразу можна спробувати щось зібрати. Для цього є тренувальний додаток класу "hello, world":

alr get --build hello

У цей момент Alire зробить таке

  • Якщо у вас Windows, завантажить і встановить msys2

  • Скачає ком'юніті індекс бібліотек і програм

  • Знайде в ньому останню версію компілятора і запропонує його поставити

  • Коли ви погодитеся, поставить компілятор і gprbuild

  • Завантажує додаток hello і його залежності (libhello)

  • Побудує виконуваний модуль hello

Результат ви зможете знайти в папці hello_версія_хеш (наприклад hello_1.0.2_5715870b), а виконуваний модуль - у підкаталозі bin.

Налаштування#

Хоча Alire не вимагає налаштування, я зазвичай виконую

alr settings --global --set dependencies.shared false

Це забороняє йому зберігати залежності поза робочою папкою. Наприклад, під час складання hello, він завантажує і збирає libhello в каталозі $HOME/.local/share/alire/{builds,releases}. Мені здається, це захаращує домашній каталог. Якщо таку поведінку заборонити, то залежності розташовуються в робочій папці (наприклад hello_1.0.2_5715870b/alire/cache/dependencies) і я завжди впевнений, що, видаливши робочу папку, не залишу зайвого сміття. Мені також здається, що цей режим надійніший.

Створення нової бібліотеки#

Створення нової бібліотеки вимагає деяких рутинних дій (створення файлу проєкту, структури каталогів для вихідних текстів, файлу маніфесту alire.toml і т.п.) На щастя, Alire може допомогти в цьому. Плюсом тут також буде те, що створені файли будуть схожі на бібліотеки інших проектів і користувачам буде простіше в них орієнтуватися. Запустіть

alr init --lib mylib

При цьому Alire зробить папку з відповідним ім'ям і заповнить її файлами та каталогами із заготівлею проєкту. У папці будуть alire.toml, mylib.gpr, src/mylib.ads, .gitignore і кілька службових файлів. Побудувати бібліотеку можна командою cd mylib; alr build (або alr -C mylib build). Так само можна побудувати і будь-який інший проєкт, що має файл маніфесту alire.toml. Ознайомившись із фалом проекту (mylib.gpr), ви помітите, що він використовує config/mylib_config.gpr. Останній перестворюється Alire-ом під час додавання залежностей, зміни режиму збірки (development, release, т.п.), зміні ключів компіляції у файлі маніфесту та інше. Його не рекомендується редагувати, на відміну від головного файлу проекту, який ви можете переробити на свій розсуд. Каталоги alire і config, як правило, навіть не зберігають у репозиторії вихідних кодів, оскільки alr build створить їх сам.

Керування залежностями#

Управління залежностями - це те, де Alire особливо корисний. Якщо ви ходите використовувати якусь бібліотеку, яка вже в індексі, достатньо запустити

alr with libhello

Alire завантажить бібліотеку, запам'ятає залежність у файлі маніфесту alire.toml і змінить ваш config/xxx_config.gpr.

Це можна зробити іншим способом - відредагувавши alire.toml і запустивши alr build.

Alire використовує схему семантичного ведення версій, складаючи номер версії з трьох чисел. Перше має змінюватися, якщо змінюється API бібліотеки. Якщо змінюється лише друге число, то в API можуть з'явиться нові функції, але решта API залишається сумісною з минулою версією. Коли змінюється тільки третє число, то API не змінюється взагалі, а змінюється тільки реалізація, виправляються помилки тощо. З огляду на це ви можете точно описати залежності між бібліотеками, використовуючи звичайні оператори порівняння, наприклад >= 1.2.3. Є спеціальні оператори

  • ^1.0 - будь-яка версія починаючи із зазначеної, але не змінюючи старше число версії

  • ~1.2 - будь-яка версія, починаючи із зазначеної, але не змінюючи старше і середнє число версії

Коли вам потрібно використовувати бібліотеку (або її версію), якої ще немає в індексі, на допомогу приходить alr pin. За допомогою цього ви можете вказати, де брати необхідну версію бібліотеки. Це може бути

  • шлях до каталогу

  • посилання на репозиторій (можливо із зазначенням гілки або конкретного коміту

Наприклад, ви зробили клон libhello і виправили там щось. Ви можете завантажити її в каталог, а в каталозі головного проєкту запустити

alr pin libhello -use=<шлях-до-libhello>

Або не завантажувати, а дати це зробити alire:

alr pin libhello \
  --use=https://gihub.com/user/libhello --branch=my-fix

Не важко зробити це і модифікуючи файл маніфесту alire.toml.

Якщо у вас накопичитися багато таких залежностей, можливо, настав час зібрати їх у свій власний індекс. Щоб дати знати Alire про новий індекс, достатньо запустити

alr index --name=index --add=https://github.com/user/alire-index.git#branch

Перечитати всі індекси з мережі можна командою alr index --update-all.

Активація оточення#

Ще одна корисна команда, яку варто згадати це alr exec <command>. З її допомогою можна запустити команду в оточенні, створеному Alire для поточного проєкту. У цьому оточенні налаштовані шляхи до компілятора і залежностей, змінні оточення задані у файлах-маніфестах всіх переметрів. За допомогою цієї команди ви можете запустити shell, редактор або середовище розробки. Використовуйте два мінуси (--) щоб задати аргументи команди.

alr exec bash # Створити новий shell.
alr exec -- gnatstudio -P gnat/my_lib.gpr

Висновки#

Думаю цього достатньо, щоб почати використовувати у вашій роботі. Опанувавши установку збірку і створення своїх бібліотек, ви побачите, наскільки простіше стало створювати системи на Аді. Ба більше, ви зможете ділитися своїми напрацюваннями, поповнювати ком'юніті індекс, а іншим розробникам буде легко використовувати ваш код.

Напевно у вас виникнуть запитання. Alire має непогану документацію, з якою можна ознайомитися на сайті.