Create a Windows package for your Electron app.
npm install electron-installer-windows!Electron Installer for Windows
> Create a Windows package for your Electron app.
This tool relies on the awesome Squirrel.Windows framework written by @paulcbetts. It takes care of creating the actual package, signing it, dealing with updates, and many more things. Gotta give credit where credit is due, ya know.
This tool requires Node 10 or greater.
I'd recommend building your packages on your target platform, but if you have to run this on Mac OS X or Linux, you will need to install mono and wine through your package manager.
You won't get an .msi installer though, only .nupkg and .exe installers. To get an .msi installer you'll need to run on Windows.
For use from command-line:
``shell`
$ npm install -g electron-installer-windows
For use in npm scripts or programmatically:
`shell`
$ npm install --save-dev electron-installer-windows
Say your Electron app lives in path/to/app and has a structure like this:
``
.
├── LICENSE
├── README.md
├── node_modules
│ ├── electron-packager
│ └── electron-prebuilt
├── package.json
├── resources
│ ├── Icon.png
│ ├── IconTemplate.png
│ └── IconTemplate@2x.png
└── src
├── index.js
├── main
│ └── index.js
└── renderer
├── index.html
└── index.js
You now run electron-packager to build the app for Windows:
`shell`
$ electron-packager . app --platform win32 --arch x64 --out dist/
And you end up with something like this in your dist folder:
``
.
└── dist
└── app-win32-x64
├── LICENSE
├── LICENSES.chromium.html
├── content_resources_200_percent.pak
├── content_shell.pak
├── d3dcompiler_47.dll
├── icudtl.dat
├── libEGL.dll
├── libGLESv2.dll
├── locales
├── msvcp120.dll
├── msvcr120.dll
├── natives_blob.bin
├── node.dll
├── pdf.dll
├── app.exe
├── resources
├── snapshot_blob.bin
├── ui_resources_200_percent.pak
├── vccorlib120.dll
├── version
└── xinput1_3.dll
How do you turn that into a Windows package that your users can install?
If you want to run electron-installer-windows straight from the command-line, install the package globally:
`shell`
$ npm install -g electron-installer-windows
And point it to your built app:
`shell`
$ electron-installer-windows --src dist/app-win32-x64/ --dest dist/installers/
You'll end up with the package at dist/installers/app-0.0.1-setup.exe.
If you want to run electron-installer-windows through npm, install the package locally:
`shell`
$ npm install --save-dev electron-installer-windows
Edit the scripts section of your package.json:
`json`
{
"name": "app",
"description": "An awesome app!",
"version": "0.0.1",
"scripts": {
"start": "electron .",
"build": "electron-packager . app --platform win32 --arch x64 --out dist/",
"setup": "electron-installer-windows --src dist/app-win32-x64/ --dest dist/installers/"
},
"devDependencies": {
"electron-installer-windows": "*",
"electron-packager": "*",
"electron-prebuilt": "*"
}
}
And run the script:
`shell`
$ npm run setup
You'll end up with the package at dist/installers/app-0.0.1-setup.exe.
Install the package locally:
`shell`
$ npm install --save-dev electron-installer-windows
And write something like this:
`javascript
const installer = require('electron-installer-windows')
const options = {
src: 'dist/app-win32-x64/',
dest: 'dist/installers/'
}
async function main (options) {
console.log('Creating package (this may take a while)')
try {
await installer(options)
console.log(Successfully created package at ${options.dest})`
} catch (err) {
console.error(err, err.stack)
process.exit(1)
}
}
main(options)
You'll end up with the package at dist/installers/app-0.0.1-setup.exe.
_Note: As of 2.0.0, the Node-style callback pattern is no longer available. You can use util.callbackify if this is required for your use case._
Even though you can pass most of these options through the command-line interface, it may be easier to create a configuration file:
`json`
{
"dest": "dist/installers/",
"icon": "resources/Icon.ico",
"tags": [
"Utility"
]
}
And pass that instead with the config option:
`shell`
$ electron-installer-windows --src dist/app-win32-x64/ --config config.json
Anyways, here's the full list of options:
#### src
Type: Stringundefined
Default:
The path to the folder that contains your built Electron application.
#### dest
Type: Stringundefined
Default:
The path to the folder that will contain your Windows installer.
#### rename
Type: Functionfunction (dest, src) { return path.join(dest, src); }
Default:
A function that renames all files generated by the task just before putting them in your dest folder.
#### options.name
Type: Stringpackage.name
Default:
Name of the package (e.g., atom), used in the id field of the nuspec file.
#### options.productName
Type: Stringpackage.productName || package.name
Default:
Name of the application (e.g., Atom), used in the title field of the nuspec file.
It is also used as the description when signing your msi installer.
#### options.exe
Type: String${package.name}.exe || electron.exe
Default:
Relative path to the executable created by Electron Packager. Note that Electron Packager uses package.productName as the default.
#### options.description
Type: Stringpackage.description
Default:
A description of the application, used in the description field of the nuspec file.
#### options.version
Type: Stringpackage.version
Default:
Long description of the application, used in the version field of the nuspec file.
#### options.copyright
Type: Stringpackage.copyright
Default:
Copyright details for the package, used in the copyright field of the nuspec file.
#### options.authors
Type: Array[String][package.author]
Default:
List of authors of the package, used in the authors field of the spec file.
#### options.owners
Type: Array[String][package.author]
Default:
List of owners of the package, used in the authors field of the spec file.
#### options.homepage
Type: Stringpackage.homepage || package.author.url
Default:
URL of the homepage for the package, used in the projectUrl field of the spec file.
#### options.animation
Type: Stringresources/animation.gif
Default:
The path to a .gif file to be displayed while installation is processing, used by Squirrel loading GIF
#### options.icon
Type: Stringresources/icon.ico
Default:
The path to an .ico file used for the generated .exe installer.
#### options.iconNuget
Type: Stringundefined
Default:
The path to an image file use as the icon for the NuGet package, used in the icon field of the spec file.
#### options.tags
Type: Array[String][]
Default:
List of tags and keywords that describe the package, used in the tags field of the spec file.
#### options.noMsi
Type: Booleanfalse
Default:
Whether an .msi installer should be created or not.
#### options.certificateFile
Type: Stringundefined
Default:
The path to an Authenticode Code Signing Certificate.
#### options.certificatePassword
Type: Stringundefined
Default:
Password to decrypt the certificate given in certificateFile.
#### options.signWithParams
Type: Stringundefined
Default:
Parameters to pass to signtool. Overrides certificateFile and certificatePassword.
#### options.remoteReleases
Type: Stringundefined
Default:
URL to your existing updates. If given, these will be downloaded to create delta updates.
If you are using Amazon S3 to store your releases, read the documentation for Squirrel.Windows on Amazon S3.
If you are using GitHub, read the documentation for Squirrel.Windows on GitHub.
Internet Explorer's SmartScreen Filter and antivirus programs may flag your package as malware if it's not signed. Luckily, signing your package with electron-installer-windows is pretty easy. Let's test the process with a self-signed certificate.
To generate the certificate, open the Developer Command Prompt for Visual Studio and execute the following:
`shell`
$ makecert -sv my_private_key.pvk -n "CN=MyTestCertificate" my_test_certificate.cer -b 01/01/2016 -e 01/01/2026 -r
$ pvk2pfx -pvk my_private_key.pvk -spc my_test_certificate.cer -pfx my_signing_key.pfx -po my_password
Now we can tell electron-installer-windows to sign the packages that it generates with that certificate:
`shell`
$ electron-installer-windows --src dist/app-win32-x64/ --dest dist/installers/ --certificateFile my_signing_key.pfx --certificatePassword my_password
Boom, that's it. Now get a standard code signing certificate from a real certificate authority!
To update Squirrel to the latest version, head over to the releases page
To update NuGet to the latest version, head over to the releases page.
* Code: git clone git://github.com/electron-userland/electron-installer-windows.git`
* Home:
* Daniel Perez Alvarez (unindented@gmail.com)
Copyright (c) 2016 Daniel Perez Alvarez (unindented.org). This is free software and may be redistributed under the terms specified in the LICENSE file.