|Mandalika's scratchpad||[ Work blog @Oracle | My Music Compositions ]|
Keywords: Solaris package IPS+Repository pkg
1Work on Directory Structure
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
# 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
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 firstname.lastname@example.org,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=globalaction 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=nonglobalaction in the package manifest, or do not have any references to
variant.opensolaris.zonevariant 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 -s my-repository publish -d workingdir myutilspkg.p5m.3.res pkg://email@example.com,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://firstname.lastname@example.org,5.11-0:20180704T014157Z