Mandalika's scratchpad | [ Work blog @Oracle | My Music Compositions ] |
Old Posts: 09.04 10.04 11.04 12.04 01.05 02.05 03.05 04.05 05.05 06.05 07.05 08.05 09.05 10.05 11.05 12.05 01.06 02.06 03.06 04.06 05.06 06.06 07.06 08.06 09.06 10.06 11.06 12.06 01.07 02.07 03.07 04.07 05.07 06.07 08.07 09.07 10.07 11.07 12.07 01.08 02.08 03.08 04.08 05.08 06.08 07.08 08.08 09.08 10.08 11.08 12.08 01.09 02.09 03.09 04.09 05.09 06.09 07.09 08.09 09.09 10.09 11.09 12.09 01.10 02.10 03.10 04.10 05.10 06.10 07.10 08.10 09.10 10.10 11.10 12.10 01.11 02.11 03.11 04.11 05.11 07.11 08.11 09.11 10.11 11.11 12.11 01.12 02.12 03.12 04.12 05.12 06.12 07.12 08.12 09.12 10.12 11.12 12.12 01.13 02.13 03.13 04.13 05.13 06.13 07.13 08.13 09.13 10.13 11.13 12.13 01.14 02.14 03.14 04.14 05.14 06.14 07.14 09.14 10.14 11.14 12.14 01.15 02.15 03.15 04.15 06.15 09.15 12.15 01.16 03.16 04.16 05.16 06.16 07.16 08.16 09.16 12.16 01.17 02.17 03.17 04.17 06.17 07.17 08.17 09.17 10.17 12.17 01.18 02.18 03.18 04.18 05.18 06.18 07.18 08.18 09.18 11.18 12.18 01.19 02.19 05.19 06.19 08.19 10.19 11.19 05.20 10.20 11.20 12.20 09.21 11.21 12.22
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 /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
Labels: oracle solaris ips pkg package publish create
2004-2019 |