Keywords: Solaris package IPS+Repository pkg
1Work 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
2Generate 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
3Add 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 specifyset name=variant.opensolaris.zone value=global value=nonglobal
action in the package manifest, or do not have any references tovariant.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
4Evaluate & 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.
# 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.
5Resolve Package Dependencies
This step might take a while to complete.
eg.,
# pkgdepend resolve -m myutilspkg.p5m.3
6Verify 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
7Publish 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
8Validate 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