“Payload-free” packages — that is, Apple installer packages that do not have a file payload, but only run scripts, are a nice tool for OS X admins to have. They provide a convenient way to deliver and execute scripts as root. If you have a way to install packages on your managed machines, you can also run scripts as root by wrapping them in a “payload-free” package.
Rich Trouton has written up the basic procedure using the built-in `pkgbuild` tool: https://derflounder.wordpress.com/2012/08/15/creating-payload-free-packages-with-pkgbuild/
But payload-free packages built this way have a “feature” that can sometimes prove problematic. Flat packages built with pkgbuild
using the --nopayload
option do not leave receipts in the pkgutil
database. This means it can be difficult to determine if a given payload-free package has already been installed on a given machine.
This is especially annoying with Munki: by default, when installing a package, Munki uses the package’s receipt(s) to determine whether or not the package has been installed. Without that receipt, and with no other information, Munki can’t tell if the package has been installed.
Fortunately, it’s trivial to make a pseudo-payload-free package that leaves a receipt. All we need to do is specify an empty payload!
Here’s how we make a “true” payload-free package (that does not leave a receipt):
pkgbuild --nopayload --scripts /path/to/scripts_dir --identifier org.example.payloadfree --version 1.0 MyGreatPayloadFree.pkg
and here’s a “pseudo” payload-free package that does leave a receipt:
mkdir empty
pkgbuild --root empty --scripts /path/to/scripts_dir --identifier org.example.payloadfree --version 1.0 MyGreatPayloadFree.pkg
That’s it! Instead of using the --nopayload
option, we create an empty directory and point the --root
option at it. The package is built with the empty payload, and when installed, the package leaves a receipt.
[…] I was wrong about point 4. Greg Neagle has pointed out that you can make a package with pkgbuild that, while not technically payload-free, will act just like on…. The key is to create an empty directory and set pkgbuild‘s –root option to look there […]