Продолжаю серию постов про создание CLI-инструментов на Dart. В прошлый раз мы разобрались, что Dart позволяет упаковать CLI в нативный бинарный файл, и пользователю не нужно устанавливать Dart SDK, чтобы пользоваться утилитой — достаточно скачать файл и запустить его.
Но этот процесс можно улучшить!🚀
Мы можем добавить установку CLI через Homebrew, чтобы пользователи могли установить ваш инструмент одной командой:
brew install mytool
Давайте разберемся, как это сделать.
Если вы хотя бы раз набирали
brew install, значит, вы уже пользовались Homebrew. Это менеджер пакетов для macOS и Linux. Но мало кто знает, что для распространения своего CLI не обязательно попадать в официальный Homebrew-core.Достаточно создать Homebrew Tap — обычный GitHub-репозиторий с формулой Homebrew. Это своего рода ваш собственный mini-магазин пакетов для brew, доступных по команде:
brew tap yourname/yourtap
brew install mytool
Tap удобен, когда:
✔️ вы делаете внутренний CLI в компании
✔️ часто обновляете инструмент
✔️ хотите распространять бинарники сразу после релиза
✔️ не хотите проходить ревью в Homebrew-core
А теперь давайте разберемся на практике. На самом деле все сводится к созданию двух репозиториев на GitHub и одной формуле на Ruby.
Шаг 1. Создайте репозиторий с вашим инструментом.
Если это Bash-скрипт — убедитесь, что он исполняемый:
#!/usr/bin/env bash
chmod +x mytool.sh
Если вы делаете CLI на Dart, собираем бинарники:
mkdir -p dist
dart compile exe bin/my_cli_tool.dart -o dist/mytool-macos
dart compile exe bin/my_cli_tool.dart -o dist/mytool-linux
Затем создайте GitHub Release и загрузите бинарники (mytool-macos, mytool-linux) как assets. Homebrew будет скачивать их оттуда.
Шаг 2. Создаем Homebrew Tap. Для этого необходимо создать отдельный репозиторий:
myusername/homebrew-mytool
Внутри создайте папку
Formula/ и файл Formula/mytool.rb:class Mytool < Formula
desc "CLI tool for automation"
homepage "https://github.com/myusername/my_cli_tool"
version "1.0.0"
if OS.mac?
url "https://github.com/myusername/my_cli_tool/releases/download/v1.0.0/mytool-macos"
sha256 "SHA256_OF_MACOS_FILE"
elsif OS.linux?
url "https://github.com/myusername/my_cli_tool/releases/download/v1.0.0/mytool-linux"
sha256 "SHA256_OF_LINUX_FILE"
end
def install
bin.install Dir["mytool-*"].first => "mytool"
end
end
SHA256 можно получить командой:
shasum -a 256 dist/mytool-macos
Этот хеш гарантирует, что Homebrew загружает именно тот файл, который вы опубликовали, и что он не был поврежден или подменен.
И на этом все! Теперь можно подключить tap и установить CLI:
brew tap myusername/mytool
brew install mytool
Важные моменты:
▪️SHA256 должен совпадать: Homebrew проверяет целостность файлов, поэтому после каждого релиза обязательно пересчитывайте SHA
▪️Выпуск обновлений: для новой версии создайте тег, пересоберите бинарники, обновите SHA и отредактируйте формулу в tap
▪️ Проверяйте локально: перед публикацией убедитесь, что установка работает:
brew install --build-from-source ./Formula/mytool.rb
▪️ Репозиторий должен начинаться с homebrew-, а имя формулы совпадать с названием CLI
▪️ Tap должен быть публичным. Homebrew не умеет устанавливать пакеты из приватных репозиториев
На этом все — ваш CLI готов к установке через brew🌟
