Spec-Zone.ru › Homebrew

brew livecheck

Команда brew livecheck находит самую новую версию программного обеспечения формулы или кега, проверяя upstream. Livecheck имеет стратегии для определения версий из различных источников, таких как репозитории Git, веб-сайты и т. д.

Поведение

Когда livecheck не получает инструкций о том, как проверять версии upstream, он по умолчанию выполняет следующие действия:

  1. Для формул: собирает head, stable, и homepage URL-адреса в указанном порядке. Для кегов: собирает url и homepage URL-адреса в указанном порядке.
  2. Определяет, применимы ли какие-либо стратегии к первому URL-адресу. Если нет, пробует следующий URL-адрес.
  3. Если стратегия применима, использует её для проверки наличия новых версий.
  4. Возвращает самую новую версию (или ошибку, если версии не удалось найти по доступным URL-адресам).

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

Это можно сделать, добавив livecheck блок в формулу/кег. Для получения дополнительной информации об имеющихся методах, пожалуйста, обратитесь к документации класса Livecheck.

Создание проверки

  1. Используйте вывод отладки, чтобы понять ситуацию. brew livecheck --debug <formula>|<cask> предоставляет информацию о том, какие URL-адреса пытается использовать livecheck, какие стратегии применимы, сопоставленные версии и т. д.

  2. Изучите доступные источники, чтобы выбрать URL-адрес. Попробуйте удалить имя файла из stable/url, чтобы увидеть, является ли это страницей списка каталога. Если это не работает, попробуйте найти страницу, которая ссылается на файл (например, страницу загрузки). Если найти самую новую версию на веб-сайте невозможно, попробуйте проверить другие источники из формулы/кега. При необходимости, поищите другие источники вне формулы/кега.

  3. Создайте 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

Spec-Zone.ru

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