Keywords: Solaris package IPS+Repository pkg
1
Work on Directory Structure
Start with organizing the package contents (files) into the same directory structure that you want on the installed system.
In the following example the directory was organized in such a manner that when the package was installed, it results in software being copied to /opt/myutils directory.
eg.,
# tree opt
opt
`-- myutils
|-- docs
| |-- README.txt
| `-- util_description.html
|-- mylib.py
|-- util1.sh
|-- util2.sh
`-- util3.sh
Create a directory to hold the software in the desired layout. Let us call this “workingdir”, and this directory will be specified in subsequent steps to generate the package manifest and finally the package itself. Move the top level software directory to the “workingdir”.
# mkdir workingdir # mv opt workingdir # tree -fai workingdir/ workingdir workingdir/opt workingdir/opt/myutils workingdir/opt/myutils/docs workingdir/opt/myutils/docs/README.txt workingdir/opt/myutils/docs/util_description.html workingdir/opt/myutils/mylib.py workingdir/opt/myutils/util1.sh workingdir/opt/myutils/util2.sh workingdir/opt/myutils/util3.sh
2
Generate Package Manifest
Package manifest provides metadata such as package name, description, version, classification & category along with the files and directories included, and the dependencies, if any, need to be installed for the target package.
The manifest for an existing package can be examined with the help of pkg contents subcommand.
pkgsend generate command generates the manifest. It takes “workingdir” as input. Piping the output through pkgfmt makes the manifest readable.
# pkgsend generate workingdir | pkgfmt > myutilspkg.p5m.1 # cat myutilspkg.p5m.1
3
Add Metadata to Package Manifest
Note that the package manifest is currently missing attributes such as name and description (metadata). Those attributes can be added directly to the generated manifest. However the recommended approach is to rely on pkgmogrify utility to make changes to an existing manifest.
Create a text file with the missing package attributes.
eg.,# cat mypkg_attr set name=pkg.fmri value=myutils@3.0,5.11-0 set name=pkg.summary value="Utilities package" set name=pkg.description value="Utilities package" set name=variant.arch value=sparc set name=variant.opensolaris.zone value=global
set name=variant.opensolaris.zone value=global action restricts the package installation to global zone. To make the package installable in both global and non-global zones, either specify set name=variant.opensolaris.zone value=global value=nonglobal action in the package manifest, or do not have any references to variant.opensolaris.zone variant at all in the manifest.
Now merge the metadata with the manifest generated in previous step.
# pkgmogrify myutilspkg.p5m.1 mypkg_attr | pkgfmt > myutilspkg.p5m.2 # cat myutilspkg.p5m.2
4
Evaluate & Generate Dependencies
Generate the dependencies so they will be part of the manifest. It is recommended to rely on pkgdepend utility for this task rather than declaring depend actions manually to minimize inaccuracies.
eg.,# pkgdepend generate -md workingdir myutilspkg.p5m.2 | pkgfmt > myutilspkg.p5m.3
At this point, ensure that the manifest has all the dependencies listed. If not, declare the missing dependencies manually.
5
Resolve Package Dependencies
This step might take a while to complete.
eg.,# pkgdepend resolve -m myutilspkg.p5m.3
6
Verify the Package
By this time the package manifest should pretty much be complete. Check and validate it manually or using pkglint utility (recommended) for consistency and any possible errors.
# pkglint myutilspkg.p5m.3.res
7
Publish the Package
For the purpose of demonstration let’s go with the simplest option to publish the package, local file-based repository.
Create the local file based repository using pkgrepo command, and set the default publisher for the newly created repository.
# pkgrepo create my-repository # pkgrepo -s my-repository set publisher/prefix=mypublisher
Finally publish the target package with the help of pkgsend command.
# pkgsend -s my-repository publish -d workingdir myutilspkg.p5m.3.res pkg://mypublisher/myutils@3.0,5.11-0:20180704T014157Z PUBLISHED # pkgrepo info -s my-repository PUBLISHER PACKAGES STATUS UPDATED mypublisher 1 online 2018-07-04T01:41:57.414014Z
8
Validate the Package
Finally validate whether the published package has been packaged properly by test installing it.
# pkg set-publisher -p my-repository
# pkg publisher
# pkg install myutils
# pkg info myutils
Name: myutils
Summary: Utilities package
Description: Utilities package
State: Installed
Publisher: mypublisher
Version: 3.0
Build Release: 5.11
Branch: 0
Packaging Date: Wed Jul 04 01:41:57 2018
Last Install Time: Wed Jul 04 01:45:05 2018
Size: 49.00 B
FMRI: pkg://mypublisher/myutils@3.0,5.11-0:20180704T014157Z