Кулинарная книга Cask
Каждый Cask — это Ruby-блок, начинающийся со специальной строки заголовка. Определение Cask всегда заключено в блок do … end. Пример:
cask "alfred" do
version "2.7.1_387"
sha256 "a3738d0513d736918a6d71535ef3d85dd184af267c05698e49ac4c6b48f38e17"
url "https://cachefly.alfredapp.com/Alfred_#{version}.zip"
name "Alfred"
desc "Application launcher and productivity software"
homepage "https://www.alfredapp.com/"
app "Alfred 2.app"
app "Alfred 2.app/Contents/Preferences/Alfred Preferences.app"
end Язык Cask — декларативный
Каждый Cask содержит серию строк (или «полей»), которые определяют, как программное обеспечение должно быть получено и установлено. В декларативном языке автору не нужно беспокоиться о порядке. Достаточно, чтобы все необходимые поля были присутствуют, Homebrew Cask сам определит, что нужно сделать при установке.
Для упрощения обслуживания наиболее часто обновляемые строки обычно помещают в начало. Но это всего лишь конвенция, а не правило.
Исключение: блоки do, такие как postflight, могут содержать блок чистого Ruby-кода. Строки в этом блоке следуют процедурному (зависимому от порядка) парадигме.
Условные операторы
Эффективность
Условные операторы допускаются, но только если они очень эффективны. Тесты на следующие значения известны как приемлемые:
| Значение | Примеры |
|---|---|
MacOS.version | coconutbattery.rb, yasu.rb |
Сравнение версий
Тесты на MacOS.version могут использовать либо символические имена, либо строки версий с операторами числового сравнения:
if MacOS.version <= :mojave # symbolic name
if MacOS.version <= "10.14" # version string
Доступные символы для версий macOS: :el_capitan, :sierra, :high_sierra, :mojave, :catalina и :big_sur. Соответствующие числовые строки версий должны быть представлены как основные релизы, содержащие одну точку.
Обратите внимание, что в официальных репозиториях Homebrew Cask разрешены только символические имена. Числовые сравнения могут использоваться только для сторонних расширений.
Всегда переходить к самой новой версии
Условные операторы должны быть построены таким образом, чтобы по умолчанию использовалась самая последняя версия ОС. При использовании оператора if, проверяйте более старые версии, а затем используйте оператор else, чтобы указать самую последнюю версию. Это увеличивает вероятность того, что Cask будет работать без изменений при выпуске новой ОС. Пример (из coconutbattery.rb):
if MacOS.version <= :sierra # ... elsif MacOS.version <= :mojave # ... else # ... end
Переключение между языками или регионами
Если cask доступен на нескольких языках, вы можете использовать строку language, чтобы переключаться между языками или регионами в зависимости от системного языка.
Произвольные Ruby-методы
В исключительных случаях, когда DSL Cask недостаточно, можно определить произвольные Ruby-переменные и методы внутри Cask, создав пространство имён Utils. Пример:
cask "myapp" do
module Utils
def self.arbitrary_method
...
end
end
name "MyApp"
version "1.0"
sha256 "a32565cdb1673f4071593d4cc9e1c26bc884218b62fef8abc450daa47ba8fa92"
url "https://#{Utils.arbitrary_method}"
homepage "https://www.example.com/"
...
end Это следует использовать экономно: любой метод, необходимый для двух или более Casks, должен быть включён в основной код. Также необходимо позаботиться о том, чтобы такие методы были очень эффективными.
Переменные и методы не должны быть определены вне пространства имён Utils, так как они могут конфликтовать с внутренними компонентами Homebrew Cask.
Подробности строки заголовка
Первая строка Cask (не являющаяся комментарием) имеет формат:
cask "<cask-token>" do
<cask-token> должно совпадать с именем файла Cask без расширения .rb, заключённого в одинарные кавычки.
В настоящее время существуют некоторые произвольные ограничения для токенов Cask, которые в процессе удаления. GitHub Actions будут обрабатывать любые ошибки во время перехода.
Порядок строк
Наличие общего порядка для строк упрощает обновление и обработку Casks. Ниже приведен полный порядок строк (ни один Cask не будет содержать все строки). Пустые строки здесь также важны, так как они помогают визуально разграничивать информацию.
version sha256 language url appcast name desc homepage livecheck auto_updates conflicts_with depends_on container suite app pkg installer binary manpage colorpicker dictionary font input_method internet_plugin prefpane qlplugin mdimporter screen_saver service audio_unit_plugin vst_plugin vst3_plugin artifact, target: # target: shown here as is required with `artifact` stage_only preflight postflight uninstall_preflight uninstall_postflight uninstall zap caveats
Обратите внимание, что каждая строка с дополнительными параметрами (:symbols после ,) должна иметь их на отдельных строках, по одной на строку, в алфавитном порядке. Исключение составляет строка target:, которая обычно состоит из коротких строк.
Строки
Обязательные строки
Каждая из следующих строк обязательна для каждого Cask.
| Имя | Разрешено несколько вхождений? | Значение |
|---|---|---|
version | нет | Версия приложения. См. Подробности строки "Версия" для получения дополнительной информации. |
sha256 | нет | Контрольная сумма SHA-256 файла, загруженного из url, вычисленная с помощью команды shasum -a 256 <file>. Может быть подавлена с помощью специального значения :no_check.См. Подробности строки "Контрольная сумма" для получения дополнительной информации. |
url | нет | URL к файлу .dmg/.zip/.tgz/.tbz2, содержащему приложение.Следует добавить комментарий, если доменные имена в строках url и homepage различаются. Синтаксис блоков следует использовать для URL-адресов, которые изменяются при каждом посещении.См. Подробности строки "URL" для получения дополнительной информации. |
name | да | Строка, содержащая полное и правильное имя, определенное поставщиком. См. Подробности строки "Имя" для получения дополнительной информации. |
desc | нет | Однострочное описание Cask. Отображается при выполнении команды brew info.См. Подробности строки "Описание" для получения дополнительной информации. |
homepage | нет | Домашняя страница приложения; используется для команды brew home. |
Необходимо хотя бы одно поле артефакта
Каждый Cask должен объявлять один или несколько артефактов (т.е. что-то, что нужно установить).
| Имя | Разрешено несколько вхождений? | Значение |
|---|---|---|
app | да | Относительный путь к .app, который должен быть перемещён в папку /Applications при установке.См. Подробности строки "Приложение" для получения дополнительной информации. |
pkg | да | Относительный путь к файлу .pkg с дистрибутивом.См. Подробности строки "Пакет" для получения дополнительной информации. |
binary | да | Относительный путь к бинарному файлу, который должен быть сохранён в папку $(brew --prefix)/bin (обычно /usr/local/bin) при установке.См. Подробности строки "Бинарный" для получения дополнительной информации. |
colorpicker | да | Относительный путь к плагину ColorPicker, который должен быть перемещён в папку ~/Library/ColorPickers при установке. |
dictionary | да | Относительный путь к словарю, который должен быть перемещён в папку ~/Library/Dictionaries при установке. |
font | да | Относительный путь к шрифту, который должен быть перемещён в папку ~/Library/Fonts при установке. |
input_method | да | Относительный путь к методу ввода, который должен быть перемещён в папку ~/Library/Input Methods при установке. |
internet_plugin | да | Относительный путь к сервису, который должен быть перемещён в папку ~/Library/Internet Plug-Ins при установке. |
manpage | да | Относительный путь к странице справки, который должен быть сохранён в соответствующую папку справки при установке, например, /usr/local/share/man/man3 для my_app.3. |
prefpane | да | Относительный путь к панели настроек, который должен быть перемещён в папку ~/Library/PreferencePanes при установке. |
qlplugin | да | Относительный путь к плагину QuickLook, который должен быть перемещён в папку ~/Library/QuickLook при установке. |
mdimporter | да | Относительный путь к импортёру метаданных Spotlight, который должен быть перемещён в папку ~/Library/Spotlight при установке. |
screen_saver | да | Относительный путь к экранозащитнику, который должен быть перемещён в папку ~/Library/Screen Savers при установке. |
service | да | Относительный путь к сервису, который должен быть перемещён в папку ~/Library/Services при установке. |
audio_unit_plugin | да | Относительный путь к плагину Audio Unit, который должен быть перемещён в папку ~/Library/Audio/Components при установке. |
vst_plugin | да | Относительный путь к плагину VST, который должен быть перемещён в папку ~/Library/Audio/VST при установке. |
vst3_plugin | да | Относительный путь к плагину VST3, который должен быть перемещён в папку ~/Library/Audio/VST3 при установке. |
suite | да | Относительный путь к содержащей директории, которая должна быть перемещена в папку /Applications при установке.См. Подробности строки "Набор" для получения дополнительной информации. |
artifact | да | Относительный путь к произвольной директории, которая должна быть перемещена при установке. Должен быть предоставлен абсолютный путь в формате target (пример alcatraz.rb). Используется только в необычных случаях. Строка app предпочтительнее для перемещения .app пакетов. |
installer | да | Описание исполняемого файла, который должен быть запущен для завершения установки. См. Подробности строки "Установщик" для получения дополнительной информации. |
stage_only | нет | true. Утверждение, что Cask не содержит активируемых артефактов. |
Дополнительные строки
| name | Разрешены несколько значений? | Значение |
|---|---|---|
uninstall | да | Процедуры для удаления Cask. Необязательно, если секция pkg не используется.См. Подробности секции удаления для получения дополнительной информации. |
zap | да | Дополнительные процедуры для более полного удаления, включая пользовательские файлы и общие ресурсы. См. Подробности секции Zap для получения дополнительной информации. |
appcast | нет | URL, предоставляющий ленту appcast для поиска обновлений для этого Cask. См. Подробности секции Appcast для получения дополнительной информации. |
depends_on | да | Список зависимостей и требований для этого Cask. См. Подробности секции Depends_on для получения дополнительной информации. |
conflicts_with | да | Список конфликтов с этим Cask (функциональность пока не реализована). См. Подробности секции Conflicts_with для получения дополнительной информации. |
caveats | да | Строка или Ruby-блок, предоставляющий пользователю информацию, специфичную для Cask, во время установки. См. Подробности секции Caveats для получения дополнительной информации. |
livecheck | нет | Ruby-блок, описывающий, как найти обновления для этого Cask. См. Подробности секции Livecheck для получения дополнительной информации. |
preflight | да | Ruby-блок, содержащий операции предварительной установки (необходимы только в редких случаях). |
postflight | да | Ruby-блок, содержащий операции после установки. См. Подробности секции Postflight для получения дополнительной информации. |
uninstall_preflight | да | Ruby-блок, содержащий операции предварительного удаления (необходимы только в редких случаях). |
uninstall_postflight | да | Ruby-блок, содержащий операции после удаления. |
language | обязательно | Ruby-блок, вызываемый с параметрами языка, содержащий другие секции и/или возвращаемое значение. См. Подробности секции Language для получения дополнительной информации. |
container nested: | нет | Относительный путь к внутренней контейнерной структуре, которую необходимо извлечь перед продолжением установки. Это позволяет поддерживать dmg внутри tar, zip внутри dmg и т. д. |
container type: | нет | Символ для переопределения автоматического определения типа контейнера. Может быть одним из: :air, :bz2, :cab, :dmg, :generic_unar, :gzip, :otf, :pkg, :rar, :seven_zip, :sit, :tar, :ttf, :xar, :zip, :naked. (Пример: parse.rb) |
auto_updates | нет | true. Утверждает автоматическое обновление артефактов Cask. Используйте, если Check for Updates… или аналогичное значение присутствует в меню приложения, но не если оно только открывает веб-страницу и не выполняет загрузку и установку самостоятельно. |
Описание секций
Секция: app
В простом случае, если аргумент секции app — строка, исходный файл перемещается в целевой каталог /Applications. Например:
app "Alfred 2.app"
по умолчанию перемещает исходный файл в:
/Applications/Alfred 2.app
Переименование цели
Вы можете переименовать цель, которая отображается в вашем каталоге /Applications, добавив ключ target: в секцию app. Пример (из scala-ide.rb):
app "eclipse/Eclipse.app", target: "Scala IDE.app"
Целевой путь может содержать абсолютный путь
Если у target: есть ведущий слэш, он интерпретируется как абсолютный путь. Содержащий каталог для абсолютного пути будет создан, если он еще не существует. Пример (из manopen.rb):
artifact "openman.1", target: "/usr/local/share/man/man1/openman.1"
Ключ target работает с большинством типов артефактов
Ключ target: работает аналогичным образом для большинства артефактов Cask, таких как app, binary, colorpicker, dictionary, font, input_method, prefpane, qlplugin, mdimporter, service, suite, и artifact.
Ключ target следует использовать только в определенных случаях
Не используйте target: по эстетическим причинам, например, для удаления номеров версий (app "Slack #{version}.app", target: "Slack.app"). Используйте его, когда это имеет функциональный смысл, и четко документируйте свою причину в Cask, используя один из шаблонов: для ясности; для согласованности; для предотвращения конфликтов; по совету разработчика.
Секция: appcast
Значение секции appcast — строка, содержащая URL для appcast, который предоставляет информацию об будущих обновлениях.
Примечание: В большинстве случаев предпочтительнее использовать секцию livecheck, так как она позволяет автоматически обновлять casks.
Основной репозиторий casks принимает только предложения для стабильных версий программного обеспечения (и документированные исключения), но всё равно получает запросы на добавление нестабильных версий. Проверяя отправленный version по содержимому appcast, мы можем лучше обнаружить такие невалидные случаи.
Пример: atom.rb
Существует несколько способов определения appcast:
-
Если приложение распространяется через GitHub релизы,
appcastбудет в форматеhttps://github.com/<user>/<project_name>/releases.atom. Пример:electron.rb -
Если приложение распространяется через GitLab релизы,
appcastбудет в форматеhttps://gitlab.com/<user>/<project_name>/-/tags?format=atom. Пример:grafx.rb -
Популярный фреймворк для обновлений Sparkle обычно использует свойство
SUFeedURLвContents/Info.plistвнутри.appпакетов. Пример:glyphs.rb -
Проекты Sourceforge следуют формату
https://sourceforge.net/projects/<project_name>/rss. Можно использовать более конкретную страницу по мере необходимости, указывая на определённую структуру каталогов:https://sourceforge.net/projects/<project_name>/rss?path=/<path_here>. Пример:seashore.rb -
Appcast может быть любым URL, размещённым разработчиком приложения, который изменяется каждый раз при выходе новой версии, или содержит номер версии текущей версии (например, HTML-страница загрузки). Веб-страницы, которые меняются только при выпуске новой версии, предпочтительнее, так же как и сайты, не содержащие строки версий предыдущих версий (т.е. избегайте страниц с изменениями, если страница загрузки содержит номер текущей версии, но не предыдущих). Пример:
razorsql.rb
Скрипт find-appcast способен определять некоторые из них, а также electron-builder appcasts, которые сложнее найти вручную. Запустите его с "$(brew --repository homebrew/cask)/developer/bin/find-appcast" '</path/to/software.app>'.
Параметры
| ключ | значение |
|---|---|
must_contain: | специальная строка для brew audit --appcast <cask> для проверки. |
Иногда version не совпадает со строкой на веб-странице, в этом случае мы корректируем то, что нужно искать. Например, если version — 6.26.1440, а на странице appcast отображается только 6.24, проверка «является ли version в ленте appcast» завершится неудачей. С must_contain, проверка получает указание «искать вместо version эту строку». В примере must_contain: version.major_minor говорит «искать 6.24», что приводит к успешной проверке.
Если must_contain не указан, проверка рассматривает от начала строки version до первой буквы, которая не является буквой, цифрой или точкой. Пример: если version — 6.26b-14,40, проверка увидит 6.26b. Это сделано для покрытия большинства случаев по умолчанию, при этом позволяя использовать сложные version для интерполяции в остальную часть casks.
Пример использования must_contain: hwsensors.rb
Секция: binary
В простом случае, если аргумент секции binary — строка, исходный файл связывается в каталог $(brew --prefix)/bin (обычно /usr/local/bin) при установке. Например (из operadriver.rb):
binary "operadriver"
создаёт символическую ссылку на:
$(brew --prefix)/bin/operadriver
из исходного файла, например:
/usr/local/Caskroom/operadriver/0.2.2/operadriver
Бинарный файл (или несколько) также может быть частью пакета приложения:
app "Atom.app"
binary "#{appdir}/Atom.app/Contents/Resources/app/apm/bin/apm" Вы можете переименовать целевой файл, который отображается в каталоге бинарных файлов, добавив ключ target: в секцию binary:
binary "#{appdir}/Atom.app/Contents/Resources/app/atom.sh", target: "atom" END_OF_DOCUMENT_MARKER
```Поведение и использование target: такое же, как и у app. Однако, для binary правила выбора случаев не применяются так строго. Можно использовать дополнительные возможности с target:, чтобы обеспечить согласованность с другими инструментами командной строки, такими как изменение регистра, удаление расширения или приведение имени к стандартному виду.
Раздел: caveats
Иногда возникают особенности при установке программного обеспечения, с которыми Homebrew Cask не может или не должен справляться программно. В таких случаях, caveats — это способ проинформировать пользователя. Информация в caveats отображается, когда кэшка вызывается с помощью install или info.
Чтобы избежать перегрузки пользователей сообщениями (тем самым снижая их чувствительность к важным), caveats следует использовать экономно и исключительно для вопросов, связанных с установкой. Если вы не уверены, относится ли caveat, который вы считаете важным, к вопросам установки, обратитесь к разработчикам. Как общее правило, если ваш случай не описан в нашем полном руководстве caveats Mini-DSL, его, скорее всего, не примут.
caveats как строка
Когда caveats является строкой, она оценивается во время компиляции. Следующие методы доступны для интерполяции, если caveats находится в своем обычном положении в конце кэшка:
| метод | описание |
|---|---|
token | токен кэшка |
version | версия кэшка |
homepage | домашняя страница кэшка |
caskroom_path | каталог, содержащий этот кэш, как правило, /usr/local/Caskroom/<token> (доступно только в блочной форме) |
staged_path | место размещения кэша, включая номер версии: /usr/local/Caskroom/<token>/<version> (доступно только в блочной форме) |
Пример:
caveats "Using #{token} is hazardous to your health." caveats как блок
Когда caveats является блоком Ruby, оценка откладывается до времени установки. Внутри блока вы можете обратиться к переменной экземпляра @cask, и вызвать любой метод, доступный для @cask.
caveats Мини-DSL
Доступен мини-DSL в пределах блоков caveats.
Следующие методы могут быть вызваны для создания стандартных сообщений об ошибках:
| метод | описание |
|---|---|
path_environment_variable "path" | пользователи должны убедиться, что path находится в переменной окружения $PATH. |
zsh_path_helper "path" | пользователям zsh необходимо выполнить дополнительные шаги, чтобы убедиться, что path находится в их переменной окружения $PATH. |
depends_on_java "version" | пользователи должны убедиться, что у них установлена указанная версия Java. version может быть точной (например, 6), минимальной (например, 7+) или отсутствовать (если подходит любая версия). |
logout | пользователям необходимо выйти и снова войти в систему, чтобы завершить установку. |
reboot | пользователям необходимо перезагрузить систему, чтобы завершить установку. |
files_in_usr_local | кэш устанавливает файлы в /usr/local, что может вызвать проблемы с Homebrew. |
discontinued | все разработки программного обеспечения официально прекращены в источнике. |
free_license "web_page" | пользователи могут получить официальную лицензию на использование программного обеспечения на web_page. |
kext | пользователям может потребоваться включить свои kexts в Системные настройки → Безопасность и конфиденциальность → Общие. |
unsigned_accessibility | пользователям потребуется повторно включить приложение при каждом обновлении в Системных настройках → Безопасность и конфиденциальность → Конфиденциальность, поскольку оно не подписано. |
license "web_page" | программное обеспечение имеет лицензию на использование на web_page. |
Пример:
caveats do path_environment_variable "/usr/texbin" end
Раздел: conflicts_with
conflicts_with используется для объявления конфликтов, которые препятствуют установке или корректной работе кэша.
conflicts_with кэш
Значение должно быть другим токеном кэша.
Пример использования: wireshark, который конфликтует с wireshark-chmodbpf.
conflicts_with cask: "wireshark-chmodbpf"
conflicts_with формула
Примечание: conflicts_with formula: — заглушка и пока не функциональна.
Значение должно быть другим именем формулы.
Пример использования: macvim, который конфликтует с формулой macvim.
conflicts_with formula: "macvim"
Раздел: depends_on
depends_on используется для объявления зависимостей и требований к кэшу. depends_on не проверяется до попытки install.
depends_on кэш
Значение должно быть другим токеном кэша, необходимым для текущего кэша.
Пример использования: cellery зависит от OSXFUSE:
depends_on cask: "osxfuse"
depends_on формула
Значение должно содержать имя формулы Homebrew, необходимое для кэша.
Пример использования: некоторые дистрибутивы содержатся в форматах архивов, таких как 7z, которые не поддерживаются стандартными инструментами Apple. В таких случаях более функциональный читатель архивов может быть включён во время установки, объявлением зависимости от формулы Homebrew unar:
depends_on formula: "unar"
depends_on macOS
Требование точной версии macOS
Значение для depends_on macos: может быть символом или массивом символов, перечисляя точные совместимые версии macOS.
Доступные значения для версий macOS:
| символ | соответствующая версия |
|---|---|
:el_capitan | 10.11 |
:sierra | 10.12 |
:high_sierra | 10.13 |
:mojave | 10.14 |
:catalina | 10.15 |
:big_sur | 11.0 |
:monterey | 12.0 |
Охватываются только основные версии (номера версий, содержащие одну точку). Символьная форма используется для лучшей читаемости. Следующие варианты являются допустимыми способами перечисления точных требований к версии macOS для кэша:
depends_on macos: :big_sur depends_on macos: [ :catalina, :big_sur, ]
Установка минимальной версии macOS
depends_on macos: также может принимать строку, начинающуюся с оператора сравнения, такого как >=, за которым следует версия macOS в указанном выше формате. Следующее выражение означает «не менее macOS Big Sur (11.0»:
depends_on macos: ">= :big_sur"
Выражение сравнения не может быть комбинировано с другими формами depends_on macos:.
depends_on arch
Значение для depends_on arch: может быть символом или массивом символов, перечисляющих требования к аппаратной совместимости для кэша. Требование выполняется во время установки, если хотя бы одно значение arch: совпадает с аппаратным обеспечением пользователя.
Доступные символы для аппаратного обеспечения:
| символ | значение |
|---|---|
:x86_64 | 64-разрядный Intel |
:intel | 64-разрядный Intel |
:arm64 | Apple Silicon |
Следующие выражения являются допустимыми:
depends_on arch: :intel depends_on arch: :x86_64 # same meaning as above depends_on arch: [:x86_64] # same meaning as above depends_on arch: :arm64
Все ключи depends_on
| ключ | описание |
|---|---|
formula: | формула Homebrew |
cask: | токен кэша |
macos: | символ, строка, массив или выражение сравнения, определяющее требования к версии macOS |
arch: | символ или массив, определяющий требования к аппаратному обеспечению |
java: | *заглушка — пока не функциональна* |
Раздел: desc
desc принимает строку UTF-8 в одну строку, содержащую краткое описание программного обеспечения. Она используется для поиска и различения, поэтому должна кратко описывать, что делает программное обеспечение (или что вы можете с ним сделать).
desc не предназначен для слоганов приложений! Описания поставщиков, как правило, наполнены общими прилагательными, такими как «современный» и «лёгкий». Это бесполезный маркетинговый «мусор» (вы когда-нибудь видели приложения, которые гордились бы тем, что они устаревшие и громоздкие?), который необходимо удалить. Можно использовать информацию с веб-сайта программного обеспечения в качестве отправной точки, но в большинстве случаев потребуется её редактирование.
Рекомендации и запреты
-
Выполняйте: Начинайте с большой буквы.
- desc "sound and music editor" + desc "Sound and music editor"
-
Выполняйте: Будьте краткими, т.е. используйте меньше 80 символов.
- desc "Sound and music editor which comes with effects, instruments, sounds and all kinds of creative features" + desc "Sound and music editor"
-
Выполняйте: Описывайте, что делает или есть программное обеспечение:
- desc "Development of musical ideas made easy" + desc "Sound and music editor"
-
Не выполняйте: Не включайте платформу. Кэши работают только на macOS, поэтому эта информация избыточна.
- desc "Sound and music editor for macOS" + desc "Sound and music editor"
-
Не выполняйте: Не включайте имя кэша.
- desc "Ableton Live is a sound and music editor" + desc "Sound and music editor"
-
Не выполняйте: Не включайте поставщика. Это должно быть добавлено в имя кэша вместо этого.
- desc "Sound and music editor made by Ableton" + desc "Sound and music editor"
-
Не выполняйте: Не добавляйте личные местоимения.
- desc "Edit your music files" + desc "Sound and music editor"
-
Не выполняйте: Не используйте пустые маркетинговые фразы.
- desc "Beautiful and powerful modern sound and music editor" + desc "Sound and music editor"
Раздел: \*flight
Оценка блоков всегда откладывается
Ruby-блоки, определённые preflight, postflight, uninstall_preflight, и uninstall_postflight, не оцениваются до времени установки или удаления. Внутри блока вы можете обратиться к переменной экземпляра @cask, и вызвать любой метод, доступный для @cask.
*flight Мини-DSL
Доступен мини-DSL в этих блоках.
Следующие методы могут быть вызваны для выполнения стандартных задач:
| method | availability | description |
|---|---|---|
set_ownership(paths) |
preflight, postflight, uninstall_preflight
| установить права пользователя и группы на paths. Пример: unifi-controller.rb
|
set_permissions(paths, permissions_str) |
preflight, postflight, uninstall_preflight
| установить права доступа в paths на permissions_str. Пример: docker-machine.rb
|
set_ownership(paths) по умолчанию устанавливает права пользователя на текущего пользователя, а права группы на staff. Эти значения можно изменить, передав дополнительные параметры: set_ownership(paths, user: 'user', group: 'group').
Установка: installer
Этот раздел всегда должен сопровождаться uninstall.
Раздел installer принимает ряд пар ключ-значение, первым из которых должен быть manual: или script:.
Руководство по установке
installer manual: принимает одно строковое значение, описывающее установщик графического интерфейса, который должен быть запущен пользователем в последующее время. Путь может быть абсолютным или относительным к Cask. Пример (из nutstore.rb):
installer manual: "Nutstore Installer.app"
Установка скриптом
installer script: вводит ряд пар ключ-значение, описывающих команду, которая автоматизирует завершение установки. Его никогда не следует использовать для интерактивных установок. Формат аналогичен uninstall script::
| ключ | значение |
|---|---|
executable: | путь к скрипту установки, который будет запущен |
args: | массив аргументов скрипта установки |
input: | массив строк ввода, который будет передан в stdin скрипта |
must_succeed: | установлено в false если скрипту разрешено завершиться неудачно |
sudo: | установлено в true если скрипту требуется sudo
|
Путь может быть абсолютным или относительным к Cask. Пример (из miniforge.rb):
installer script: {
executable: "Miniforge3-#{version}-MacOSX-x86_64.sh",
args: ["-b", "-p", "#{caskroom_path}/base"],
} Если installer script: не требует ни одного из значений ключей, он может указывать непосредственно на путь к скрипту установки:
installer script: "#{staged_path}/install.sh" Раздел: language
Раздел language может соответствовать кодам языков ISO 639-1, региональным идентификаторам (ISO 3166-1 Alpha 2) и кодам скриптов (ISO 15924), или их комбинации.
Английский язык США всегда должен использоваться по умолчанию:
language "zh", "CN" do "zh_CN" end language "de" do "de_DE" end language "en-GB" do "en_GB" end language "en", default: true do "en_US" end
Обратите внимание, что следующее не то же самое:
language "en", "GB" do # matches all locales containing "en" or "GB" end language "en-GB" do # matches only locales containing "en" and "GB" end
Значение возвращаемого language блока можно получить, просто вызвав language.
homepage "https://example.org/#{language}" Примеры: Firefox, Battle.net
Установка
Чтобы установить Cask на определенном языке, вы можете передать параметр --language= в brew install:
brew install firefox --language=it
Раздел: livecheck
Раздел livecheck используется для автоматического получения последней версии Cask из заметок к изменениям, примечаний к выпуску, appcast и т. д. См. также: brew livecheck справочник
Каждый livecheck блок должен содержать url, которое может быть строкой или символом, указывающим на другие URL-адреса в Cask (:url или :homepage).
Кроме того, livecheck должен указать, какой strategy должен использоваться для извлечения версии:
strategy | Описание |
|---|---|
:header_match | извлечь версию из HTTP-заголовков (например, Location или Content-Disposition) |
:page_match | извлечь версию из содержимого страницы |
:sparkle | извлечь версию из содержимого appcast Sparkle |
Вот базовый пример извлечения простой версии со страницы:
livecheck do
url "https://example.org/my-app/download"
strategy :page_match
regex(%r{href=.*?/MyApp-(\d+(?:\.\d+)*)\.zip}i)
end Если URL загрузки присутствует на главной странице, мы можем использовать символ вместо строки:
livecheck do
url :homepage
strategy :page_match
regex(%r{href=.*?/MyApp-(\d+(?:\.\d+)*)\.zip}i)
end Стратегия header_match будет пытаться разобрать версию из имени файла (в заголовке Content-Disposition) и конечного URL (в заголовке Location). Если это не сработает, можно указать regex, например:
strategy :header_match regex(/MyApp-(\d+(?:\.\d+)*)\.zip/i)
Если версия зависит от нескольких заголовков, можно указать блок, например:
strategy :header_match do |headers|
v = headers["content-disposition"][/MyApp-(\d+(?:\.\d+)*)\.zip/i, 1]
id = headers["location"][%r{/(\d+)/download$}i, 1]
next if v.blank? || id.blank?
"#{v},#{id}"
end Аналогично, стратегия :page_match также может использоваться для более сложных версий путем указания блока:
strategy :page_match do |page|
match = page.match(%r{href=.*?/(\d+)/MyApp-(\d+(?:\.\d+)*)\.zip}i)
next if match.blank?
"#{match[2]},#{match[1]}"
end Раздел: name
name принимает строку UTF-8, определяющую имя программного обеспечения, включая регистр и пунктуацию. Она используется для повышения поисковой эффективности и устранения неоднозначностей.
В отличие от токена, который упрощен и сведен к ограниченному набору символов, раздел name может включать правильный регистр, пробелы и пунктуацию, чтобы соответствовать официальному названию программного обеспечения. Для целей устранения неоднозначностей рекомендуется писать полное название приложения и, при необходимости, название поставщика. Хорошим примером является pycharm-ce, чье имя написано полностью как Jetbrains PyCharm Community Edition, хотя, скорее всего, оно никогда не упоминается таким образом нигде.
Дополнительные сведения о программном обеспечении можно указать в разделе desc.
Раздел name может повторяться несколько раз, если существуют полезные альтернативные имена. Первый экземпляр должен использовать латинский алфавит. Например, см. Cask cave-story, оригинальное имя которого не использует латинский алфавит.
Раздел: pkg
Этот раздел всегда должен сопровождаться uninstall
Первый аргумент раздела pkg должен быть относительным путем к файлу .pkg для установки. Например:
pkg "Unity.pkg"
Следующие аргументы к pkg — это пары ключ/значение, которые изменяют процесс установки. В настоящее время поддерживаются ключи allow_untrusted: и choices:.
pkg allow_untrusted:
pkg allow_untrusted: true можно использовать для установки .pkg с недоверенным сертификатом, передав -allowUntrusted в /usr/sbin/installer.
Этот параметр не разрешен в официальных хранилищах Homebrew Cask, он предоставляется только для использования в хранилищах сторонних разработчиков или локальных Cask.
Пример (alinof-timer.rb):
pkg "AlinofTimer.pkg", allow_untrusted: true
pkg choices:
pkg choices: можно использовать для переопределения параметров установки по умолчанию .pkg через -applyChoiceChangesXML. Используется десериализованная версия свойства choiceChanges (обратитесь к разделу CHOICE CHANGES FILE руководства installer через запуск man -P 'less --pattern "^CHOICE CHANGES FILE"' installer).
Выполнение команды macOS:
installer -showChoicesXML -pkg '/path/to/my.pkg'
выведет XML, с помощью которого можно извлечь значения choices:, а также их эквиваленты для параметров графического интерфейса.
См. данный запрос на изменение для wireshark-chmodbpf и данный для wine-staging для некоторых примеров процедуры.
Пример (wireshark-chmodbpf.rb):
pkg "Wireshark #{version} Intel 64.pkg",
choices: [
{
"choiceIdentifier" => "wireshark",
"choiceAttribute" => "selected",
"attributeSetting" => 0,
},
{
"choiceIdentifier" => "chmodbpf",
"choiceAttribute" => "selected",
"attributeSetting" => 1,
},
{
"choiceIdentifier" => "cli",
"choiceAttribute" => "selected",
"attributeSetting" => 0,
},
] Пример (wine-staging.rb):
pkg "winehq-staging-#{version}.pkg",
choices: [
{
"choiceIdentifier" => "choice3",
"choiceAttribute" => "selected",
"attributeSetting" => 1,
},
] Раздел: sha256
Вычисление SHA256
Значение sha256 обычно вычисляется командой:
shasum --algorithm 256 <file>
Специальное значение :no_check
Специальное значение sha256 :no_check используется для отключения проверки SHA, когда проверка контрольных сумм нецелесообразна из-за конфигурации поставщика.
version :latest требует sha256 :no_check, и эта пара часто используется. Однако sha256 :no_check не требует version :latest.
Мы используем контрольную сумму всякий раз, когда это возможно.
Раздел: suite
Некоторые дистрибутивы предоставляют набор нескольких приложений или приложение с необходимыми данными, которые необходимо установить вместе в подкаталоге /Applications.
Для этих Cask используйте раздел suite для определения каталога, содержащего набор приложений. Пример (из sketchup.rb):
suite "SketchUp 2016"
Значение suite никогда не является пакетом .app bundle, а является обычным каталогом.
Раздел: uninstall
Если вы не можете разработать работающий раздел
uninstall, отправьте свой Cask, тем не менее. Администраторы могут помочь вам написать разделuninstall— просто попросите!
uninstall pkgutil: — самый простой и полезный
pkgutil: — самый простой и полезный uninstall директива. См. Ключ удаления pkgutil:.
uninstall необходим для Cask, которые устанавливают pkg или установщик вручную
Для большинства Cask действия удаления определяются автоматически, и явный раздел uninstall не требуется. Однако Cask, который использует pkg или installer manual: разделы, не будут знать, как правильно удалить, если не указан раздел uninstall.
Итак, хотя Cask DSL не навязывает это требование, для конечных пользователей гораздо лучше, если каждый pkg и installer manual: имеет соответствующий uninstall.
Раздел uninstall доступен для не-pkg Cask и полезен для некоторых специфических случаев. Однако документация ниже касается типичного случая использования uninstall для определения процедур для pkg.
Несколько методов удаления
Поскольку установщики pkg могут выполнять произвольные действия, для удаления в каждом случае необходимы различные методы. Возможно, вам потребуется указать одну или несколько пар «ключ-значение» в качестве аргументов к uninstall.
Краткое описание ключей
-
early_script:(строка или хеш) — подобноscript:, но выполняется на ранней стадии (для особых случаев, лучше избегать) -
launchctl:(строка или массив) — идентификаторы задачlaunchctlдля удаления -
quit:(строка или массив) — идентификаторы пакетов работающих приложений для завершения -
signal:(массив массивов) — номера сигналов и идентификаторы пакетов работающих приложений для отправки Unix-сигнала (используется, когдаquit:не работает) -
login_item:(строка или массив) — имена элементов входа для удаления -
kext:(строка или массив) — идентификаторы пакетов kext для выгрузки из системы -
script:(строка или хеш) — относительный путь к скрипту удаления, который будет выполнен с помощью sudo; использовать хеш, если нужны аргументы-
executable:- относительный путь к скрипту удаления, который будет выполнен с помощью sudo (требуется для хеш-формы) -
args:- массив аргументов для скрипта удаления -
input:- массив строк ввода, которые будут отправлены вstdinскрипта -
must_succeed:- установить вfalseесли скрипт разрешено завершать неудачно -
sudo:- установить вtrueесли скрипту необходимоsudo
-
-
pkgutil:(строка, регулярное выражение или массив строк и регулярных выражений) — строки или регулярные выражения, соответствующие идентификаторам пакетов для удаления с использованиемpkgutil -
delete:(строка или массив) — одиночные кавычки, абсолютные пути к файлам или каталогам для удаления.delete:следует использовать только в крайнем случае.pkgutil:предпочтительнее. -
rmdir:(строка или массив) — пути в одинарных кавычках к каталогам для удаления, если они пустые. Работает рекурсивно. -
trash:(строка или массив) — пути в одинарных кавычках к файлам или каталогам для перемещения в Корзину.
Каждый метод uninstall применяется в указанном выше порядке. Порядок появления ключей uninstall в файле Cask игнорируется.
Для помощи в заполнении правильных значений для ключей uninstall существуют несколько вспомогательных скриптов, расположенных в developer/bin в репозитории Homebrew Cask. Каждый из этих скриптов реагирует на опцию -help дополнительной документацией.
Самый простой способ определить раздел uninstall — на системе, где pkg в настоящее время установлен и работает. Чтобы работать с файлом pkg после его удаления, см. Работа с файлом pkg вручную, ниже.
uninstall Ключ pkgutil:
Это самый полезный ключ удаления. pkgutil: часто достаточно для полного удаления pkg, и предпочтительнее delete:.
Идентификаторы самых недавно установленных пакетов можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_recent_pkg_ids"
pkgutil: также принимает регулярное выражение для сопоставления с несколькими идентификаторами пакетов. Регулярные выражения несколько нестандартны. Для проверки регулярного выражения pkgutil: на установленных пакетах используйте команду:
"$(brew --repository homebrew/cask)/developer/bin/list_pkg_ids_by_regexp" <regular-expression>
Список файлов, связанных с идентификатором пакета
После того, как вы узнали идентификатор установленного пакета (выше), вы можете перечислить все файлы в вашей системе, связанные с этим идентификатором пакета, используя команду macOS:
pkgutil --files <package.id.goes.here>
Перечисление связанных файлов может помочь вам оценить, содержал ли пакет какие-либо launchctl задачи или расширения ядра (kext).
uninstall Ключ launchctl:
Идентификаторы загруженных launchctl задач можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_loaded_launchjob_ids"
Идентификаторы всех установленных launchctl задач можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_installed_launchjob_ids"
uninstall Ключ quit:
Идентификаторы пакетов работающих приложений можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_running_app_ids"
Идентификаторы пакетов внутри пакета приложения на диске можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_ids_in_app" '/path/to/application.app'
uninstall Ключ signal:
signal: потребуется только в редких случаях, когда процесс не отвечает на quit:.
Идентификаторы пакетов signal: целевых объектов можно получить, как для quit:. Значение для signal: — массив массивов, где каждая ячейка содержит два элемента: желаемый Unix-сигнал и соответствующий идентификатор пакета.
Unix-сигнал может быть задан в числовом или строковом формате (см. страницу руководства kill для получения дополнительной информации).
Элементы массива signal: применяются в указанном порядке, только если существует соответствующий процесс, связанный с идентификатором пакета, и завершаются, когда этот процесс завершается. Идентификатор пакета может быть повторен для отправки более одного сигнала одному и тому же процессу.
Лучше использовать наименее жесткие сигналы, которые достаточно для остановки процесса. В частности, сигнал KILL может иметь нежелательные побочные эффекты.
Пример, с часто используемыми сигналами в порядке возрастания жесткости:
uninstall signal: [
["TERM", "fr.madrau.switchresx.daemon"],
["QUIT", "fr.madrau.switchresx.daemon"],
["INT", "fr.madrau.switchresx.daemon"],
["HUP", "fr.madrau.switchresx.daemon"],
["KILL", "fr.madrau.switchresx.daemon"],
] Обратите внимание, что когда несколько работающих процессов соответствуют заданному идентификатору пакета, все соответствующие процессы получат сигнал.
В отличие от директив quit:, Unix-сигналы исходят от текущего пользователя, а не от суперпользователя. Это рассматривается как функция безопасности, так как суперпользователь может остановить систему с помощью сигналов. Однако это несоответствие также можно считать ошибкой, и его следует каким-то образом исправить в будущих версиях.
uninstall ключ login_item:
Элементы входа, связанные с пакетом приложения на диске, можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_login_items_for_app" '/path/to/application.app'
Обратите внимание, что, вероятно, вам нужно будет хотя бы один раз открыть приложение, чтобы любые элементы входа были присутствовать.
uninstall Ключ kext:
Идентификаторы загруженных расширений ядра можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_loaded_kext_ids"
Идентификаторы внутри пакета kext, который вы нашли на диске, можно перечислить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_id_in_kext" '/path/to/name.kext'
uninstall Ключ script:
uninstall script: вводит серию пар «ключ-значение», описывающих команду, которая автоматизирует завершение удаления. Пример (из gpgtools.rb):
uninstall script: {
executable: "#{staged_path}/Uninstall.app/Contents/Resources/GPG Suite Uninstaller.app/Contents/Resources/uninstall.sh",
sudo: true,
} Важно отметить, что, хотя script: в приведенном выше примере пытается полностью удалить pkg, его не следует использовать в ущерб pkgutil:, а как дополнение, когда это возможно.
uninstall Ключ delete:
delete: следует использовать только в крайнем случае, если другие uninstall методы недостаточны.
Аргументы для uninstall delete: должны использовать следующие основные правила:
- На путях выполняется основное расширение тильды, т. е. ведущая
~расширяется до домашнего каталога. - Пути должны быть абсолютными.
- Расширение шаблонов выполняется с использованием стандартного набора символов.
Для удаления файлов, специфичных для пользователя, используйте zap раздел.
uninstall Ключ trash:
Аргументы trash: следуют тем же правилам, что и для delete:.
Работа с файлом pkg вручную
Искушенные пользователи могут захотеть поработать с файлом pkg вручную, не устанавливая пакет.
Список файлов, которые могут быть установлены из pkg можно получить с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_payload_in_pkg" '/path/to/my.pkg'
Кандидатные имена приложений, полезные для определения имени Cask, можно извлечь из файла pkg с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_apps_in_pkg" '/path/to/my.pkg'
Кандидатные идентификаторы пакетов, которые могут быть полезны в ключе pkgutil: можно извлечь из файла pkg с помощью команды:
"$(brew --repository homebrew/cask)/developer/bin/list_ids_in_pkg" '/path/to/my.pkg'
Следующий полностью ручной метод поиска идентификаторов пакетов в файле пакета:
- Разархивировать
/path/to/my.pkg(замените на ваше имя пакета) с помощьюpkgutil --expand /path/to/my.pkg /tmp/expanded.unpkg. - Распакованный пакет — это папка. Идентификаторы пакетов содержатся в файлах, именованных
PackageInfo. Эти файлы можно найти с помощью командыfind /tmp/expanded.unpkg -name PackageInfo. -
Файлы
PackageInfo— это XML-файлы, а идентификаторы пакетов находятся в атрибутахidentifierтегов<pkg-info>, которые выглядят как<pkg-info ... identifier="com.oracle.jdk7u51" ... >, где дополнительные атрибуты были удалены и заменены многоточием. - Kext внутри пакетов также описаны в файлах
PackageInfo. Если расширения ядра присутствуют, командаfind /tmp/expanded.unpkg -name PackageInfo -print0 | xargs -0 grep -i kextдолжна вернуть тег<bundle id>с атрибутомpath, который содержит расширение.kext, например<bundle id="com.wavtap.driver.WavTap" ... path="./WavTap.kext" ... />. - После того, как идентификаторы пакетов будут определены, распакованную папку пакета можно удалить.
Раздел: url
HTTPS URL предпочтительны
Если доступен, URL-адрес HTTPS предпочтительнее. Обычный URL-адрес HTTP следует использовать только в случае отсутствия безопасной альтернативы.
Дополнительные параметры URL HTTP/S
Когда обычная строка URL недостаточна для загрузки файла, дополнительная информация может быть предоставлена загрузчику на основе curl, в виде пар «ключ-значение», добавленных к url:
| key | value |
|---|---|
verified: | строка, повторяющая начало url, для целей проверки. См. ниже. |
using: | символ :post — единственное допустимое значение |
cookies: | хеш куки, который должен быть установлен в запросе на загрузку |
referer: | строка, содержащая URL, который должен быть установлен в качестве referer в запросе на загрузку |
header: | строка, содержащая заголовок, который должен быть установлен для запроса на загрузку. |
user_agent: | строка, содержащая user agent, который должен быть установлен для запроса на загрузку. Также может быть установлено значение :fake, которое будет использовать строку user agent, подобную браузерной. Мы предпочитаем :fake, когда сервер не требует конкретного user agent. |
data: | хеш параметров, которые должны быть установлены в запросе POST |
Пример использования cookies:: java.rb
Пример использования referer:: rrootage.rb
Пример использования header:: issue-325182724
Когда домены URL и домашней страницы отличаются, добавьте verified:
Когда домены url и homepage отличаются, расхождение должно быть задокументировано с параметром verified:, повторяющим наименьшую возможную часть URL, уникально идентифицирующую приложение или поставщика, за исключением протокола. Пример: shotcut.rb.
Это необходимо, чтобы пользователь, проверяющий пакет, знал, что URL был проверен командой Homebrew Cask как тот, который предоставил поставщик, даже если он может выглядеть неофициальным. Наша ответственность как поддерживающих Homebrew Cask — проверить информацию url и homepage при первом добавлении (или последующем изменении, за исключением версионирования).
Параметр не означает, что вы должны слепо доверять источнику, но мы одобряем только те пакеты, в которых пользователи могут легко проверить подлинность с помощью простых средств, таких как проверка официальной домашней страницы или публичного репозитория. В редких случаях могут использоваться несколько более сложные методы, такие как проверка установленного нами в качестве официального appcast. Случаи, когда такие быстрые проверки невозможны (например, когда URL загрузки находится за стеной регистрации), рассматриваются более строго здесь.
Сложности с поиском URL
Веб-браузеры могут скрывать прямое местоположение загрузки url по разным причинам. Homebrew Cask предоставляет скрипт, который может читать расширенные атрибуты файлов, чтобы извлечь фактический URL источника для большинства файлов, скачанных браузером на macOS. Скрипт обычно генерирует несколько кандидатов; вам может потребоваться протестировать каждый из них:
$(brew --repository homebrew/cask)/developer/bin/list_url_attributes_on_file <file>
URL Subversion
В редких случаях дистрибутив может быть недоступен через обычный HTTP/S. Поддерживаются также URL Subversion, которые можно указать, добавив следующие пары ключ/значение к url:
| key | value |
|---|---|
using: | символ :svn — единственное допустимое значение |
revision: | строка, идентифицирующая версию Subversion для загрузки |
trust_cert: | установить в true для автоматического доверия к сертификату, представленному сервером (избегая интерактивного запроса) |
SourceForge/OSDN URL
Проекты SourceForge и OSDN (ранее SourceForge.JP) являются распространенными способами распространения бинарных файлов, но они предоставляют множество различных стилей URL для доступа к файлам.
Мы предпочитаем URL в таком формате:
https://downloads.sourceforge.net/<project_name>/<filename>.<ext>
Или, если это с OSDN:
http://<subdomain>.osdn.jp/<project_name>/<release_id>/<filename>.<ext>
<subdomain> обычно имеет вид dl или <user>.dl.
Если эти форматы недоступны, и приложение предназначено только для macOS (в противном случае загрузка из командной строки по умолчанию использует версию для Windows), мы предпочитаем использование следующего формата:
https://sourceforge.net/projects/<project_name>/files/latest/download
Некоторые поставщики блокируют загрузки из командной строки
Некоторые хостинг-провайдеры активно блокируют HTTP-клиенты командной строки. Такие URL не могут быть использованы в пакетах Casks.
Другие поставщики могут использовать URL, которые меняются периодически или даже при каждом посещении (например, FossHub). Хотя некоторые случаи можно обойти, они обычно возникают, когда поставщик активно пытается предотвратить автоматические загрузки, поэтому мы предпочитаем не добавлять эти пакеты в основной репозиторий.
Использование блока для отсрочки выполнения кода
Некоторые пакеты (особенно ночные сборки) имеют версионированные URL загрузки, но обновляются так часто, что становится непрактично поддерживать их актуальность обычным способом. Для них мы хотим динамически определить url.
Проблема
Теоретически, можно написать произвольный код Ruby прямо в определении пакета для извлечения и построения временного URL.
Однако это обычно включает в себя HTTP-обращение к целевой странице, что может занять много времени. Из-за того, как Homebrew Cask загружает и анализирует пакеты, такие дорогостоящие операции недопустимо выполнять непосредственно в теле определения пакета.
Написание блока
Аналогично блокам preflight, postflight, uninstall_preflight, и uninstall_postflight, блок url предлагает необязательный синтаксис блоков:
url "https://handbrake.fr/nightly.php" do |page| file_path = page[/href=["']?([^"' >]*Handbrake[._-][^"' >]+\.dmg)["' >]/i, 1] file_path ? URI.join(page.url, file_path) : nil end
Вы также можете вкладывать блоки url do внутри блоков url do для последовательного обращения к URL.
Блок вычисляется только при необходимости, например, при загрузке или проверке пакета. Внутри блока вы можете безопасно выполнять такие действия, как HTTP/S-запросы, которые могут занимать много времени. Вы также можете обратиться к переменной @cask и вызвать любой метод, доступный для @cask.
Блок будет вызван непосредственно перед загрузкой; его результат будет принят как String (или пара String и Hash, содержащая параметры), и затем используется в качестве URL загрузки.
Вы можете использовать блок url с прямым аргументом или блоком, но не с обоими.
Пример использования синтаксиса блоков: vlc-nightly.rb
Смешивание дополнительных параметров URL с синтаксисом блоков
В редких случаях вам может потребоваться задать параметры URL, такие как cookies или referer, одновременно с использованием синтаксиса блоков.
Это возможно, возвращая массив из двух элементов в качестве результата блока. Первый элемент массива должен быть URL загрузки, а второй — хеш Hash параметров.
Раздел: version
version, хотя и связан с собственной версией приложения, не обязательно точно её следует воспроизводить. Часто его слегка изменяют, чтобы можно было интерполировать в другие разделы, обычно в url для создания пакета, который требует только изменения version и sha256 при обновлении. При необходимости это можно доработать с помощью методов строк Ruby.
Например:
Вместо
version "1.2.3" url "https://example.com/file-version-123.dmg"
Можно использовать
version "1.2.3"
url "https://example.com/file-version-#{version.delete('.')}.dmg" Мы также можем использовать регулярные выражения. Так вместо
version "1.2.3build4" url "https://example.com/1.2.3/file-version-1.2.3build4.dmg"
Можно использовать
version "1.2.3build4"
url "https://example.com/#{version.sub(%r{build\d+}, '')}/file-version-#{version}.dmg" version :latest
Специальное значение :latest используется для пакетов, которые:
-
urlне содержат версии. - Получение корректного значения для
versionслишком сложно или непрактично, даже с нашими автоматизированными системами.
Пример: spotify.rb
методы версии
Однако приведенные выше примеры могут стать трудночитаемыми. Поскольку многие из этих изменений распространены, мы предоставляем ряд помощников для ясной интерпретации в противном случае запутанных случаев:
| Метод | Входные данные | Выходные данные |
|---|---|---|
major | 1.2.3-a45,ccdd88 | 1 |
minor | 1.2.3-a45,ccdd88 | 2 |
patch | 1.2.3-a45,ccdd88 | 3-a45 |
major_minor | 1.2.3-a45,ccdd88 | 1.2 |
major_minor_patch | 1.2.3-a45,ccdd88 | 1.2.3-a45 |
minor_patch | 1.2.3-a45,ccdd88 | 2.3-a45 |
before_comma | 1.2.3-a45,ccdd88 | 1.2.3-a45 |
after_comma | 1.2.3-a45,ccdd88 | ccdd88 |
dots_to_hyphens | 1.2.3-a45,ccdd88 | 1-2-3-a45,ccdd88 |
no_dots | 1.2.3-a45,ccdd88 | 123-a45,ccdd88 |
Аналогично dots_to_hyphens, мы предоставляем все логические перестановки {dots,hyphens,underscores}_to_{dots,hyphens,underscores}. То же самое относится к no_dots в виде no_{dots,hyphens,underscores}, с дополнительным no_dividers, который применяет все это сразу.
Наконец, существует csv, который возвращает массив значений, разделенных запятыми. csv, before_comma и after_comma — дополнительные специальные функции, позволяющие в противном случае сложным ситуациям, и их следует использовать экономно. Не должно быть более двух , на version.
Раздел: zap
zap Цель раздела
Раздел zap описывает более полное удаление файлов, связанных с пакетом Cask. Процедуры zap никогда не выполняются по умолчанию, а только если пользователь использует --zap на uninstall:
brew uninstall --zap firefox
Разделы zap могут удалить:
- Файлы настроек и кеши, хранящиеся в каталоге пользователя
~/Library. - Общие ресурсы, такие как обновлятели приложений. Поскольку общие ресурсы могут быть удалены, другие приложения могут быть затронуты
brew uninstall --zap. Понимание этого лежит на ответственности пользователя.
zap строки не должны удаляться:
- Файлы, созданные пользователем напрямую.
Добавление --force к команде позволит вам выполнить эти действия, даже если Cask больше не установлен:
brew uninstall --zap --force firefox
zap Синтаксис строки
Форма zap строки следует за uninstall строкой. Доступны все те же директивы. Ключ trash: предпочтительнее delete:.
Пример: dropbox.rb
zap Создание
Простейший метод — использовать @nrlquaker’s CreateZap, который может автоматически сгенерировать строку. В некоторых случаях он может ничего не обнаружить, и потребуется ручное создание.
Ручное создание можно облегчить:
- Некоторые инструменты разработчика уже доступны в Homebrew Cask.
sudo find / -iname "*<search item>*"- Инструмент для удаления, например, AppCleaner.
- Проверка стандартных подозреваемых, т.е.
/Library/{'Application Support',LaunchAgents,LaunchDaemons,Frameworks,Logs,Preferences,PrivilegedHelperTools}и~/Library/{'Application Support',Caches,Containers,LaunchAgents,Logs,Preferences,'Saved Application State'}.
Справочник по маркерам
Этот раздел описывает алгоритм, реализованный в generate_cask_token скрипте, и содержит подробные правила и исключения, которые в большинстве случаев не нужны.
- Цель
- Поиск упрощенного имени дистрибутива поставщика
- Преобразование упрощенного имени в маркер
- Имена файлов Cask
- Заголовки Cask
- Примеры маркеров Cask
- Примеры маркеров Cask для конкретных наборов инструментов
- Перекрытие маркеров
Цель
Поставщики программного обеспечения часто не соблюдают согласованности в именовании. Применяя строгие правила именования, мы стремимся к:
- Предотвращению дублирования загрузок
- Минимизации случаев переименования
- Недвусмысленному выделению уникального идентификатора имени программного обеспечения
Подробные сведения о названиях и брендах программного обеспечения неизбежно будут утеряны при преобразовании в минимальный маркер. Для захвата полного имени поставщика дистрибутива используйте name в рамках Cask. name принимает строку UTF-8 без ограничений.
Поиск упрощенного имени дистрибутива поставщика
Упрощенные имена приложений
-
Начните с точного имени пакета приложения, как оно отображается на диске, например,
Google Chrome.app. -
Если имя использует буквы, не входящие в диапазон A-Z, преобразуйте его в ASCII, как описано в Преобразование в ASCII.
-
Удалите
.appс конца. -
Удалите с конца строку «app», если поставщик оформляет имя как «Имя программы App.app». Исключение: когда «app» является неразрывной частью имени, без которой имя будет бессмысленным, как в whatsapp.rb.
-
Удалите с конца номера версий или обозначения инкрементных выпусков, такие как «альфа», «бета» или «кандидат в релиз». Строки, которые различают различные возможности или кодовые базы, такие как «Community Edition», в настоящее время принимаются. Исключение: когда число не является счетчиком инкрементного выпуска, а является разделителем для разных продуктов от разных поставщиков, как в kdiff3.rb.
-
Если номер версии расположен посередине имени приложения, его также следует удалить.
-
Удалите с конца «Загрузчик», «Быстрый загрузчик».
-
Удалите с конца строки, такие как «Рабочий стол», «для Рабочего стола».
-
Удалите с конца строки, такие как «Mac», «для Mac», «для OS X», «macOS», «для macOS». Эти термины обычно добавляются к портированному программному обеспечению, например, «MAME OS X.app». Исключение: когда программное обеспечение не является портом, и «Mac» является неотъемлемой частью имени, без которого имя будет бессмысленным, как в PlayOnMac.app.
-
Удалите с конца обозначения аппаратного обеспечения, такие как «для x86», «32-битный», «ppc».
-
Удалите с конца имена фреймворков программного обеспечения, такие как «Cocoa», «Qt», «Gtk», «Wx», «Java», «Oracle JVM» и т. д. Исключение: фреймворк является продуктом, который необходимо добавить в Cask.
-
Удалите с конца строки локализации, такие как «en-US».
-
Если результат этого процесса — общий термин, например, «Установщик Macintosh», попробуйте добавить имя поставщика или разработчика, а затем дефис. Если это не работает, просто создайте наилучшее возможное имя, основываясь на веб-странице поставщика.
-
Если результат конфликтует с именем существующего Cask, сделайте свое имя уникальным, добавив имя поставщика или разработчика, а затем дефис. Пример: unison.rb и panic-unison.rb.
-
Неизбежно, есть небольшое количество исключений, не охваченных правилами. Не стесняйтесь использовать форум, если у вас возникли проблемы.
Преобразование в ASCII
-
Если поставщик предоставляет строку локализации на английском языке, она предпочтительнее. Вот места, где ее можно найти, в порядке предпочтения:
-
CFBundleDisplayNameв основномInfo.plistфайле пакета приложения -
CFBundleNameв основномInfo.plistфайле пакета приложения -
CFBundleDisplayNameвInfoPlist.stringsкаталоге локализации -
CFBundleNameвInfoPlist.stringsкаталоге локализации -
CFBundleDisplayNameвInfoPlist.stringsкаталоге локализации -
CFBundleNameвInfoPlist.stringsкаталоге локализации
-
-
Когда нет строки локализации поставщика, переведите имя транслитерацией или разложением.
-
В крайнем случае, переведите имя пакета приложения на английский язык.
Упрощенные имена установщиков на основе pkg
- Упрощенное имя
pkgможет быть сложнее определить, чем имя приложения. Еслиpkgустанавливает приложение, используйте имя этого приложения с вышеупомянутыми правилами. В противном случае просто создайте наилучшее возможное имя, основываясь на веб-странице поставщика.
Упрощенные имена программного обеспечения, не являющегося приложением
-
В настоящее время правила для генерации маркера не определены для панелей настроек, плагинов QuickLook и нескольких других типов программного обеспечения, устанавливаемых с помощью Homebrew Cask. Просто создайте наилучшее возможное имя, основываясь на имени файла на диске или веб-странице поставщика. Следите за дубликатами.
Маркеры, не относящиеся к приложениям, должны стать более стандартизированными в будущем.
Преобразование упрощенного имени в маркер
Маркер — это основной идентификатор пакета в нашем проекте. Это уникальная строка, которую пользователи используют при работе с Cask.
Для преобразования упрощенного имени приложения (выше) в маркер:
- Преобразуйте все буквы в нижний регистр.
- Расширьте символ
+до отдельного английского слова:-plus-. - Расширьте символ
@до отдельного английского слова:-at-. - Пробелы становятся дефисами.
- Подчеркивания становятся дефисами.
- Дефисы/Разделители становятся дефисами.
- Дефисы остаются дефисами.
- Цифры остаются цифрами.
- Удалите любой символ, который не является буквенно-цифровым или дефисом.
- Сжатие нескольких дефисов в один дефис.
- Удалите начальный или конечный дефис.
Имена файлов Cask
Casks хранятся в файле Ruby, имя которого соответствует маркерам, с расширением .rb.
Заголовки Cask
Маркер также указан в строке заголовка каждого Cask.
Примеры маркеров Cask
Эти примеры иллюстрируют большинство правил генерации маркера:
| Имя приложения на диске | Упрощенное имя приложения | Маркер Cask | Имя файла |
|---|---|---|---|
Audio Hijack Pro.app | Audio Hijack Pro | audio-hijack-pro | audio-hijack-pro.rb |
VLC.app | VLC | vlc | vlc.rb |
BetterTouchTool.app | BetterTouchTool | bettertouchtool | bettertouchtool.rb |
LPK25 Editor.app | LPK25 Editor | lpk25-editor | lpk25-editor.rb |
Sublime Text 2.app | Sublime Text | sublime-text | sublime-text.rb |
Примеры маркеров Cask для конкретных наборов инструментов
Наборы инструментов Cask имеют правила именования, специфичные для каждого из них.
Специальные префиксы и суффиксы
В некоторых ситуациях требуется добавить префикс или суффикс к маркерам.
Перекрытие маркеров
Когда маркер нового Cask в противном случае конфликтует с маркером уже существующего Cask, характер этого перекрытия определяет маркер (возможно, для обоих Casks). См. Разветвления и приложения с конфликтующими именами для получения информации о том, как действовать.
Возможно вводящее в заблуждение имя
Если маркер неофициального программного обеспечения, которое взаимодействует с популярной службой, заставит его выглядеть официально, а поставщик не имеет права использовать это имя, необходимо добавить префикс для разграничения.
В случаях, когда префикс является неоднозначным и заставит приложение выглядеть официальным, можно использовать суффикс -unofficial.
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/Cask-Cookbook