Глава 9. Файлы pkg-* | FreeBSD Documentation Portal
Description: Хитрости с файлами pkg-*
Keywords: pkg,pkg-message,UCL,pkg-install,pkg-deinstall

# Глава 9. Файлы pkg-*

Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.

Есть несколько приёмов работы с файлами pkg-*, которые мы ещё не описали, но они иногда могут быть очень кстати.

## 9.1. pkg-message

Если вам нужно вывести сообщение для человека, устанавливающего приложение, то вы можете поместить сообщение в файл pkg-message. Эта возможность часто оказывается полезной для вывода дополнительных шагов установки, которые нужно предпринять после выполнения команды `pkg install`, или для вывода информации о лицензировании.

| Файл pkg-message должен содержать только информацию, критически важную для настройки и работы в FreeBSD, а также уникальную для данного порта. Информация по настройке должна отображаться только при первоначальной установке. Инструкции по обновлению должны показываться только при обновлении с соответствующей версии. Не обрамляйте сообщения ни пробелами, ни строками символов (такими как `----------`, `` или `==========`). Оставьте форматирование pkg(8). Коммиттеры имеют полное право ограничивать существующие сообщения диапазонами установки или обновления, используя спецификации формата UCL. Пожалуйста, убедитесь, что используете соответствующие инструменты для управления службами. Используйте `service имя start` для запуска службы вместо `/usr/local/etc/rc.d/имя start` Используйте `sysrc name_enable=YES` для изменения параметров в rc.conf

pkg-message поддерживает два формата:

raw

  Обычный текстовый файл. Его сообщение отображается только при установке.

UCL

  Если файл начинается с символа “[”, то он считается файлом в формате UCL. Формат UCL описан на странице libucl’s GitHub page.

| Не добавляйте запись для pkg-message в pkg-plist.

### 9.1.1. UCL в pkg-message

Формат следующий. Это должен быть массив объектов. Сами объекты могут содержать следующие ключевые слова:

`message`

  Отображаемое сообщение. Этот ключевой параметр является обязательным.

`type`

  Когда сообщение должно быть отображено.

`maximum_version`

  Только если `type` имеет значение `upgrade`. Отображается, если обновление выполняется с версии строго ниже указанной.

`minimum_version`

  Только если `type` имеет значение `upgrade`. Отображается, если обновление выполняется с версии, строго большей, чем указанная.

Ключевые слова `maximum_version` и `minimum_version` можно комбинировать.

Ключевое слово `type` может иметь три значения:

`install`

  Сообщение должно отображаться только при установке пакета.

`remove`

  Сообщение должно отображаться только при удалении пакета.

`upgrade`

  сообщение должно отображаться только во время обновления пакета.

| Для сохранения совместимости с файлами pkg-message, не использующими UCL, первая строка UCL pkg-message ДОЛЖНА быть одиночным символом “[”, а последняя строка ДОЛЖНА быть одиночным символом “]”.

Пример 1. Короткие строки UCL

Сообщение ограничено двойными кавычками `"`, это используется для простых однострочных строк:

    [
    { type: install
      message: "Simple message"
    }
    ]

Пример 2. Многострочные строки UCL

Многострочные строки используют стандартную нотацию heredoc. Разделитель многострочной строки должен начинаться сразу после символов `<<` без пробелов и должен состоять только из заглавных букв. Чтобы завершить многострочную строку, добавьте строку-разделитель на отдельной строке без пробелов. Сообщение из раздела Короткие строки UCL может быть записано как:

    [
    { type: install
      message: <<EOM
    Simple message
    EOM
    }
    ]

Пример 3. Показать сообщение при установке/удалении

Когда сообщение нужно отображать только при установке или удалении, укажите тип:

    [
    {
      type: remove
      message: "package being removed."
    }
    { type: install, message: "package being installed."}
    ]

Пример 4. Показать сообщение при обновлении

При обновлении порта отображаемое сообщение может быть ещё более адаптировано к потребностям порта.

    [
    {
      type: upgrade
      message: "Package is being upgraded."
    }
    {
      type: upgrade
      maximum_version: "1.0"
      message: "Upgrading from before 1.0 need to do this."
    }
    {
      type: upgrade
      minimum_version: "1.0"
      message: "Upgrading from after 1.0 should do that."
    }
    {
      type: upgrade
      maximum_version: "3.0"
      minimum_version: "1.0"
      message: "Upgrading from > 1.0 and < 3.0 remove that file."
    }
    ]

При отображении сообщения во время обновления важно ограничить случаи, когда оно показывается пользователю. Чаще всего это делается с помощью `maximum_version`, чтобы ограничить его использование обновлениями до определённой версии, когда требуется выполнить конкретное действие.

## 9.2. pkg-install, pkg-pre-install и pkg-post-install

Если порту необходимо выполнять команды при установке бинарного пакета с помощью `pkg add` или `pkg install`, используйте pkg-install. Он запускается дважды через `pkg`: первый раз как `${SH} pkg-install ${PKGNAME} PRE-INSTALL` перед установкой пакета и второй раз как `${SH} pkg-install ${PKGNAME} POST-INSTALL` после его установки. Переменная `$2` может быть проверена, чтобы определить, в каком режиме выполняется скрипт. Переменная окружения `PKG_PREFIX` устанавливается равной имени каталога установки пакета.

Если используется pkg-pre-install или pkg-post-install, скрипт выполняется только один раз (до или после установки пакета), с единственным аргументом `${PKGNAME}`. Использование pkg-pre-install.lua или pkg-post-install.lua запускает скрипт на Lua вместо shell-скрипта. Скрипты на Lua, выполняемые `pkg`, предоставляют некоторые расширения и несколько ограничений, которые описаны в pkg-lua-script(5).

| Использование pkg-pre-install (или pkg-pre-install.lua) и pkg-post-install (или pkg-post-install.lua) предпочтительнее, чем использование pkg-install.

Эти скрипты автоматически добавляются в список упаковки.

| Эти скрипты предназначены для упрощения настройки пакетов после установки. Они не должны использоваться для запуска служб, остановки служб или выполнения любых других команд, которые изменяют текущую работающую систему.

## 9.3. pkg-deinstall, pkg-pre-deinstall и pkg-post-deinstall

Эти скрипты выполняются при удалении пакета.

Скрипт pkg-deinstall выполняется дважды командой `pkg delete`. Первый раз как `${SH} pkg-deinstall ${PKGNAME} DEINSTALL` до удаления порта и второй раз как `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL` после удаления порта. Переменная `$2` может быть проверена для определения режима, в котором выполняется скрипт. Переменная окружения `PKG_PREFIX` устанавливается в каталог установки пакета.

Если используется pkg-pre-deinstall или pkg-post-deinstall, скрипт выполняется только один раз (до или после удаления пакета) с единственным аргументом `${PKGNAME}`. Использование pkg-pre-deinstall.lua или pkg-post-deinstall.lua запустит скрипт на Lua вместо shell-скрипта. Скрипты на Lua, выполняемые `pkg`, предоставляют некоторые расширения и ограничения, которые описаны в pkg-lua-script(5).

| Использование pkg-pre-deinstall (или pkg-pre-deinstall.lua) и pkg-post-deinstall (или pkg-post-deinstall.lua) предпочтительнее, чем использование pkg-deinstall.

Эти скрипты автоматически добавляются в список упаковки.

| Эти скрипты предназначены для упрощения очистки после удаления пакетов. Они не должны использоваться для запуска служб, остановки служб или выполнения любых других команд, которые изменяют текущую работающую систему.

## 9.4. Изменение имён файлов pkg-*

Все имена файлов pkg-* определяются с помощью переменных, так что вы можете изменить их, если это нужно, в вашем файле Makefile. Это особенно полезно, если вы используете одни и те же файлы pkg-* совместно между несколькими портами или пишете в один из вышеперечисленных файлов (в главе о записи в каталоги, отличные от `WRKDIR` объяснено, почему не рекомендуется осуществлять запись непосредственно в файлы pkg-*).

Вот список имён переменных и их значений по умолчанию. (Значение `PKGDIR` по умолчанию равно `${MASTERDIR}`.)

Переменная | Значение по умолчанию
--- | ---
`DESCR` | `${PKGDIR}/pkg-descr`
`PLIST` | `${PKGDIR}/pkg-plist`
`PKGINSTALL` | `${PKGDIR}/pkg-install`
`PKGPREINSTALL` | `${PKGDIR}/pkg-pre-install`
`PKGPOSTINSTALL` | `${PKGDIR}/pkg-post-install`
`PKGDEINSTALL` | `${PKGDIR}/pkg-deinstall`
`PKGPREDEINSTALL` | `${PKGDIR}/pkg-pre-deinstall`
`PKGPOSTDEINSTALL` | `${PKGDIR}/pkg-post-deinstall`
`PKGMESSAGE` | `${PKGDIR}/pkg-message`

## 9.5. Использование `SUB_FILES` и `SUB_LIST`

Переменные `SUB_FILES` и `SUB_LIST` подходят для задания в файлах порта динамических значений, таких как `PREFIX` установки в pkg-message.

В переменной `SUB_FILES` указывается перечень файлов для автоматического изменения. Каждый file из перечня `SUB_FILES` обязан иметь соответствующий file.in, присутствующий в `FILESDIR`. Измененная версия будет создана в `WRKDIR`. Файлы, определённые в качестве значения `USE_RC_SUBR` (или устаревшего `USE_RCORDER`), автоматически добавляются в `SUB_FILES`. Для файлов pkg-message, pkg-install и pkg-deinstall устанавливается соответствующая переменная Makefile, указывающая на обработанную версию.

Переменная `SUB_LIST` содержит перечень пар `VAR=VALUE`. В каждом файле из `SUB_FILES` для каждой пары будет произведена замена `%%VAR%%` на `VALUE`. Некоторые общие пары определяются автоматически: `PREFIX`, `LOCALBASE`, `DATADIR`, `DOCSDIR`, `EXAMPLESDIR`, `WWWDIR` и `ETCDIR`. Любая строка, начинающаяся с `@comment`, будет удалена из конечного файла после подстановки переменной.

В следующем примере в pkg-message будет сделана замена `%%ARCH%%` на системную архитектуру:

    SUB_FILES=	pkg-message
    SUB_LIST=	ARCH=${ARCH}

Обратите внимание, что в этом примере в `FILESDIR` обязательно существование файла pkg-message.in.

Пример хорошего pkg-message.in:

    Now it is time to configure this package.
    Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory
    as .putsy.conf and edit it.

Изменено: 15 марта 2026 г. by Vladlen Popolitov

Назад
Главная
Далее