Добавление программного обеспечения в Homebrew
Не нашли нужную программу в Homebrew? Тогда именно вы можете решить эту проблему.
Если вы хотите добавить программу с закрытым исходным кодом или программу только с графическим интерфейсом, следуйте руководству по Cask. В остальных случаях следуйте руководству по формулам (см. также: терминология Homebrew).
Прежде чем начать, проверьте открытые пул-реквесты в репозиториях Homebrew/homebrew-core и Homebrew/homebrew-cask, чтобы убедиться, что никто не опередил вас.
Затем ознакомьтесь с документацией Допустимые формулы или Допустимые Cask, чтобы определить, подходит ли программа для добавления в Homebrew. Если вы создаёте формулу для альтернативной версии программы, уже представленной в Homebrew (например, значительно отличающейся основной или дополнительной версии), обязательно прочитайте документацию Версии, чтобы понять требования к версионируемым формулам.
Если всё в порядке, можно приступать к созданию новой формулы!
Формулы
Написание формулы
-
Полезно найти в Homebrew существующие формулы для программ, похожих на ту, которую вы хотите добавить. Это поможет понять, как обычно работают с конкретными языками, методами сборки и т. д. Для начала подключите
homebrew/core: сначала задайтеHOMEBREW_NO_INSTALL_FROM_API=1в окружении оболочки, затем выполнитеbrew tap --force homebrew/core, чтобы клонировать taphomebrew/coreв путь, возвращённый командойbrew --repository homebrew/core. -
Если вы начинаете с нуля, воспользуйтесь командой
brew create, чтобы создать базовую версию формулы. Эта команда принимает несколько параметров, и подходящий параметр шаблона, например--python, поможет сэкономить время. -
Теперь нужно доработать шаблонный код из
brew createи превратить его в полноценную формулу. Основными источниками информации для вас будут Справочник по формулам, похожие формулы в Homebrew и документация разработчиков выбранной программы. При необходимости изучите также документацию Homebrew по написанию формул для Python и Node. -
Обязательно добавьте к формуле хороший тест. Инструкции приведены в разделе Добавление теста к формуле справочника.
-
Попробуйте установить формулу с помощью
brew install --build-from-source <formula>, где <formula> — название вашей формулы. Если возникнут ошибки, исправьте формулу и попробуйте установить её ещё раз. К концу этого шага установка формулы должна завершиться без ошибок.
Если вы зашли в тупик, попросите помощи на GitHub или на форуме Homebrew. Сопровождающие с радостью помогут, но мы также хотим видеть, что вы сначала приложили усилия, чтобы найти решение самостоятельно.
Тестирование и аудит формулы
-
Запустите
brew audit --strict --new --online <formula>для своей формулы. Если возникнут ошибки, исправьте формулу и запустите аудит ещё раз. К концу этого шага аудит должен завершиться без ошибок. -
Запустите тест формулы с помощью
brew test <formula>. Тест должен завершиться без ошибок.
Отправка формулы
Теперь можно отправить формулу в репозиторий homebrew-core. Если вы ещё не делали этого раньше, обратитесь к документации Как создать пул-реквест в Homebrew. Сопровождающие проверят пул-реквест и сообщат, что нужно исправить, прежде чем формулу можно будет добавить в Homebrew.
Если вы дошли до этого момента, поздравляем с отправкой формулы Homebrew! Мы ценим проделанную вами работу. Вы можете гордиться тем, что она принесёт пользу и другим пользователям Homebrew.
Cask
Примечание: прежде чем тратить время на создание нового Cask:
- убедитесь, что его можно принять, ознакомившись с разделом Часто задаваемые вопросы об отклонённых Cask, и
- проверьте, не был ли этот Cask уже отклонён.
Создание Cask
Создать новый Cask просто. Для начала следуйте инструкциям в разделе Как создать пул-реквест в Homebrew.
Примеры
Вот пример Cask для dixa. Обратите внимание на параметр verified после url: он необходим, если домены URL и главной страницы различаются.
cask "dixa" do
version "4.0.12"
sha256 "a4e1a30d074e724ba24e9e2674a72bc4050f00161fb7dc23295a2c189ecda5bb"
url "https://github.com/dixahq/dixa-desktop-app-release/releases/download/v#{version}/dixa-#{version}.dmg",
verified: "github.com/dixahq/dixa-desktop-app-release/"
name "Dixa"
desc "Customer service platform"
homepage "https://dixa.com/"
livecheck do
url :url
strategy :github_latest
end
app "Dixa.app"
zap trash: [
"~/Library/Application Support/Dixa",
"~/Library/Logs/Dixa",
"~/Library/Preferences/dixa.plist",
"~/Library/Saved Application State/dixa.savedState",
]
end А вот пример для pomello. Обратите внимание, что в нём используется загрузка без указания версии (URL загрузки url не содержит номер версии, в отличие от предыдущего примера). Кроме того, контрольная сумма отключена с помощью sha256 :no_check. Это необходимо, поскольку URL загрузки url не содержит номера версии, и контрольная сумма будет меняться при появлении новой версии.
cask "pomello" do
version "0.10.17"
sha256 :no_check
url "https://pomelloapp.com/download/mac/latest"
name "Pomello"
desc "Turns your Trello cards into Pomodoro tasks"
homepage "https://pomelloapp.com/"
livecheck do
url :url
strategy :header_match
end
app "Pomello.app"
zap trash: [
"~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.tinynudge.pomello.*",
"~/Library/Application Support/Pomello",
"~/Library/Caches/com.tinynudge.pomello",
"~/Library/Caches/com.tinynudge.pomello.ShipIt",
"~/Library/HTTPStorages/com.tinynudge.pomello",
"~/Library/Preferences/com.tinynudge.pomello.plist",
"~/Library/Saved Application State/com.tinynudge.pomello.savedState",
]
end Последний пример — для fabfilter-one. В нём используется установщик pkg для установки приложения, а не отдельный пакет приложения (.app). Обратите внимание на секцию uninstall pkgutil:, необходимую для удаления всех файлов, установленных с помощью установщика.
Вы также увидите, как адаптировать version к URL загрузки url. Используйте для этого наши специальные методы version, а если их недостаточно — стандартные методы String Ruby.
cask "fabfilter-one" do
version "3.37"
sha256 "4059594580e365237ded16a213d8d549cbb01c4b8bad80895c61f44bcff7eb68"
url "https://download.fabfilter.com/ffone#{version.no_dots}.dmg"
name "FabFilter One"
desc "Synthesizer plug-in"
homepage "https://www.fabfilter.com/products/volcano-2-powerful-filter-plug-in"
livecheck do
url "https://www.fabfilter.com/download"
strategy :page_match do |page|
match = page.match(/ffone(\d)(\d+)\.dmg/i)
next if match.blank?
"#{match[1]}.#{match[2]}"
end
end
depends_on macos: :sonoma
pkg "FabFilter One #{version} Installer.pkg"
uninstall pkgutil: "com.fabfilter.One.#{version.major}"
# No zap stanza required
end Создание токена для Cask
Токен Cask — это мнемоническая строка, с помощью которой пользователи взаимодействуют с Cask через brew install и другие команды. Имя файла Cask — это токен с добавленным расширением .rb.
Проще всего создать токен для Cask, выполнив generate_cask_token:
$(brew --repository homebrew/cask)/developer/bin/generate_cask_token "/full/path/to/new/software.app"
Если программа, для которой вы хотите создать Cask, не установлена или у неё нет связанного пакета App, укажите полное официальное название программы вместо пути к файлу:
$(brew --repository homebrew/cask)/developer/bin/generate_cask_token "Google Chrome"
Если скрипт generate_cask_token не работает, см. раздел Подробнее о токенах Cask.
Создание файла Cask
Узнав токен, создайте Cask с помощью команды brew create --cask:
brew create --cask download-url --set-name my-new-cask
Откроется EDITOR с шаблоном нового Cask, который будет сохранён в файле my-new-cask.rb.
Секции Cask
Заполните в Cask следующие секции:
| имя | значение |
|---|---|
version | версия приложения |
sha256 | контрольная сумма SHA-256 файла, загруженного с помощью url и вычисленная командой shasum -a 256 <file>. Её можно отключить, указав специальное значение :no_check. (см. подробное описание секции sha256) |
url | URL файла .dmg/.zip/.tgz (или другого распространённого формата архива), содержащего приложение.Если доменные имена в секциях url и homepage различаются, необходимо добавить параметр verified. |
name | полное официальное название, указанное разработчиком, и любые полезные альтернативные названия (см. подробное описание секции name) |
desc | краткое описание программы в одну строку (см. подробное описание секции desc) |
homepage | главная страница приложения; используется командой brew home |
livecheck | блок Ruby с описанием способа проверки обновлений для этого Cask (см. подробное описание секции livecheck) |
app | относительный путь к пакету .app, который при установке следует переместить в папку /Applications (см. подробное описание секции app) |
zap | дополнительные действия для более полного удаления, включая файлы конфигурации и общие ресурсы (см. подробное описание секции zap) |
Другие часто используемые секции:
| имя | значение |
|---|---|
pkg | относительный путь к файлу .pkg, содержащему дистрибутив (см. подробное описание секции pkg) |
caveats | строка или блок Ruby с информацией о Cask, показываемой пользователю во время установки (см. подробное описание секции caveats) |
uninstall | действия для удаления Cask; секция необязательна, если не используется секция pkg (см. подробное описание секции uninstall) |
В особых случаях могут понадобиться дополнительные секции артефактов. Ещё больше секций для особых случаев перечислено в разделе Необязательные секции.
Подробнее о токенах Cask
Если токен совпадает с токеном уже существующего Cask, автору следует вручную сделать новый токен уникальным, добавив перед ним название разработчика. Например: unison.rb и panic-unison.rb.
По возможности избегайте токенов, отличающихся только расположением дефисов.
Чтобы создать токен вручную или узнать об исключениях для необычных случаев, см. справочник по токенам.
Архивы с вложенными папками
Если загруженный архив распаковывается во вложенную папку, её имя нужно включить в значение app.
Пример:
- Simple Floating Clock загружается в файл
sfc.zip. -
sfc.zipраспаковывает архив в папку с именемSimple Floating Clock. - В папке
Simple Floating Clockнаходится приложениеSimpleFloatingClock.app. - Поэтому в секции
appследует указать относительный путь к вложенной папке:
app "Simple Floating Clock/SimpleFloatingClock.app"
Тестирование и аудит Cask
Попробуйте выполнить:
export HOMEBREW_NO_AUTO_UPDATE=1 export HOMEBREW_NO_INSTALL_FROM_API=1 brew install my-new-cask
Установка прошла успешно? Если что-то пошло не так, исправьте Cask с помощью brew edit my-new-cask.
Также проверьте, успешно ли работает удаление:
brew uninstall my-new-cask
Если всё в порядке, убедитесь, что Cask проходит аудит:
brew audit --new --cask my-new-cask
Также проверьте стиль оформления с помощью brew style:
brew style --fix my-new-cask
Помните, что все эти проверки будут выполнены при отправке пул-реквеста. Если провести их заранее, вы сэкономите всем много времени и сил.
Если ваше приложение плохо работает с Homebrew Cask, после проверки открытых обращений вы можете создать обращение.
Отправка Cask
Куда добавить Cask
См. документацию Допустимые Cask.
Перейдите в свой tap и убедитесь, что новый Cask находится там:
$ cd "$(brew --repository)"/Library/Taps/homebrew/homebrew-cask
$ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
Casks/m/my-new-cask.rb Пока всё хорошо. Теперь создайте ветку для новой функциональности my-new-cask-branch, которую будете использовать в пул-реквесте:
$ git checkout -b my-new-cask-branch Switched to a new branch 'my-new-cask-branch'
Добавьте Cask в индекс:
git add Casks/m/my-new-cask.rb
Посмотреть изменения, которые будут зафиксированы, можно командой:
git diff --cached
Зафиксируйте изменения:
git commit -v
Сообщения коммитов
Для любого проекта Git подойдут следующие правила оформления сообщений коммитов:
- первая строка — краткое описание коммита, не длиннее 50 символов;
- затем следует пустая строка;
- далее — пояснение к коммиту, разбитое на строки длиной до 72 символов.
Подробнее см. Заметка о сообщениях коммитов Git.
Первая строка сообщения коммита становится заголовком пул-реквеста на GitHub, как тема электронного письма. Если в ней будет указана основная информация, мы сможем быстрее ответить на ваш пул-реквест.
В коммитах для проекта Homebrew Cask в первой строке мы рекомендуем указывать название приложения, номер версии и цель коммита.
Примеры хороших и понятных кратких описаний коммитов:
transmission 1.0 (new cask)transmission 2.82transmission: fix checksumcodebox latest (new cask)
Примеры неудачных и неясных кратких описаний коммитов:
Upgrade to v2.82Checksum was bad
Отправка изменений
Отправьте изменения из ветки my-new-cask-branch в свой аккаунт GitHub:
git push $YOUR_GITHUB_USERNAME my-new-cask-branch
Если вы используете двухфакторную аутентификацию GitHub и указали HTTPS в качестве адреса удалённого репозитория, вам нужно создать персональный токен доступа и использовать его вместо пароля.
Создание пул-реквеста на GitHub
а) воспользуйтесь предложением команды git push
Команда git push выводит подсказку о том, как создать пул-реквест:
remote: Create a pull request for 'new-cask-cask' on GitHub by visiting: remote: https://github.com/$YOUR_GITHUB_USERNAME/homebrew-cask/pull/new/my-new-cask-branch
б) воспользуйтесь подсказкой на сайте GitHub
Теперь перейдите в репозиторий homebrew-cask на GitHub. Часто GitHub показывает вашу ветку my-new-cask-branch и удобную кнопку для действия Compare & pull request.
в) создайте пул-реквест на GitHub вручную
В противном случае нажмите кнопку Contribute > Open pull request и выберите compare across forks. В качестве базового форка укажите Homebrew/homebrew-cask @ main, а в качестве головного — $YOUR_GITHUB_USERNAME/homebrew-cask @ my-new-cask-branch. На этом этапе также можно добавить к пул-реквесту дополнительные комментарии.
Поздравляем!
Готово: ваш Cask скоро включат в проект или как-либо иначе примут к сведению. Если сопровождающий предложит внести изменения, просто внесите их локально в ветку my-new-cask-branch и отправьте.
Завершение работы
После отправки пул-реквеста переключитесь обратно на main, чтобы brew update корректно загружал новые Cask:
cd "$(brew --repository)"/Library/Taps/homebrew/homebrew-cask git checkout main
Если ранее вы задали переменную HOMEBREW_NO_AUTO_UPDATE и HOMEBREW_NO_INSTALL_FROM_API, удалите их:
unset HOMEBREW_NO_AUTO_UPDATE unset HOMEBREW_NO_INSTALL_FROM_API
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/Adding-Software-to-Homebrew