What is @electron/rebuild?
@electron/rebuild is a tool designed to help developers rebuild native Node.js modules against the current Electron version. This is particularly useful when working with native modules that need to be compatible with Electron's version of Node.js.
What are @electron/rebuild's main functionalities?
Rebuild Native Modules
This feature allows you to rebuild native Node.js modules to be compatible with a specific version of Electron. The code sample demonstrates how to use the `rebuild` function to rebuild modules in the current directory for Electron version 13.1.7.
const { rebuild } = require('@electron/rebuild');
rebuild({
buildPath: __dirname,
electronVersion: '13.1.7'
}).then(() => {
console.log('Rebuild complete!');
}).catch((err) => {
console.error('Rebuild failed:', err);
});
CLI Usage
You can also use @electron/rebuild from the command line to rebuild native modules. This command rebuilds the modules for Electron version 13.1.7.
npx electron-rebuild -v 13.1.7
Rebuild Specific Modules
This feature allows you to rebuild specific native modules rather than all modules in the project. The code sample demonstrates how to rebuild only the 'native-module' for Electron version 13.1.7.
const { rebuild } = require('@electron/rebuild');
rebuild({
buildPath: __dirname,
electronVersion: '13.1.7',
onlyModules: ['native-module']
}).then(() => {
console.log('Rebuild complete!');
}).catch((err) => {
console.error('Rebuild failed:', err);
});
Other packages similar to @electron/rebuild
electron-builder
electron-builder is a complete solution to package and build a ready-for-distribution Electron app. It includes support for rebuilding native modules, but also offers a wide range of other features such as auto-updates, code signing, and multi-platform builds. Compared to @electron/rebuild, electron-builder is more comprehensive but also more complex.
node-gyp
node-gyp is a cross-platform command-line tool written in Node.js for compiling native addon modules for Node.js. While it can be used to rebuild native modules, it does not specifically target Electron and lacks the convenience features of @electron/rebuild. It requires more manual configuration and is generally used as a lower-level tool.
Electron Rebuild
This executable rebuilds native Node.js modules against the version of Node.js
that your Electron project is using. This allows you to use native Node.js
modules in Electron apps without your system version of Node.js matching exactly
(which is often not the case, and sometimes not even possible).
How does it work?
Install the package with --save-dev
:
npm install --save-dev @electron/rebuild
Then, whenever you install a new npm package, rerun electron-rebuild:
$(npm bin)/electron-rebuild
Or if you're on Windows:
.\node_modules\.bin\electron-rebuild.cmd
If you have a good node-gyp config but you see an error about a missing element on Windows like Could not load the Visual C++ component "VCBuild.exe"
, try to launch electron-rebuild in an npm script:
"scripts": {
"rebuild": "electron-rebuild -f -w yourmodule"
}
and then
npm run rebuild
What are the requirements?
Node v12.13.0 or higher is required. Building native modules from source uses
node-gyp
, refer to the link for its
installation/runtime requirements.
CLI Arguments
Usage: electron-rebuild --version [version] --module-dir [path]
Options:
-h, --help Show help [boolean]
-v, --version The version of Electron to build against
-f, --force Force rebuilding modules, even if we would skip
it otherwise
-a, --arch Override the target architecture to something
other than your system's
-m, --module-dir The path to the app directory to rebuild
-w, --which-module A specific module to build, or comma separated
list of modules. Modules will only be rebuilt if they
also match the types of dependencies being rebuilt
(see --types).
-e, --electron-prebuilt-dir The path to the prebuilt electron module
-d, --dist-url Custom header tarball URL
-t, --types The types of dependencies to rebuild. Comma
separated list of "prod", "dev" and "optional".
Default is "prod,optional"
-p, --parallel Rebuild in parallel, this is enabled by default
on macOS and Linux
-s, --sequential Rebuild modules sequentially, this is enabled by
default on Windows
-o, --only Only build specified module, or comma separated
list of modules. All others are ignored.
-b, --debug Build debug version of modules
--prebuild-tag-prefix GitHub tag prefix passed to prebuild-install.
Default is "v"
Copyright 2016
This package is automatically used with Electron Forge when packaging an Electron app.
electron-rebuild provides a function compatible with the afterCopy
hook
for Electron Packager. For example:
import packager from '@electron/packager';
import rebuild from '@electron/rebuild';
packager({
afterCopy: [(buildPath, electronVersion, platform, arch, callback) => {
rebuild({ buildPath, electronVersion, arch })
.then(() => callback())
.catch((error) => callback(error));
}],
});
How can I integrate this with prebuild?
If your module uses prebuild for creating prebuilt binaries,
it also uses prebuild-install to download them. If
this is the case, then electron-rebuild
will run prebuild-install
to download the correct
binaries from the project's GitHub Releases instead of rebuilding them.
How can I integrate this into Grunt / Gulp / Whatever?
electron-rebuild is also a library that you can require into your app or
build process. It has a very simple API:
import rebuild from '@electron/rebuild';
A full build process might look something like:
const childProcess = require('child_process');
const pathToElectron = require('electron');
rebuild({
buildPath: __dirname,
electronVersion: '1.4.12'
})
.then(() => console.info('Rebuild Successful'))
.catch((e) => {
console.error("Building modules didn't work!");
console.error(e);
});