Packaging your application allows you to distribute it for users conveniently. One of the benefits, compared to releasing as a compressed archive, is that you can control how and where your binaries will be installed on the target system.
Installing packages on Linux systems can be highly automated which is yet another reason, if you are looking to ‘push’ applications to multiple hosts.
The solution we are going to discuss is okay if you want to use the created package internally. Should you want to publish your package to one of the Debian repositories please carefully study the contribution guidelines.
- I followed this ubuntuforum thread to learn the steps (but I added some more steps for validation)
- I strongly suggest you keep this page open while working on your package configuration
In this example I would like to create a DEB package of a two-liner perl script for testing purposes. Here is the code:
#! /usr/bin/perl $msg = "So happy to be packaged!\n"; print $msg;
I saved the file to /tmp/basicdebtest (yes without any file extension).
Create a folder for your package.
mkdir -p basicdebtest_1.0-1
We would like to install the script to /usr/local/bin on the user’s system so we need to mimic that file tree here.
mkdir -p basicdebtest_1.0-1/usr/local/bin
Copy the application file(s). In my case this is only the exacutable perl script.
cp /tmp/basicdebtest basicdebtest_1.0-1/usr/local/bin
Create a folder for the package descriptor file.
mkdir -p basicdebtest_1.0-1/DEBIAN
Create the package descriptor file.
This is where the link I gave you comes handy. You want to be able to know what each of the fields mean and which one you can skip. Here is what I what did:
Package: basicdebtest Version: 1.0-1 Section: base Priority: optional Architecture: i386 Maintainer: Dave <email@example.com> Description: Basic Deb Test This was a triumph! I'm making a note here: Huge success!
Time to build!
dave@dave-desktop:~/Dropbox/Project/Examples$ dpkg-deb --build basicdebtest_1.0-1 dpkg-deb: building package `basicdebtest' in `basicdebtest_1.0-1.deb'.
As a result you should have a new file called: basicdebtest_1.0-1.deb
If you only create packages for personal use you might don’t care too much for validation error. I still strongly encourage you to check what might be missing / erroneous in your setup.
dave@dave-desktop:~/Dropbox/Project/Examples$ lintian basicdebtest_1.0-1.deb E: basicdebtest: debian-changelog-file-missing E: basicdebtest: no-copyright-file W: basicdebtest: unknown-section base E: basicdebtest: wrong-file-owner-uid-or-gid usr/ 1000/1000 W: basicdebtest: non-standard-dir-perm usr/ 0775 != 0755 E: basicdebtest: wrong-file-owner-uid-or-gid usr/local/ 1000/1000 W: basicdebtest: non-standard-dir-perm usr/local/ 0775 != 0755 E: basicdebtest: wrong-file-owner-uid-or-gid usr/local/bin/ 1000/1000 E: basicdebtest: dir-in-usr-local usr/local/bin/ W: basicdebtest: non-standard-dir-perm usr/local/bin/ 0775 != 0755 E: basicdebtest: wrong-file-owner-uid-or-gid usr/local/bin/basicdebtest 1000/1000 E: basicdebtest: file-in-usr-local usr/local/bin/basicdebtest W: basicdebtest: file-in-unusual-dir usr/local/bin/basicdebtest W: basicdebtest: non-standard-executable-perm usr/local/bin/basicdebtest 0775 != 0755
As you can see in my setup I have all those errors (E). I would have to fix these if I were to publish my application into a repository. Warnings might not get your package refused but hey: we know warnings are there for a reason. Try and fix those using the guide.
It’s time to see if we can actually install our package. Let’s simply double click on the file to bring up the package manager (I am using Ubuntu).
As you can see the description we configured is used. If you are doing something for real maybe you want to add an image of your application to impress users.
Don’t say I did not warn you! We tried to install a package without fixing the errors. Now we get a warning message indicating something is fishy with the package.
Go back to Step 7 and fix those problems. After that is done proceed with the installation.
The package should be installed into /usr/local/bin on your machine:
dave@dave-desktop:~/Dropbox/Project/Examples$ ll /usr/local/bin | grep basic -rwxrwxr-x 1 dave dave 67 aug 21 09:38 basicdebtest*
That means we must be able to execute our little script from anywhere:
dave@dave-desktop:~/Dropbox/Project/Examples$ basicdebtest So happy to be packaged!
Thanks for reading my post. If you have some remarks, errata please ping me using the comment section below.