Руководство разработчика по пакетированию приложений

Глава 2 Сборка пакета

В данной главе рассказывается о процессе и задачах, связанных со сборкой пакета. Некоторые из этих задач являются обязательными. Некоторые из этих задач являются необязательными. Обязательные задачи детально рассмотрены в данной главе. Для получения сведений о необязательных задачах, которые позволяют придать пакету дополнительную функциональность, см. Глава 3Расширение функциональности пакета (задачи) и Глава 6Дополнительные методы создания пакетов.

Ниже следует перечень вопросов, рассматриваемых в данной главе.

Процесс сборки пакета (Карта задач)

В Таблица 2–1 описана процедура, которой необходимо придерживаться при сборке пакетов, особенно при отсутствии опыта их сборки. Хотя порядок выполнения первых четырех задач не является обязательным, он обеспечивает наибольшую простоту выполняемых действий. Накопив опыт в области создания пакетов, вы сможете переставлять эти задачи в любой наиболее удобной для вас последовательности.

Став опытным разработчиком пакетов, вы сможете автоматизировать процесс их сборки с помощью команды make и файлов Makefile. Для получения дополнительной информации см. справочную страницу о команде make(1S).

Таблица 2–1 Процесс сборки пакета (Карта задач)

Задача 

Описание 

Инструкции 

1. Создать файл pkginfo

Создать файл pkginfo для описания характеристик пакета.

Как создать файл pkginfo

2. Упорядочить содержимое пакета 

Упорядочить компоненты пакета в иерархическую структуру каталогов. 

Упорядочение содержимого пакета

3. (не обязательно) Создать информационные файлы 

Определить зависимости пакета, включить сообщение об авторских правах и зарезервировать дополнительное место на целевой системе. 

Глава 3Расширение функциональности пакета (задачи)

4. (не обязательно) Создать сценарии установки 

Настроить процессы установки и удаления пакета. 

Глава 3Расширение функциональности пакета (задачи)

5. Создать файл prototype

Описать объект пакета в файле prototype.

Создание файла prototype

6.Собрать пакет 

Собрать пакет с помощью команды pkgmk.

Сборка пакета

7. Проверить и записать пакет 

Проверить целостность пакета перед копированием его на распространяемый носитель. 

Глава 4Проверка и запись пакета

Переменные среды пакета

Переменные среды можно использовать в обязательных информационных файлах, pkginfo и prototype. Кроме того, можно использовать параметр для команды pkgmk, используемой для сборки пакета. Поскольку в данной главе обсуждаются эти файлы и команды, здесь представлена дополнительная информации по переменным, зависящая от контекста. Однако перед началом сборки пакета следует ознакомиться с различными типами переменных и их возможным влиянием на успешное создание пакета.

Существуют два типа переменных:

Общие правила использования переменных среды

В файле pkginfo определение переменной имеет форму PARAM=value (Параметр=значение), и первая буква в PARAM является заглавной. Значения этих переменных определяются только во время установки. Если значение одной из этих переменных не может быть определено, выполнение команды pkgadd прерывается, и выдается сообщение об ошибке.

В файле prototype определение переменной может принять форму !PARAM=value или $variable. PARAM и variable могут начинаться как с заглавной, так и со строчной буквы. Вычисляются значения только для переменных, значения которых известны в период сборки. Если PARAM или variable является переменной сборки или установки, значение которой неизвестно во время сборки пакета, работа команды pkgmk прерывается, и появляется сообщение об ошибке.

Параметр PARAM=value можно включить и в качестве параметра команды pkgmk. Этот параметр работает так же, как в файле prototype, за исключением того, что область его действия является глобальной для всего пакета. Определение !PARAM=value в файле prototype является локальным для этого файла и той части пакета, который оно определяет.

Если PARAMявляется переменной установки, а variable - переменной установки или сборки с известным значением, то команда pkgmk вставляет определение в файл pkginfo, и это определение будет доступно в период установки. Однако команда pkgmk не определяет значения PARAM, содержащиеся в именах путей, указанных в файле prototype.

Краткий обзор переменных среды пакета

В таблице ниже представлен краткий обзор форматов, местоположения и области применения переменных.

Таблица 2–2 Краткий обзор переменных среды пакета

Место определения переменной 

Формат определения переменной 

Тип определяемой переменной 

Когда определяется значение переменной 

Где определяется значение переменной 

Элементы, которые переменная может заменить 

Файл pkginfo

PARAM=value

Переменная сборки 

Игнорируется во время сборки 

нет 

Нет 

Установка 

Во время установки 

В файле pkgmap

owner (владелец), group (группа), path (путь) или цель ссылки

 

 

Файл prototype

!PARAM=value

Переменная сборки 

Во время сборки 

В файле prototype и любых включенных файлах

mode (режим), owner (владелец), group (группа) или path (путь)

Установка 

Во время сборки 

В файле prototype и любых включенных файлах

Только в командах !search и !command

 

 

Командная строка pkgmk

PARAM=value

Переменная сборки 

Во время сборки 

В файле prototype

mode (режим), owner (владелец), group (группа) или path (путь)

Установка 

Во время сборки 

В файле prototype

Только команда !search

 

 

Во время установки 

В файле pkgmap

owner (владелец), group (группа), path (путь) или link target (целевая ссылка)

 

 

 

Создание файла pkginfo

Файл pkginfo представляет собой файл ASCII, в котором описаны характеристики пакета и даны сведения, которые помогают контролировать процесс установки.

Каждая запись в файле pkginfo представляет из себя строку, которая устанавливает значения параметра в формате PARAM=value. PARAM может быть любым стандартным параметром, описанным на справочной странице pkginfo(4) Не существует обязательного порядка, в котором следует указывать параметры.


Примечание –

Каждое значение value может быть заключено в одинарные или двойные кавычки, например: 'value' или “value”). Если значение value содержит символы, считающиеся специальными в интерпретаторе команд, необходимо использовать кавычки. В практических примерах, приведенных в данной книге, не используются кавычки. Пример использования двойных кавычек приведен на справочной странице pkginfo(4).


Можно также создавать свои собственные параметры пакета, присвоив им значение в файле pkginfo. Ваши собственные параметры должны начинаться с заглавной буквы. Дальнейшие буквы могут быть как заглавными, так и строчными. Заглавная буква означает, что параметр (переменная) будет определен во время установки, а не во время сборки. Для получения дополнительной информации о разнице между переменными установки и переменными сборки см. раздел Переменные среды пакета.


Примечание –

Конечные пробелы после любого значения параметра игнорируются.


Необходимо определить следующие пять параметров в файле pkginfo: PKG, NAME, ARCH, VERSION и CATEGORY. Параметры PATH, PKGINST и INSTDATE вставляются автоматически программным обеспечением во время сборки пакета. Не следует изменять эти восемь параметров. Для информации об остальных параметрах см. справочную страницу pkginfo(4).

Определение экземпляра пакета

Один и тот же пакет может иметь различные версии, быть совместимым с различными архитектурами или и то и другое одновременно. Каждая разновидность пакета называется экземпляр пакета. Экземпляр пакета определяется по сочетанию определений параметров PKG, ARCH и VERSION в файле pkginfo.

Команда pkgadd назначает идентификатор пакета каждому экземпляру пакета в процессе установки. Идентификатор пакета - это аббревиатура пакета с цифровым суффиксом, например SUNWadm.2. Данный идентификатор служит отличительным признаком экземпляра пакета, по которому его можно отличить от любых других пакетов, включая другие экземпляры этого же пакета.

Определение аббревиатуры пакета (PKG)

Аббревиатура пакета - это краткое название пакета, которое определяется параметром PKG в файле pkginfo. Аббревиатура пакета должна иметь следующие характеристики:

Указание архитектуры пакета (ARCH)

Параметр ARCH в файле pkginfo определяет, какие архитектуры связаны с данным пакетом. Имя архитектуры не должно превышать 16 алфавитно-цифровых символов. Если пакет связан с несколькими архитектурами, то все архитектуры необходимо перечислить в списке через запятую.

Пример спецификации архитектуры пакета в файле pkginfo :


ARCH=sparc

Указание архитектуры системы команд пакета (SUNW_ISA)

Параметр SUNW_ISA в файле pkginfo указывает, какая архитектура системы команд связана с пакетом Sun Microsystems. Может принимать следующие значения:

Например, значение SUNW_ISA в файле pkginfo для пакета, содержащего 64-разрядные объекты, будет:


SUNW_ISA=sparcv9

Если параметр SUNW_ISA не установлен, то по умолчанию архитектура системы команд пакета устанавливается на значение параметра ARCH.

Указание версии пакета (VERSION)

Параметр VERSION в файле pkginfo указывает версию пакета. Название версии не должно превышать 256 символов ASCII и не может начинаться с левой скобки.

Пример спецификации версии в файле pkginfo:


VERSION=release 1.0

Определение имени пакета (NAME)

Имя пакета - это полное название пакета, определяемое параметром NAME в файле pkginfo.

Поскольку системные администраторы часто используют имена пакетов для указания, следует ли устанавливать тот или иной пакет, написание четких и выразительных полных имен пакетов очень важно. Имена пакетов должны соответствовать следующим ниже критериям.

Пример имени пакета, определенного в файле pkginfo:


NAME=Chip designers need CAD application software to design
abc chips.  Runs only on xyz hardware and is installed in the
usr partition.

Определение категории пакета (CATEGORY)

Параметр CATEGORY в файле pkginfo указывает, к какой категории принадлежит пакет. Пакет должен принадлежать как минимум к одной из следующих категорий: system (система) или application (приложение). Имена категорий обозначаются алфавитно-цифровыми символами. Имена категорий не зависят от регистра и не должны превышать 16 символов в длину.

Если пакет принадлежит к нескольким категориям, укажите эти категории в списке через запятую.

Пример спецификации CATEGORY в файле pkginfo :


CATEGORY=system

ProcedureКак создать файл pkginfo

  1. С помощью своего любимого текстового редактора создайте файл с именем pkginfo.

    Этот файл может быть создан в любом месте системы.

  2. Откройте файл для правки и определите пять обязательных параметров.

    Этими пятью параметрами являются: PKG, NAME, ARCH, VERSION и CATEGORY. Для получения дополнительной информации об этих параметрах ознакомьтесь с разделом Создание файла pkginfo.

  3. Добавьте к файлу любые необязательные параметры.

    Создайте свои собственные параметры или прочтите справочную страницу pkginfo(4) для получения сведений о стандартных параметрах.

  4. Сохраните изменения и выйдите из редактора.


Пример 2–1 Создание файла pkginfo

В данном примере показано содержимое допустимого файла pkginfo с пятью обязательными параметрами, а также с параметром BASEDIR. Параметр BASEDIR более подробно обсуждается в разделе Поле path.


PKG=SUNWcadap
NAME=Chip designers need CAD application software to design abc chips.  
Runs only on xyz hardware and is installed in the usr partition.
ARCH=sparc
VERSION=release 1.0
CATEGORY=system
BASEDIR=/opt

См. также

См. раздел Как упорядочить содержимое пакета.

Упорядочение содержимого пакета

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

ProcedureКак упорядочить содержимое пакета

  1. Определите, сколько пакетов вам нужно создать и какие объекты будут находиться в каждом пакете.

    Для получения справки о выполнении этого действия см. раздел Что следует принять во внимание перед сборкой пакета.

  2. Создайте каталог для каждого пакета, который необходимо собрать.

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


    $ cd /home/jane
    $ mkdir SUNWcadap
    
  3. Упорядочите объекты пакета в каждом пакете в структуру каталогов под соответствующим каталогом пакета. Структура каталога должна повторять структуру объектов пакета в целевой системе после установки.

    Например, для пакета приложений САПР SUNWcadap требуется следующая структура каталога.

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

    В данном примере предполагается, что файл pkginfo из раздела Как создать файл pkginfo был создан в домашнем каталоге Jane.


    $ cd /home/jane
    $ mkdir InfoFiles
    $ mv pkginfo InfoFiles
    
См. также

См. раздел Создание файла prototype с помощью команды pkgproto.

Создание файла prototype

Файл prototype - это файл в кодировке ASCII, используемый для указания информации об объектах пакета. Каждая запись в файле prototype описывает объект, например файл данных, каталог, исходный файл или исполняемый объект. Записи в файле prototype состоят из нескольких информационных полей, разделенных пробелами. Обратите внимание на то, что поля должны следовать в определенном порядке. Строки с комментариями начинаются со знака диеза (#) и игнорируются.

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

Формат файла prototype

Ниже приведен пример формата каждой строки в файле prototype:


partftypeclasspathmajorminormodeownergroup

part

Необязательное числовое поле, позволяющее сгруппировать объекты пакета в части. Значение по умолчанию - 1. 

ftype

Поле, состоящее из одного символа, указывающего на тип объекта. См. раздел Поле ftype.

class

Класс установки, к которому принадлежит объект. См. раздел Поле class.

path

Абсолютное или относительное имя пути, указывающее, в каком месте целевой системы будет находиться объект пакета. См. раздел Поле path.

major

Старший номер устройства для специальных блочных или символьных устройств. 

minor

Младший номер устройства для специальных блочных или символьных устройств. 

mode

Восьмеричный режим объекта (например, 0644). См. раздел Поле mode.

owner

Владелец объекта (например, bin или root). См. раздел Поле owner.

group

Группа, к которой принадлежит объект (например, bin или sys). См. раздел Поле group.

Обычно определяются только поля ftype, class, path, mode, ownergroup. Эти поля описаны в следующих разделах. Для получения дополнительной информации по этим полям см. справочную страницу prototype(4).

Поле ftype

Поле ftype или тип файла является односимвольным полем, обозначающим тип файла объекта пакета. Допустимые типы файлов представлены в следующей ниже таблице.

Таблица 2–3 Допустимые типы файлов в файле prototype

Допустимое значение типа файла 

Описание типа файла 

f

Стандартный исполняемый файл или файл данных 

e

Файл, который изменяется во время установки или удаления (может быть общим для нескольких пакетов) 

v

Непостоянный файл (содержимое которого будет меняться, например, файл журнала) 

d

Каталог 

x

Монопольный каталог, доступный только этому пакету (может содержать незарегистрированные журналы или информацию базы данных) 

l

Ссылочный файл 

p

Именованный канал 

c

Специальное символьное устройство 

b

Специальное блочное устройство 

i

Информационный файл или сценарий установки 

s

Символическая ссылка 

Поле class

Поле class именует класс, к которому принадлежит объект. Использование классов является необязательной функцией для разработки пакета. Более подробно эта функция рассматривается в разделе Создание сценариев действий над классами.

Если классы не используются, объект принадлежит к классу none. При выполнении команды pkgmk для сборки пакета команда вставляет параметр CLASSES=none в файл pkginfo. У файлов типа i поле class должно быть пустым.

Поле path

Поле path используется для определения местонахождения объекта пакета в целевой системе. Указать местоположение файла можно с помощью абсолютного (например, /usr/bin/mail) или относительного имени пути (например, bin/mail). Использование абсолютного имени пути означает, что местоположение объекта в целевой системе определяется пакетом и не может быть изменено. Объекты пакета с относительными именами пути являются перемещаемыми.

Перемещаемому объекту не требуется абсолютного пути в целевой системе. Вместо этого его местоположение определяется в ходе процесса установки.

Перемещаемыми могут быть отдельные объекты или все объекты пакета. Перед написанием сценария установки или созданием файла prototype необходимо решить, будут ли объекты пакета иметь фиксированное местоположение (например, сценарии запуска в каталоге /etc) или перемещаемое .

Существуют два типа перемещаемых объектов: коллективно перемещаемые и индивидуально перемещаемые.

Коллективно перемещаемые объекты

Коллективно перемещаемые объекты расположены в месте, связанном с общей установочной базой, называемой базовым каталогом . Базовый каталог определяется в файле pkginfo с помощью параметра BASEDIR. Например, перемещаемый объект tests/generic в файле prototype требует, чтобы в файле pkginfo по умолчанию был установлен параметрBASEDIR. Пример:


BASEDIR=/opt

В данном примере после установки объекта он будет расположен в каталоге /opt/tests/generic.


Примечание –

Единственным каталогом, куда можно устанавливать программное обеспечение, не являющееся базовым ПО Solaris, это каталог /opt.


По возможности старайтесь использовать коллективно перемещаемые объекты. В общем случае основная часть пакета может быть перемещаемой, а несколько файлов (например, файлы в каталогах /etc или /var) могут быть указаны как абсолютные. Однако, если пакет содержит множество различных перемещений, рекомендуется разделить пакет на несколько пакетов с явно указанными значениями BASEDIR в соответствующих файлах pkginfo.

Индивидуально перемещаемые объекты

Индивидуально перемещаемые объекты, в отличие от коллективно перемещаемых, не ограничены размещением в одном и том же каталоге. Для определения индивидуально перемещаемого объекта необходимо указать установочную переменную в поле path файла prototype. После определения установочной переменной нужно создать сценарий request, запрашивающий установщик о расположении перемещаемого базового каталога, или сценарий checkinstall для получения имени пути из данных файловой системы. Для получения дополнительной информации по сценарию request см. раздел Создание сценария request , а информация по сценарию checkinstall находится в разделе Сбор данных о файловой системе.


Внимание – Внимание –

Управлять индивидуально перемещаемыми объектами сложно. Использование индивидуально перемещаемых объектов может привести к большому разнесению компонентов пакета, которые будет сложно изолировать при установке нескольких версий или архитектур пакета. По возможности старайтесь использовать коллективно перемещаемые объекты.


Параметрические имена путей

Параметрическое имя пути - это имя пути, содержащее спецификацию переменной. Например, /opt/$PKGINST/filename является параметрическим именем пути, поскольку включает спецификацию переменной $PKGINST. Значение спецификации переменной по умолчанию должно быть определено в файле pkginfo. Позднее это значение может быть изменено сценариями request или checkinstall.

Спецификация переменной должна стоять в начале или в конце имени пути или должна быть заключена между символами наклонной черты (/). Допускаются следующие формы параметрических имен пути.


$PARAM/tests
tests/$PARAM/generic
/tests/$PARAM

После того как спецификация переменной определена, путь может быть вычислен как абсолютный или перемещаемый. В примере ниже файл prototype содержит следующую запись:


f none $DIRLOC/tests/generic

Файл pkginfo содержит следующую запись:


DIRLOC=/myopt

Имя пути $DIRLOC/tests/generic приобретает вид абсолютного имени пути /myopt/tests/generic независимо от того, был ли установлен параметр BASEDIR в файле pkginfo.

В данном примере файл prototype идентичен одному из предыдущих примеров, а в файле pkginfo содержатся следующие записи:


DIRLOC=firstcut
BASEDIR=/opt

Имя пути $DIRLOC/tests/generic будет выражено в виде перемещаемого имени пути /opt/firstcut/tests/generic.

Для получения дополнительной информации о параметрических именах путей см. раздел Использование параметрических базовых каталогов.

Краткие замечания о расположении каталогов источника и приемника объекта

Поле path в файле prototype определяет расположение объекта в целевой системе. Если структура каталога не повторяет структуру, которую необходимо получить в целевой системе, то следует указать существующее местоположение объектов пакета в файле prototype. Для получения дополнительной информации о структурировании объектов в пакете см. раздел Упорядочение содержимого пакета.

Если структура области разработки отличается от желаемой структуры пакета, то можно использовать формат path1=path2 в поле path. В этом формате path1 означает расположение объекта в целевой системе, а path2 - расположение объектов в системе разработчика.

Этот же формат имени пути (path1=path2) можно использовать следующим образом: определить path1 в качестве перемещаемого имени объекта , а path2 - в качестве полного имени пути к этому объекту в системе разработчика.


Примечание –

path1 не должен содержать неопределенных переменных сборки, но может содержать неопределенные переменные установки. path2 не может содержать никаких неопределенных переменных, однако можно использовать переменные обоих типов. Для получения дополнительной информации о разнице между переменными установки, и переменными, создаваемыми в процессе сборки пакета, см. раздел Переменные среды пакета.


Для ссылок должен использоваться формат path1= path2, поскольку они создаются с помощью команды pkgadd. В общем случае путь path2 в ссылках никогда не должен быть абсолютным. Данный путь должен указываться относительно части пути path1, обозначающей каталог.

Вместо формата path1=path2 можно использовать команду !search. Для получения дополнительной информации см. раздел Указание пути поиска для команды pkgmk..

Поле mode

Поле mode может содержать восьмеричное число, знак вопроса (?) или спецификацию переменной. Восьмеричное число определяет режим объекта после его установки на целевую систему. Знак вопроса ? означает, что при установке объекта режим останется неизменным. Подразумевается, что объект с тем же именем уже существует в целевой системе.

Спецификация переменной в форме $mode означает, что данное поле будет установлено во время сборки пакета. Первая буква переменной должна быть строчной. Обратите внимание, что эта переменная должна быть определена во время сборки пакета либо в файле prototype, либо в качестве параметра команды pkgmk. Для получения дополнительной информации о разнице между переменными установки и переменными сборки пакета см. раздел Переменные среды пакета.

У файлов типа i (информационные файлы), l (жесткая ссылка) и s (символическая ссылка) это поле должно быть пустым.

Поле owner

Поле owner может содержать имя пользователя, знак вопроса (?) или спецификацию переменной. Имя пользователя не должно быть длиннее 14 символов и должно соответствовать имени, уже существующему в целевой системе (например, bin или root). Знак вопроса ? означает, что при установке объекта владелец (owner) останется неизменным. Подразумевается, что объект с тем же именем уже существует в целевой системе.

Спецификация переменной может быть указана в форме $ Owner или $owner, т.е. первая буква может быть как заглавной, так и строчной. Если переменная начинается со строчной буквы, то ее необходимо определить в период сборки пакета в файле prototype или в качестве параметра команды pkgmk. Если переменная начинается с заглавной буквы, то спецификация переменной будет внесена в файл pkginfo в качестве значения по умолчанию и может быть переопределена в ходе установки с помощью сценария request. Для получения дополнительной информации о разнице между переменными, создаваемыми в процессе установки, и переменными, создаваемыми в процессе сборки пакета, см. раздел Переменные среды пакета.

У файлов типа i (информационный файл) и lb (жесткая ссылка) это поле должно быть пустым.

Поле group

Поле group может содержать имя группы, знак вопроса (?) или спецификацию переменной. Имя группы не должно быть длиннее 14 символов и должно соответствовать имени, уже существующему в целевой системе (например, bin или sys). Знак вопроса ? означает, что при установке объекта группа (group) останется неизменной. Подразумевается, что объект с тем же именем уже существует в целевой системе.

Спецификация переменной может быть указана в форме $ Group или $group, т.е. первая буква переменной может быть как заглавной, так и строчной. Если переменная начинается со строчной буквы, то ее необходимо определить в период сборки пакета в файле prototype или в качестве параметра команды pkgmk. Если переменная начинается с заглавной буквы, то спецификация переменной будет внесена в файл pkginfo в качестве значения по умолчанию и может быть переопределена в ходе установки с помощью сценария request. Для получения дополнительной информации о разнице между переменными установки и переменными сборки пакета см. раздел Переменные среды пакета.

У файлов типа i (информационный файл) и l (жесткая ссылка) это поле должно быть пустым.

Создание файла prototype с нуля

При необходимости создания файла prototype с нуля можно использовать свой любимый текстовый редактор и добавлять по одной записи для каждого объекта пакета. Для получения дополнительной информации по формату этого файла см. раздел Формат файла prototype и справочную страницу prototype(4). После определения каждого объекта пакета можно включить в файл некоторые функции, описанные в разделе Добавление функций в файл prototype.

Пример. Создание файла prototypeс помощью команды pkgproto

С помощью команды pkgproto можно создать базовый файл prototype при условии, что структура каталогов пакета была упорядочена в соответствии с процедурой, описанной в разделе Упорядочение содержимого пакета. Например, с помощью используемой в примерах структуре каталогов и файла pkginfo, описание которого дано в предыдущих разделах, команды для создания файла prototype будут выглядеть следующим образом:


$ cd /home/jane
$ pkgproto ./SUNWcadap > InfoFiles/prototype

В результате получится следующий файл prototype:

d none SUNWcadap 0755 jane staff
d none SUNWcadap/demo 0755 jane staff
f none SUNWcadap/demo/file1 0555 jane staff
d none SUNWcadap/srcfiles 0755 jane staff
f none SUNWcadap/srcfiles/file5 0555 jane staff
f none SUNWcadap/srcfiles/file6 0555 jane staff
d none SUNWcadap/lib 0755 jane staff
f none SUNWcadap/lib/file2 0644 jane staff
d none SUNWcadap/man 0755 jane staff
f none SUNWcadap/man/windex 0644 jane staff
d none SUNWcadap/man/man1 0755 jane staff
f none SUNWcadap/man/man1/file4.1 0444 jane staff
f none SUNWcadap/man/man1/file3.1 0444 jane staff

Примечание –

Действительный владелец и группа, в которую входит сборщик пакета, записываются командой pkgproto. Полезным приемом считается использование команд chown -R и chgrp -R, указывающих владельца и группу, до выполнения команды pkgproto.


В приведенном выше примере создание файла prototype не закончено. В следующем разделе приводится информация по завершению создания этого файла.

Настройка файла prototype, созданного с помощью команды pkgproto

Несмотря на то, что команда pkgproto очень полезна при создании первичного файла prototype, она не создает записей для всех объектов пакета, которые должны быть определены. Эта команда не создает полных записей. Команда pkgproto не делает ничего из перечисленного ниже.

Содание записей для объектов типа v, e, x и i

Как минимум необходимо изменить файл prototype и добавить в него объекты с типом файла i. Если информационные файлы и сценарии установки были сохранены на первом уровне каталога пакета (например, /home/jane/SUNWcadap/pkginfo), тогда запись в файле prototype будет выглядеть следующим образом:


i pkginfo

Если же они не были сохранены на первом уровне каталога пакета, то потребуется указать из исходное местоположение. Пример:


i pkginfo=/home/jane/InfoFiles/pkginfo

В качестве альтернативы можно использовать команду !search для указания местоположения, которое команда pkgmk будет искать при сборке пакета. Для получения дополнительной информации см. раздел Указание пути поиска для команды pkgmk..

Для добавления записей для объектов типа v, e и x используйте формат, описанный в разделе Формат файла prototype, или воспользуйтесь справочной страницей prototype(4).


Примечание –

Не забывайте всегда назначать класс для файлов типа e (редактируемые) и создавать для него связанный сценарий действия над классом. В противном случае файлы будут удалены в ходе удаления пакета, даже если указанное имя пути совместно используется другими пакетами.


Использование нескольких классов

При использовании команды pkgproto для создания базового файла prototype можно назначить все объекты пакета классу none или одному определенному классу. Как показано в разделе Пример. Создание файла prototypeс помощью команды pkgproto, базовая команда pkgproto назначает все объекты классу none. Чтобы назначить все объекты какому-либо определенному классу, можно использовать параметр -c. Пример:


$ pkgproto -c classname /home/jane/SUNWcadap > /home/jane/InfoFiles/prototype

При использовании нескольких классов придется изменить файл prototype вручную и отредактировать поле class для каждого объекта. При использовании классов необходимо также определить параметр CLASSES в файле pkginfo, а также написать сценарии действий над классами. Использование классов является необязательным и подробно обсуждается в разделе Создание сценариев действий над классами.

Пример. Настройка файла prototype, созданного с помощью команды pkgproto

При наличии файла prototype, созданного ранее при помощи команды pkgproto, как описано в разделе Пример. Создание файла prototypeс помощью команды pkgproto, в нем требуется произвести некоторые изменения.

Добавление функций в файл prototype

Помимо определения каждого объекта пакета в файле prototype, можно расширить его функциональность следующим образом.

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

Определение дополнительных объектов, которые будут создаваться во время установки

С помощью файла prototype можно определять объекты, не поставляемые на распространяемом носителе. Если во время установки объекты требуемого типа не существуют, команда pkgadd создает эти объекты.

Для того чтобы указать, что объект будет создаваться на целевой системе, добавьте для него запись в файле prototype и укажите соответствующий тип файла.

Например, если на целевой системе необходимо создать каталог, отсутствующий на распространяемом носителе, следует добавить следующую запись в файл prototype:


d none /directory 0644 root other

Для создания пустого файла на целевой системе запись для такого файла в файле prototype может принять следующий вид:


f none filename=/dev/null 0644 bin bin

Единственными объектами, которые должны поставляться на распространяемом носителе, являются обычные файлы и сценарии редактирования (файлы типов e, v, f), а также каталоги, в которых они содержатся. Любые дополнительные объекты создаются без ссылки на поставляемые объекты, каталоги, именованные каналы, устройства, жесткие и символические ссылки.

Создание ссылок во время установки

Для создания ссылок во время установки пакета в записи файла prototype для ссылочного объекта укажите следующее:

Создание относительных ссылок будет зависеть от способа установки пакета, то есть будет ли он установлен как абсолютный или перемещаемый пакет.

Распределение пакетов по нескольким томам

При сборке пакета с помощью команды pkgmk эта команда производит расчеты и действия, необходимые для упорядочения многотомного пакета. Многотомный пакет называется сегментированным пакетом.

Существует и другой способ указать, в какой части будет располагаться объект. Для этого следует воспользоваться необязательном полем part в файле prototype. Номер, указанный в этом поле, отменяет команду pkgmk и помещает компонент в часть, указанную в этом поле. Обратите внимание на то, что существует взаимно-однозначное соответствие между частями и томами для сменных носителей, отформатированных как файловые системы. Если тома были назначены разработчиком, при недостаточном количестве места на любом из томов команда pkgmk выдает ошибку.

Вложение файлов prototype

Можно создать несколько файлов prototype, а затем включить их при помощи команды !include в один файл prototype. Вложение файлов может потребоваться для облегчения поддержки.

В следующем примере присутствуют три файла prototype. Редактируется главный файл (prototype). Два других файла (proto2 и proto3) включаются в этот файл.


!include /source-dir/proto2
!include /source-dir/proto3

Установка значений по умолчанию для полей mode, owner и group.

Чтобы установить значения по умолчанию для полей mode, owner и group отдельных объектов пакета, необходимо вставить команду !default в файл prototype. Пример:


!default 0644 root other

Примечание –

Действие команды !default начинается с места ее включения в файл и продолжается до его конца. Действие команды не распространяется на вложенные файлы.


Следует иметь в виду, что для каталогов (тип файла d) и редактируемых файлов (тип файла e), имеющихся в целевой системе (таких как /usr или /etc/vfstab), необходимо установить в значениях полей mode, owner и group в файле prototype вопросительный знак (?). Таким образом, не будут нарушены существующие параметры, измененные администратором сайта.

Указание пути поиска для команды pkgmk.

Если исходное расположение объектов пакета отличается от из расположения в целевой системе, и использование формата path1=path2, описанного в разделе Краткие замечания о расположении каталогов источника и приемника объекта, нежелательно, то можно использовать команду !search в файле prototype.

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

Команда в файле prototype будет выглядеть следующим образом:


!search /home-dir/pkgfiles

Примечание –

Запрос на поиск не распространяется на вложенные файлы. Кроме того, поиск ограничен определенными перечисленными каталогами. Рекурсивный поиск также не производится.


Установка переменных среды

К файлу prototype можно добавлять команды и в следующей форме: !PARAM=value. Команды, представленные в такой форме, определяют переменные в существующей среде. При наличии нескольких файлов prototype действие этой команды распространяется на тот файл prototype , в котором она была определена.

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

ProcedureСоздание файла prototype с помощью команды pkgproto


Примечание –

Рекомендуется создавать информационные файлы и сценарии установки до создания файла prototype. Однако этот порядок не является обязательным. Файл prototype всегда можно отредактировать после изменения содержимого пакета. Для получения дополнительных данных об информационных файлах и сценариях установки см. Глава 3Расширение функциональности пакета (задачи).


  1. Определите, какие объекты пакета будут абсолютными, а какие - перемещаемыми.

    Для получения информации о выполнении этого этапа см. раздел Поле path.

  2. Упорядочите объекты пакета таким образом, чтобы они повторяли свое расположение в целевой системе.

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

  3. Если пакет содержит коллективно перемещаемые объекты, необходимо отредактировать файл pkginfo и присвоить параметру BASEDIR соответствующее значение.

    Пример:


    BASEDIR=/opt

    Для получения информации о коллективно перемещаемых объектах см. раздел Коллективно перемещаемые объекты.

  4. Если пакет содержит индивидуально перемещаемые объекты, необходимо создать сценарий request, который будет предлагать установщику ввести соответствующее имя пути. Как вариант, можно создать сценарий checkinstall, который определит соответствующий путь на основе системных данных.

    Ниже приведены ссылки на наиболее общие задачи.

  5. Измените владельца и группу во всех компонентах пакета таким образом, чтобы они соответствовали владельцу и группе в целевой системе.

    Используйте команды chown -R и chgrp -R в каталоге пакета и каталоге информационных файлов.

  6. Выполните команду pkgproto для создания базового файла prototype.

    Команда pkgproto сканирует каталоги и создает базовый файл. Пример:


    $ cd package-directory
    $ pkgproto ./package-directory > prototype
    

    Файл prototype может располагаться в любом месте системы. Для упрощения доступа и обслуживания информационных файлов и сценариев установки рекомендуется хранить их в одном месте. Для получения дополнительной информации о команде pkgproto см. справочную страницу pkgproto(1).

  7. Откройте файл prototype в своем любимом текстовом редакторе и добавьте записи для файлов типа v, e, x и i.

    Для получения информации об изменениях, которые, вероятно, придется сделать, см. раздел Настройка файла prototype, созданного с помощью команды pkgproto.

  8. (Необязательное действие) При использовании нескольких классов отредактируйте файлы prototype и pkginfo. Используйте текстовый редактор для производства необходимых изменений и создания соответствующих сценариев действий над классами.

    Для получения информации об изменениях, которые вероятно придется сделать, см. раздел Настройка файла prototype, созданного с помощью команды pkgproto и Создание сценариев действий над классами.

  9. Откройте файл prototype в текстовом редакторе и переопределите имена путей, а также измените другие настройки полей.

    Для получения дополнительной информации см. раздел Настройка файла prototype, созданного с помощью команды pkgproto.

  10. (Необязательно) Откройте файл prototype в любом удобном текстовом редакторе и добавьте дополнительные функции к файлу prototype.

    Для получения дополнительной информации см. раздел Добавление функций в файл prototype.

  11. Сохраните изменения и выйдите из редактора.

См. также

Для перехода к следующей задаче перейдите по ссылке Как собрать пакет.

Сборка пакета

Для сборки пакета используйте команду pkgmk. Команда pkgmk выполняет следующие задачи:

Использование простейшей команды pkgmk

Простейшей формой этой команды является выполнение команды pkgmk без каких-либо параметров. Перед использованием команды pkgmk без параметров убедитесь, что в текущем рабочем каталоге содержится файл prototype пакета. Результат выполнения команды, файлы и каталоги записываются в каталог /var/spool/pkg.

Файл pkgmap

При сборке пакета с помощью команды pkgmk она создает файл pkgmap, который заменяет файл prototype. Файл pkgmap из предыдущего примера имеет следующее содержимое:


$ more pkgmap
: 1 3170
1 d none SUNWcadap 0755 root sys
1 d none SUNWcadap/demo 0755 root bin
1 f none SUNWcadap/demo/file1 0555 root bin 14868 45617 837527496
1 d none SUNWcadap/lib 0755 root bin
1 f none SUNWcadap/lib/file2 0644 root bin 1551792 62372 837527499
1 d none SUNWcadap/man 0755 bin bin
1 d none SUNWcadap/man/man1 0755 bin bin
1 f none SUNWcadap/man/man1/file3.1 0444 bin bin 3700 42989 837527500
1 f none SUNWcadap/man/man1/file4.1 0444 bin bin 1338 44010 837527499
1 f none SUNWcadap/man/windex 0644 root other 157 13275 837527499
1 d none SUNWcadap/srcfiles 0755 root bin
1 f none SUNWcadap/srcfiles/file5 0555 root bin 12208 20280 837527497
1 f none SUNWcadap/srcfiles/file6 0555 root bin 12256 63236 837527497
1 i pkginfo 140 10941 837531104
$

Формат этого файла очень схож с форматом файла prototype. Однако файл pkgmap содержит следующую информацию:

ProcedureКак собрать пакет

  1. Создайте файл pkginfo, если таковой отсутствует.

    Поэтапные указания приведены в разделе Как создать файл pkginfo.

  2. Создайте файл prototype, если таковой отсутствует.

    Поэтапные указания приведены в разделе Создание файла prototype с помощью команды pkgproto.

  3. Сделайте каталог, содержащий файл prototype, текущим рабочим каталогом.

  4. Выполните сборку пакета.


    $ pkgmk [-o] [-a arch] [-b base-src-dir] [-d device]
       [-f filename] [-l limit] [-p pstamp] [-r rootpath]
       [-v version] [PARAM=value] [pkginst]
    -o

    Перезаписывает текущую версию пакета.

    -a arch

    Отменяет информацию об архитектуре, содержащуюся в файле pkginfo.

    -b base-src-dir

    Запрашивает добавление параметра base-src-dir к началу перемещаемых имен путей, когда команда pkgmk осуществляет поиск объектов в системе разработчика.

    -d device

    Указывает, что пакет должен быть скопирован на устройство device. В качестве устройства может выступать абсолютное имя пути каталога, дискета или съемный диск.

    -f filename

    Называет файл filename, который используется в качестве файла prototype. Имена по умолчанию - prototype или Prototype.

    -l limit

    Определяет максимальный размер устройства вывода в 512-байтных блоках.

    -p pstamp

    Отменяет определение производственной маркировки в файле pkginfo.

    -r rootpath

    Требует, чтобы для обнаружения объектов в системе разработчика использовался корневой каталог rootpath.

    -v version

    Отменяет информацию о версии, содержащуюся в файле pkginfo.

    PARAM=value

    Устанавливает глобальные переменные среды. Переменные, начинающиеся со строчной буквы, вычисляются во время сборки пакета. Переменные, начинающиеся с заглавной буквы, помещаются в файл pkginfo и используются во время установки.

    pkginst

    Ссылается на пакет по его аббревиатуре или определенному экземпляру (например, SUNWcadap.4).

    Для получения дополнительной информации см. справочную страницу pkgmk(1).

  5. Проверьте содержимое пакета.


    $ pkgchk -d device-name pkg-abbrev
    Checking uninstalled directory format package pkg-abbrev
    from device-name
    ## Checking control scripts.
    ## Checking package objects.
    ## Checking is complete.
    $
    -d device-name

    Указывает расположение пакета. Обратите внимание, что device-name может быть как полным именем пути каталога, так и идентификатором в случае использования ленточного накопителя или съемного диска.

    pkg-abbrev

    Указывает имя одного или нескольких пакетов (разделенных пробелами), которые следует проверить. Если этот параметр отсутствует, команда pkgchk проверяет все имеющиеся пакеты.

    Команда pkgchk выводит на печать перечень проверяемых параметров пакета и выводит на экран предупреждения или сообщения об ошибках. Для получения дополнительной информации о команде pkgchk см. раздел Проверка целостности пакета.


    Внимание – Внимание –

    К ошибкам следует относиться очень серьезно. Ошибка может означать, что необходимо внести изменения в сценарий. Проверьте все ошибки и продолжите работу, если не согласны с результатом выполнения команды pkgchk.



Пример 2–2 Сборка пакета

В данном примере используется файл prototype, созданный в разделе Настройка файла prototype, созданного с помощью команды pkgproto.


$ cd /home/jane/InfoFiles
$ pkgmk
## Building pkgmap from package prototype file.
## Processing pkginfo file.
WARNING: parameter  set to "system990708093144"
WARNING: parameter  set to "none"
## Attempting to volumize 13 entries in pkgmap.
part  1 -- 3170 blocks, 17 entries
## Packaging one part.
/var/spool/pkg/SUNWcadap/pkgmap
/var/spool/pkg/SUNWcadap/pkginfo
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/demo/file1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/lib/file2
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file3.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file4.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/windex
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file5
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file6
## Validating control scripts.
## Packaging complete.
$


Пример 2–3 Определение исходного каталога для перемещаемых файлов

Если пакет содержит перемещаемые файлы, то можно использовать параметр -b base-src-dir в команде pkgmk для указания имени пути, которое следует добавить к началу перемещаемых имен путей во время создания пакета. Этот параметр может быть полезен, если для перемещаемых файлов не использовался формат path1=path2 или командой !search не был указан путь поиска в файле prototype.

Команда выполняет сборку пакета со следующими характеристиками:


$ cd /home/jane/InfoFiles
$ pkgmk -o -b /home/jane
## Building pkgmap from package prototype file.
## Processing pkginfo file.
WARNING: parameter  set to "system960716102636"
WARNING: parameter  set to "none"
## Attempting to volumize 13 entries in pkgmap.
part  1 -- 3170 blocks, 17 entries
## Packaging one part.
/var/spool/pkg/SUNWcadap/pkgmap
/var/spool/pkg/SUNWcadap/pkginfo
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/demo/file1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/lib/file2
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file3.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/man1/file4.1
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/man/windex
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file5
/var/spool/pkg/SUNWcadap/reloc/SUNWcadap/srcfiles/file6
## Validating control scripts.
## Packaging complete.

В этом примере пакет собирается в каталоге по умолчанию /var/spool/pkg с помощью параметра -o. Этот параметр перезаписывает пакет, созданный в Пример 2–2.



Пример 2–4 Указание других исходных каталогов для информационных файлов и объектов пакета

Если разместить информационные файлы пакета (например, pkginfo и prototype) и объекты пакета в двух разных каталогах, то можно создать пакет с помощью параметров -b base-src-dir и - r rootpath команды pkgmk. Если объекты пакета находятся в каталоге /product/pkgbin, а другие информационные файлы пакета в каталоге /product/pkgsrc, то можно использовать следующую команду для помещения пакета в каталог /var/spool/pkg:


$ pkgmk -b /product/pkgbin -r /product/pkgsrc -f /product/pkgsrc/prototype

При желании можно использовать указанные ниже команды для достижения того же результата:


$ cd /product/pkgsrc
$ pkgmk -o -b /product/pkgbin

В данном примере команда pkgmk использует текущий рабочий каталог для поиска оставшихся частей пакета (таких, как информационные файлы prototype и pkginfo).


См. также

Для получения информации о добавлении необязательных информационных файлов и сценариев установки к пакету см. Глава 3Расширение функциональности пакета (задачи). После сборки пакета следует проверить его целостность. В Глава 4Проверка и запись пакета рассказано, как это сделать. В этой главе представлены поэтапные указания по записи проверенного пакета на распространяемый носитель.