Creating a Mac OS X application package (from a mono project)
I’ve recently been asked to work on a little project and I was free to use the technology I saw fit. Given that the project had to be multi-platform and provide a complex GUI, I decided to go with C# (using Mono) and Gtk#. It’s choice I find to be pragmatic and practical for this particular set of demands.
I work on the project with MonoDevelop (or Xamarin studio (or whatever you’re supposed to call that monstrosity that passes as an IDE now)) mostly because it makes working on Linux and Mac OS X a breeze. As you can imaging, C# and Windows go well together too.
While discussing the technological aspect of the project with a colleague, the subject of Mac application packages came up. You know, these .app files. I decided to look into that for a bit.
I already knew that these “files” were in fact directories with a specific folder structure and an xml file pointing to the various resources and executables needed for the program to work. I didn’t delve too deep into the manual creation of these packages, but I knew enough to have a sense of what I was looking for.
Packaging the application
It turns out the standard mono distribution offers a command line utility designed for this exact purpose. While I didn’t create a MonoMac project, I was able to package my GUI application relying on Gtk# rather effectively.
This command line utility called
macpack is extremely simple to use, just point him to the direction of the files you want to package, specify the name of the assembly containing the
Main method and you’re good to go.
macpack [options] assembly -n appname -appname:appname Application Name -o output -output:OUTPUT Output directory -a assembly Assembly to pack -i file -icon file Icon filename -r resource1,resource2 Additional files to bundle -m [winforms|cocoa|x11|console] The mode for the applicatio
This is the line I used to compile a little test project:
macpack -o:. -w:winforms -r:/Library/Frameworks/Mono.framework/Versions/Current/lib/ -r:GtkMacTest.exe.mdb -n:GtkMacTest -a:GtkMacTest.exe
-w:winforms was a bit of a shot in the dark as there is now Gtk specific option… in the end it worked out well.
I didn’t experiment with the
-i option, so the resulting package looks rather ugly with the default icon on, but I’ll look into that another day. For now, all that matters is that I created a working .app to distribute the project.
Other methods (?)
While looking for informations on how to easily create Mac .app packages, I stumbled about a project called Platypus. While I don’t have any use for it now, it may be a good idea to experiment with it at some point. Not all projects can be made with Mono and the convenient tools it provides.