Bundle a precompiled binary or native file into an electron app.
2 min readJan 26, 2019
- Author: Ganesh Rathinavel
- License: MIT
- Repo URL: https://github.com/ganeshrvel/tutorial-electron-bundle-binaries
- Contacts: ganeshrvel@outlook.com
Introduction
Distributing pre-compiled native binaries along with an electron application could get tricky as the ASAR packager tends to exclude such files while packaging the app. This was originally implemented inside OpenMTP — Advanced Android File Transfer Application for macOS.
Implementation
- Create the “OS” folder inside the project’s “build” directory
# Replace {OS} with the required OS name. eg: mac, win, linux
$ mkdir -p ./build/{OS}/bin
- Place the binaries here
- Install npm packages
$ npm install electron-root-pathor$ yarn add electron-root-path
- Create the file ./app/binaries.js and paste the code:
'use strict';import path from 'path';
import { remote } from 'electron';
import { rootPath } from 'electron-root-path';
import getPlatform from './get-platform';const IS_PROD = process.env.NODE_ENV === 'production';
const root = rootPath;
const { getAppPath } = remote.app;
const isPackaged =
process.mainModule.filename.indexOf('app.asar') !== -1;const binariesPath =
IS_PROD && isPackaged
? path.join(path.dirname(getAppPath()), '..', './Resources', './bin')
: path.join(root, './resources', getPlatform(), './bin');export const execPath = path.resolve(path.join(binariesPath, './binary-file'));
- Create the file ./app/get-platform.js and paste the code
'use strict';import { platform } from 'os';export default () => {
switch (platform()) {
case 'aix':
case 'freebsd':
case 'linux':
case 'openbsd':
case 'android':
return 'linux';
case 'darwin':
case 'sunos':
return 'mac';
case 'win32':
return 'win';
}
};
- Add the below code to your ./package.json file
"build": {
"extraFiles": [
{
"from": "build/mac/bin",
"to": "Resources/bin",
"filter": [
"**/*"
]
}
],
},
- To distribute the code via Mac App Store, add the below code to your package.json file
"build": {
"mas": {
"type": "distribution",
"category": "public.app-category.productivity",
"entitlements": "build/entitlements.mas.plist",
"icon": "build/icon.icns",
"binaries": [
"dist/mas/<APP_NAME>.app/Contents/Resources/bin/mtp-cli"
]
},
}
- Import the binary file as:
import { execPath } from './binaries';// your program code:
var command = spawn(execPath, arg, {});
More repos
- OpenMTP — Advanced Android File Transfer Application for macOS
- Tutorial Series by Ganesh Rathinavel
- npm: electron-root-path
- Electron React Redux Advanced Boilerplate
License
tutorial-electron-bundle-binaries is released under MIT License.
Copyright © 2018-Present Ganesh Rathinavel