brew livecheck
Команда brew livecheck находит самую новую версию программного обеспечения формулы или кега, проверяя upstream. Livecheck имеет стратегии для определения версий из различных источников, таких как репозитории Git, веб-сайты и т. д.
Поведение
Когда livecheck не получает инструкций о том, как проверять версии upstream, он по умолчанию выполняет следующие действия:
- Для формул: собирает
head,stable, иhomepageURL-адреса в указанном порядке. Для кегов: собираетurlиhomepageURL-адреса в указанном порядке. - Определяет, применимы ли какие-либо стратегии к первому URL-адресу. Если нет, пробует следующий URL-адрес.
- Если стратегия применима, использует её для проверки наличия новых версий.
- Возвращает самую новую версию (или ошибку, если версии не удалось найти по доступным URL-адресам).
Иногда необходимо переопределить это поведение по умолчанию, чтобы создать работоспособную проверку. Если источник не предоставляет самую новую версию, нужно проверить другой. Если livecheck некорректно сопоставляет текст версии, необходимо указать соответствующий regex или strategy блок.
Это можно сделать, добавив livecheck блок в формулу/кег. Для получения дополнительной информации об имеющихся методах, пожалуйста, обратитесь к документации класса Livecheck.
Создание проверки
-
Используйте вывод отладки, чтобы понять ситуацию.
brew livecheck --debug <formula>|<cask>предоставляет информацию о том, какие URL-адреса пытается использовать livecheck, какие стратегии применимы, сопоставленные версии и т. д. -
Изучите доступные источники, чтобы выбрать URL-адрес. Попробуйте удалить имя файла из
stable/url, чтобы увидеть, является ли это страницей списка каталога. Если это не работает, попробуйте найти страницу, которая ссылается на файл (например, страницу загрузки). Если найти самую новую версию на веб-сайте невозможно, попробуйте проверить другие источники из формулы/кега. При необходимости, поищите другие источники вне формулы/кега. -
Создайте regex, если это необходимо. Если проверка работает без regex и не будет от неё выиграна, обычно достаточно его опустить. Более подробную информацию о создании regex можно найти в разделе рекомендации по regex.
Общие рекомендации
-
Используйте
strategyтолько когда это необходимо. Например, если livecheck уже используетGitдля URL-адреса, использованиеstrategy :gitне требуется. Однако, еслиGitприменим к URL-адресу, но нам нужно использоватьPageMatch, необходимо указатьstrategy :page_match. -
Используйте стратегию
GithubLatestтолько тогда, когда это необходимо и правильно.github.comограничивает скорость запросов, и мы стараемся минимизировать использование этой стратегии, чтобы избежать достижения лимита скорости на CI или при использованииbrew livecheck --tapна больших тапах (например, homebrew/core). СтратегияGitчасто достаточна, и нам нужно использоватьGithubLatestтолько в том случае, если «последняя» версия отличается от самой новой версии из тегов.
Рекомендации по URL-адресам
-
Требуется
urlв блокеlivecheck. Это может быть строка URL-адреса (например,"https://www.example.com/downloads/") или символ URL-адреса формулы/кега (т.е.:stable,:url,:head,:homepage). Исключение из этого правила — блокlivecheck, который использует толькоskip. -
Всякий раз, когда это возможно, проверяйте версии в том же месте, что и стабильный архив.
-
По возможности избегайте проверки страниц с постраничным списком выпусков. Например, мы обычно избегаем проверки страницы
releaseпроекта GitHub, потому что последняя стабильная версия может быть отодвинута на вторую страницу из-за предварительных версий. В этом случае использование стратегииGit, которая извлекает все теги из репозитория, более надежно.
Рекомендации по regex
Regex в блоке livecheck ограничивает соответствия подмножеством извлеченного содержимого и использует группу захвата вокруг текста версии.
-
Regex следует делать регистронезависимыми, когда это возможно, добавляя
iв конце (например,/.../iили%r{...}i). Это повышает надёжность, так как regex будет обрабатывать изменения регистра без необходимости внесения изменений. -
Regex должен использовать только группу захвата вокруг текста версии. Например, в
/href=.*?example-v?(\d+(?:\.\d+)+)(?:-src)?\.t/i, мы используем только группу захвата вокруг теста версии (соответствуя версиям, таким как1.2,1.2.3, и т. д.), и используем незахватывающие группы в других местах (например,(?:-src)?). -
Привязывайте начало и конец regex, чтобы ограничить область действия. Например, на страницах HTML мы часто ищем имена файлов или каталоги версий в атрибутах URL (например,
href). Общая идея в том, что ограничение области действия поможет исключить нежелательные совпадения. -
Избегайте универсальных «ловушек всех» вроде
.*или.+в пользу чего-то нежадного и/или контекстуально соответствующего. Например, для соответствия символам в пределах атрибута HTML используйте[^"' >]+?. -
Используйте
[._-]вместо точки/подчёркивания/дефиса между именем программного обеспечения и версией в имени файла. Для файла с именемexample-1.2.3.tar.gz,example[._-]v?(\d+(?:\.\d+)+)\.tбудет продолжать соответствовать, если формат имени файла upstream изменится наexample_1.2.3.tar.gzилиexample.1.2.3.tar.gz. -
Используйте
\.tвместо\.tgz,\.tar\.gz, и т. д. Существует множество различных расширений файлов для tar-архивов (например,.tar.bz2,tbz2,.tar.gz,.tgz,.tar.xz,.txz, и т. д.), и исходный источник может переключиться с одного формата сжатия на другой со временем.\.tизбегает этой проблемы, соответствуют текущим и будущим форматам, начиная сt. Вне tar-архивов мы используем полное расширение файла в regex, например\.zip,\.jar, и т. д.
Примеры блоков livecheck
Следующие примеры охватывают ряд шаблонов, с которыми вы можете столкнуться. Они предназначены для иллюстрации и могут быть легко адаптированы.
В случае сомнений, начните с одного из этих примеров, а не копируйте livecheck блок из случайной формулы/кега.
Имена файлов
При сопоставлении версии из имени файла на странице HTML мы часто ограничиваем соответствие атрибутами href. href=.*? будет соответствовать открывающему разделителю (", ') а также любой части URL-адреса перед именем файла.
livecheck do url "https://www.example.com/downloads/" regex(/href=.*?example[._-]v?(\d+(?:\.\d+)+)\.t/i) end
Иногда это делается более явно, чтобы исключить нежелательные соответствия. URL-адреса с предшествующим путем могут использовать href=.*?/, а другие могут использовать href=["']?. Например, это необходимо, когда на странице также есть нежелательные файлы с более длинным префиксом (another-example-1.2.tar.gz).
Каталоги версий
При проверке страницы списка каталогов иногда файлы разделены по каталогам версий (например, 1.2.3/). В этом случае необходимо определить версии по именам каталогов.
livecheck do
url "https://www.example.com/releases/example/"
regex(%r{href=["']?v?(\d+(?:\.\d+)+)/?["' >]}i)
end Теги Git
Когда URL stable использует стратегию Git, следующий пример будет соответствовать только тегам, таким как 1.2/v1.2, и т. д.
livecheck do url :stable regex(/^v?(\d+(?:\.\d+)+)$/i) end
Если теги включают имя программного обеспечения в качестве префикса (например, example-1.2.3), легко соответствующим образом изменить regex: /^example[._-]v?(\d+(?:\.\d+)+)$/i
Ссылки на формулу/кег
Формула/кег может использовать ту же проверку, что и другая, используя formula или cask.
livecheck do formula "another-formula" end
Ссылки на формулу/кег должны находиться в одном тапе, так как ссылка на формулу/кег из другого тапа вызовет ошибку, если пользователь их не затаил.
Блоки strategy
Если для преобразования формата версии upstream необходимо использовать формат формулы/кега, можно использовать блок strategy вместо regex.
Блок стратегии PageMatch strategy
В примере ниже мы преобразуем формат даты, например 2020-01-01, в 20200101.
livecheck do
url :homepage
strategy :page_match do |page|
page.scan(/href=.*?example[._-]v?(\d{4}-\d{2}-\d{2})\.t/i)
.map { |match| match&.first&.gsub(/\D/, "") }
end
end Стиль блока стратегии PageMatch strategy здесь также применим к любой стратегии, которая использует PageMatch внутри.
Блок стратегии Git strategy
Блок strategy для Git немного отличается, так как блок получает массив строк тегов вместо строки содержимого страницы. Похоже на пример PageMatch, это преобразование тегов с форматом даты, например 2020-01-01, в 20200101.
livecheck do
url :stable
strategy :git do |tags|
tags.map { |tag| tag[/^(\d{4}-\d{2}-\d{2})$/i, 1]&.gsub(/\D/, "") }.compact
end
end Блок стратегии Sparkle strategy
Блок strategy для Sparkle получает item, у которого есть методы для short_version, version, url и title.
Шаблон по умолчанию для стратегии Sparkle — "#{item.short_version},#{item.version}", если оба установлены. В примере ниже url также включает идентификатор загрузки, который необходим:
livecheck do
url "https://www.example.com/example.xml"
strategy :sparkle do |item|
"#{item.short_version},#{item.version}:#{item.url[%r{/(\d+)/[^/]+\.zip}i, 1]}"
end
end skip
Livecheck автоматически пропускает некоторые формулы/кеги по ряду причин (устаревшие, отключенные, прекращённые и т. д.). Однако в редких случаях нам нужно использовать блок livecheck для ручного пропуска. Метод skip принимает строку с очень кратким объяснением причины пропуска.
livecheck do skip "No version information available" end
© 2009–present Homebrew contributors
Licensed under the BSD 2-Clause License.
https://docs.brew.sh/Brew-Livecheck