Глава 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.

Изменено: 18 сентября 2025 г. by Vladlen Popolitov