Electron simplifies the development of cross-platform desktop apps. Unfortunately, packaging and releasing an Electron app for the different platforms is not a straightforward task. This post aims to guide you through the process
Packaging
electron-builder
is a third-party tool that facilitates the process of packaging an Electron app. The tool handles various tasks required for building a production-ready app, like the inclusion of native dependencies, code signing, upload to a download server, and the inclusion of an auto-updater tool.
Run the following command to add electron-builder
to your Electron project:
yarn add --dev electron-builder
Next, add the following scripts to your package.json
file:
package.json
{
"scripts:": {
"postinstall": "electron-builder install-app-deps",
"build": "electron-builder --mac --windows --linux",
"release": "electron-builder --mac --windows --linux --publish always"
}
}
The postinstall
script will execute after every yarn install
and makes sure that native dependencies match your app’s version of Electron. The build
script can be used to package your app for all specified platforms. The release
script builds the app and publishes it on your download server.
You can also specify configuration parameters for electron-builder
in your package.json
file under the "build"
key. I recommend the following options:
package.json
{
"name": "your-app",
"build": {
"appId": "com.yourcompany.yourapp",
"productName": "Your App",
"mac": {
"category": "public.app-category.lifestyle"
},
"dmg": {
"icon": false
},
"linux": {
"target": ["AppImage"],
"category": "Office"
}
}
}
See here for a list of possible Mac app categories and here for the available Linux categories.
Finally, create a folder named build
in your project’s root directory and copy your app icon (named icon.png
) into it. If you don’t add this file, the default Electron icon will be used.
You can now run yarn build
and your app should get packaged for the platforms you specified earlier. You can find the output in the dist
directory (which you should add to your .gitignore
).
It’s important to know that, by default, electron-builder
will include all dependencies from your package.json
file in the app package, whereas development dependencies are ignored. To keep your app size small, you need to specify dependencies as devDependencies
if your app doesn’t use them in production. If you’re using a module bundler like Webpack, you should either mark the bundled dependencies as devDependencies
(to avoid having them in your package twice) or configure electron-builder
to skip these dependencies (using the "files"
configuration key).
Auto Update
electron-builder
comes with built-in support for electron-updater
, which checks your download server for new app versions every time the app is launched. If a more recent version exists, it’s automatically downloaded in the background and installed after the user closes the app.
To use electron-updater
in your project, run the following command:
yarn add electron-updater
Add the following code to your main process:
main.js
const autoUpdater = require("electron-updater");
app.on("ready", () => {
autoUpdater.checkForUpdatesAndNotify();
});
If you’re using GitHub Releases for distributing your app (explained later in this guide), that’s all the configuration you need for the auto-updater to work!
Code Signing
For auto-updating to work on macOS, your code needs to be signed:
- To obtain code signing certificates, you need to be enrolled in the Apple Developer Program (costs annually).
- Install Xcode if necessary.
- Open Xcode → Preferences → Accounts → Manage Certificates. Add one of each macOS-related certificate. Having one of each type allows for distribution both inside and outside the Mac App Store. The certificates are automatically added to your Keychain, where
electron-builder
can detect them. Your code will now automatically be signed whenever you run thebuild
script.
Code signing of Windows apps is optional. If you choose not to sign your app, your users will be presented with a warning when installing your app.
Release
Manual Release
electron-builder
supports various platforms for storing your app. By default, GitHub Releases will be used to store the files. To be able to publish on GitHub, generate a Personal Access Token for electron-builder
.
Whenever you want to publish a new version of your app, do the following:
- Increase the version number in your
package.json
file. Commit and push this change. - Run the
release
script with your GitHub token:GH_TOKEN=... yarn release
. Your app will be built and the packages will be uploaded to GitHub. A release draft for the new version will be created. - Open the GitHub page of your repository and find the new release draft with the download links for your app. Add a changelog and publish the release.
That’s it! Your Electron app is now ready to be downloaded from its GitHub page. If you additionally want to publish your app on the Mac App Store, see this follow-up post.
Using GitHub Actions
Instead of building and releasing the app manually, you can also use GitHub Actions to do this task for you. You can read more about this process in my other blog post.