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

Создание файла 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. Сохраните изменения и выйдите из редактора.

См. также

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