XPI Generation

Note that some parts of the following text have been simplified to allow you get a better idea of what's going on when a XPI is created.

Running cfx xpi in the directory of any package that contains a program will bundle the package and all its dependencies into a standalone XPI. This document explains how this process works under the hood.

Source Packages

We start out with a simplified packages directory with three packages, structured like so:



Note that our packages directory could actually contain more packages, too. This doesn't affect the generated XPI, however, because only packages cited as dependencies by aardvark's package.json will ultimately be included in the XPI.

The XPI Template

The Add-on SDK also contains a directory that contains a template for a XPI file:



A template different than the default can be specified via the cfx tool's --templatedir option.

The Generated XPI

When we run cfx xpi to build the aardvark package into an add-on, aardvark's dependencies are calculated, and a XPI file is generated that combines all required packages, the XPI template, and a few other auto-generated files:



It can be observed from the listing above that the barbeque package's lib directory will be mapped to resource://guid-barbeque-lib/ when the XPI is loaded.

Similarly, the lib directories of api-utils and aardvark will be mapped to resource://guid-api-utils-lib/ and resource://guid-aardvark-lib/, respectively.

In an actual XPI built by the SDK, the string "guid" in these examples is a unique identifier that the SDK prepends to all resource: URIs to namespace the XPI's resources so they don't collide with anything else, including other add-ons built by the SDK and containing the same packages. This GUID is built from the Program ID.

By default, the generated XPI contains every module from each package that is referenced by the addon, even the modules that aren't used (such as the notifications module if the addon is only using page-mod). By running cfx xpi --strip-xpi instead, the SDK will produce a "stripped" XPI, that only includes the modules that are actually used, resulting in a smaller XPI file. (Note: --strip-xpi is currently experimental; when this feature is sufficiently mature, it will simply be made the default, and the cfx option will be removed.)