Spec-Zone.ru › Homebrew

Кулинарная книга 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'

Следующий полностью ручной метод поиска идентификаторов пакетов в файле пакета:

  1. Разархивировать /path/to/my.pkg (замените на ваше имя пакета) с помощью pkgutil --expand /path/to/my.pkg /tmp/expanded.unpkg.
  2. Распакованный пакет — это папка. Идентификаторы пакетов содержатся в файлах, именованных PackageInfo. Эти файлы можно найти с помощью команды find /tmp/expanded.unpkg -name PackageInfo.
  3. Файлы PackageInfo — это XML-файлы, а идентификаторы пакетов находятся в атрибутах identifier тегов <pkg-info>, которые выглядят как <pkg-info ... identifier="com.oracle.jdk7u51" ... >, где дополнительные атрибуты были удалены и заменены многоточием.
  4. 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" ... />.
  5. После того, как идентификаторы пакетов будут определены, распакованную папку пакета можно удалить.

Раздел: 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 используется для пакетов, которые:

  1. url не содержат версии.
  2. Получение корректного значения для 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 имеют правила именования, специфичные для каждого из них.

Homebrew/cask-versions

Homebrew/cask-fonts

Homebrew/cask-drivers

Специальные префиксы и суффиксы

В некоторых ситуациях требуется добавить префикс или суффикс к маркерам.

Перекрытие маркеров

Когда маркер нового Cask в противном случае конфликтует с маркером уже существующего Cask, характер этого перекрытия определяет маркер (возможно, для обоих Casks). См. Разветвления и приложения с конфликтующими именами для получения информации о том, как действовать.

Возможно вводящее в заблуждение имя

Если маркер неофициального программного обеспечения, которое взаимодействует с популярной службой, заставит его выглядеть официально, а поставщик не имеет права использовать это имя, необходимо добавить префикс для разграничения.

В случаях, когда префикс является неоднозначным и заставит приложение выглядеть официальным, можно использовать суффикс -unofficial.

© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/Cask-Cookbook

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API