mirror of
https://github.com/Llewellynvdm/nativefier.git
synced 2024-09-30 05:09:05 +00:00
breaking change. allow building apps for other platforms
This commit is contained in:
parent
f9fdb45d09
commit
260a16509b
10
cli.js
10
cli.js
@ -1,6 +1,8 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
var fs = require('fs')
|
||||||
var args = require('minimist')(process.argv.slice(2), {boolean: ['prune', 'asar']})
|
var args = require('minimist')(process.argv.slice(2), {boolean: ['prune', 'asar']})
|
||||||
var packager = require('./')
|
var packager = require('./')
|
||||||
|
var usage = fs.readFileSync(__dirname + '/usage.txt').toString()
|
||||||
|
|
||||||
args.dir = args._[0]
|
args.dir = args._[0]
|
||||||
args.name = args._[1]
|
args.name = args._[1]
|
||||||
@ -14,14 +16,14 @@ if (protocolSchemes && protocolNames && protocolNames.length === protocolSchemes
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!args.dir || !args.name) {
|
if (!args.dir || !args.name || !args.platform || !args.arch || !args.version) {
|
||||||
console.error('Usage: electron-packager <sourcedir> <Appname>')
|
console.error(usage)
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
console.log('args', args)
|
|
||||||
packager(args, function done (err, appPath) {
|
packager(args, function done (err, appPath) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error(err.stack)
|
console.error(err, err.stack)
|
||||||
process.exit(1)
|
process.exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
61
index.js
61
index.js
@ -1,31 +1,48 @@
|
|||||||
var os = require('os')
|
|
||||||
var path = require('path')
|
var path = require('path')
|
||||||
|
var os = require('os')
|
||||||
|
|
||||||
|
var download = require('electron-download')
|
||||||
|
var extract = require('extract-zip')
|
||||||
|
var mkdirp = require('mkdirp')
|
||||||
|
var rimraf = require('rimraf')
|
||||||
|
|
||||||
|
var mac = require('./mac.js')
|
||||||
|
var linux = require('./linux.js')
|
||||||
|
var win32 = require('./win32.js')
|
||||||
|
|
||||||
module.exports = function packager (opts, cb) {
|
module.exports = function packager (opts, cb) {
|
||||||
var electronPath
|
var packager
|
||||||
var platform
|
var platform = opts.platform
|
||||||
|
var arch = opts.arch
|
||||||
|
var version = opts.version
|
||||||
|
|
||||||
try {
|
if (!platform || !arch || !version) cb(new Error('Must specify platform, arch and version'))
|
||||||
electronPath = require.resolve('electron-prebuilt')
|
|
||||||
electronPath = path.join(electronPath, '..')
|
|
||||||
} catch (e) {
|
|
||||||
try {
|
|
||||||
electronPath = require.resolve(path.join(process.execPath, '../../lib/node_modules/electron-prebuilt'))
|
|
||||||
electronPath = path.join(electronPath, '..')
|
|
||||||
} catch (e) {
|
|
||||||
cb(new Error('Cannot find electron-prebuilt from here, please install it from npm'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var electronPkg = require(path.join(electronPath, 'package.json'))
|
switch (platform) {
|
||||||
console.error('Using electron-prebuilt version', electronPkg.version, 'from', electronPath)
|
case 'darwin': packager = mac; break
|
||||||
|
case 'linux': packager = linux; break
|
||||||
switch (os.platform()) {
|
case 'win32': packager = win32; break
|
||||||
case 'darwin': platform = require('./mac'); break
|
|
||||||
case 'linux': platform = require('./linux'); break
|
|
||||||
case 'win32': platform = require('./windows'); break
|
|
||||||
default: cb(new Error('Unsupported platform'))
|
default: cb(new Error('Unsupported platform'))
|
||||||
}
|
}
|
||||||
|
|
||||||
platform.createApp(opts, cb, electronPath)
|
download({
|
||||||
|
platform: platform,
|
||||||
|
arch: arch,
|
||||||
|
version: version
|
||||||
|
}, function (err, zipPath) {
|
||||||
|
if (err) return cb(err)
|
||||||
|
console.error('Packaging app for platform', platform + ' ' + arch, 'using electron v' + version)
|
||||||
|
// extract zip into tmp so that packager can use it as a template
|
||||||
|
var tmpDir = path.join(os.tmpdir(), 'electron-packager-' + platform + '-template')
|
||||||
|
rimraf(tmpDir, function (err) {
|
||||||
|
if (err) {} // ignore err
|
||||||
|
mkdirp(tmpDir, function (err) {
|
||||||
|
if (err) return cb(err)
|
||||||
|
extract(zipPath, {dir: tmpDir}, function (err) {
|
||||||
|
if (err) return cb(err)
|
||||||
|
packager.createApp(opts, tmpDir, cb)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
12
linux.js
12
linux.js
@ -7,9 +7,8 @@ var rimraf = require('rimraf')
|
|||||||
var asar = require('asar')
|
var asar = require('asar')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createApp: function createApp (opts, cb, electronPath) {
|
createApp: function createApp (opts, templateApp, cb) {
|
||||||
var templateApp = path.join(electronPath, 'dist')
|
var finalDir = opts.out || path.join(process.cwd(), opts.name + '-linux')
|
||||||
var finalDir = opts.out || path.join(process.cwd(), 'dist')
|
|
||||||
var userAppDir = path.join(finalDir, 'resources', 'default_app')
|
var userAppDir = path.join(finalDir, 'resources', 'default_app')
|
||||||
var originalBinary = path.join(finalDir, 'electron')
|
var originalBinary = path.join(finalDir, 'electron')
|
||||||
var finalBinary = path.join(finalDir, opts.name)
|
var finalBinary = path.join(finalDir, opts.name)
|
||||||
@ -48,7 +47,7 @@ module.exports = {
|
|||||||
if (opts.asar) {
|
if (opts.asar) {
|
||||||
asarApp(cb)
|
asarApp(cb)
|
||||||
} else {
|
} else {
|
||||||
cb()
|
cb(null, finalBinary)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -78,7 +77,10 @@ module.exports = {
|
|||||||
var dest = path.join(finalDir, 'resources', 'app.asar')
|
var dest = path.join(finalDir, 'resources', 'app.asar')
|
||||||
asar.createPackage(src, dest, function (err) {
|
asar.createPackage(src, dest, function (err) {
|
||||||
if (err) return cb(err)
|
if (err) return cb(err)
|
||||||
rimraf(src, cb)
|
rimraf(src, function (err) {
|
||||||
|
if (err) return cb(err)
|
||||||
|
cb(null, dest)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
mac.js
4
mac.js
@ -10,8 +10,8 @@ var ncp = require('ncp').ncp
|
|||||||
var asar = require('asar')
|
var asar = require('asar')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createApp: function createApp (opts, cb, electronPath) {
|
createApp: function createApp (opts, electronPath, cb) {
|
||||||
var electronApp = path.join(electronPath, 'dist', 'Electron.app')
|
var electronApp = path.join(electronPath, 'Electron.app')
|
||||||
var tmpDir = path.join(os.tmpdir(), 'electron-packager-mac')
|
var tmpDir = path.join(os.tmpdir(), 'electron-packager-mac')
|
||||||
|
|
||||||
var newApp = path.join(tmpDir, opts.name + '.app')
|
var newApp = path.join(tmpDir, opts.name + '.app')
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "electron-packager",
|
"name": "electron-packager",
|
||||||
"version": "3.4.0",
|
"version": "3.4.0",
|
||||||
"description": "package and distribute your electron app in OS executables (.app, .exe, etc) via JS or CLI",
|
"description": "package your electron app in OS executables (.app, .exe, etc) via JS or CLI",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
"electron-packager": "cli.js"
|
"electron-packager": "cli.js"
|
||||||
@ -18,6 +18,8 @@
|
|||||||
"homepage": "https://github.com/maxogden/electron-packager",
|
"homepage": "https://github.com/maxogden/electron-packager",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"asar": "^0.6.1",
|
"asar": "^0.6.1",
|
||||||
|
"electron-download": "^1.0.0",
|
||||||
|
"extract-zip": "^1.0.3",
|
||||||
"minimist": "^1.1.1",
|
"minimist": "^1.1.1",
|
||||||
"mkdirp": "^0.5.0",
|
"mkdirp": "^0.5.0",
|
||||||
"mv": "^2.0.3",
|
"mv": "^2.0.3",
|
||||||
|
47
readme.md
47
readme.md
@ -1,6 +1,6 @@
|
|||||||
# electron-packager
|
# electron-packager
|
||||||
|
|
||||||
Build a distributable app from an electron app source code directory. **Currently only Mac OS and Linux are implemented** but you can send PRs to implement windows :)
|
Package your electron app in OS executables (.app, .exe, etc) via JS or CLI. Supports building Windows, Linux or Mac executables.
|
||||||
|
|
||||||
*formerly known as atom-shell-packager*
|
*formerly known as atom-shell-packager*
|
||||||
|
|
||||||
@ -8,8 +8,6 @@ Build a distributable app from an electron app source code directory. **Currentl
|
|||||||
|
|
||||||
[![Build Status](https://travis-ci.org/maxogden/electron-packager.svg?branch=master)](https://travis-ci.org/maxogden/electron-packager)
|
[![Build Status](https://travis-ci.org/maxogden/electron-packager.svg?branch=master)](https://travis-ci.org/maxogden/electron-packager)
|
||||||
|
|
||||||
For an example project using this, check out [Monu](https://github.com/maxogden/monu)
|
|
||||||
|
|
||||||
### installation
|
### installation
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -18,35 +16,38 @@ npm i electron-packager --save-dev
|
|||||||
|
|
||||||
# for use from cli
|
# for use from cli
|
||||||
npm i electron-packager -g
|
npm i electron-packager -g
|
||||||
|
|
||||||
# you also need electron installed
|
|
||||||
npm i electron-prebuilt
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### usage
|
### usage
|
||||||
|
|
||||||
```
|
```
|
||||||
$ electron-packager my-app-source-dir AppName
|
Usage: electron-packager <sourcedir> <appname> --platform=<platform> --arch=<arch> --version=<version>
|
||||||
|
|
||||||
|
Required options
|
||||||
|
|
||||||
|
platform linux, win32, darwin
|
||||||
|
arch ia32, x64
|
||||||
|
version see https://github.com/atom/electron/releases
|
||||||
|
|
||||||
|
Example electron-packager ./ FooBar --platform=darwin --arch=x64 --version=0.25.1
|
||||||
|
|
||||||
|
Optional options
|
||||||
|
|
||||||
|
out the dir to put the app into at the end. defaults to current working dir
|
||||||
|
icon the icon file to use as the icon for the app
|
||||||
|
app-bundle-id bundle identifier to use in the app plist
|
||||||
|
app-version version to set for the app
|
||||||
|
helper-bundle-id bundle identifier to use in the app helper plist
|
||||||
|
ignore do not copy files into App whose filenames regex .match this string
|
||||||
|
prune runs `npm prune --production` on the app
|
||||||
|
asar packages the source code within your app into an archive
|
||||||
```
|
```
|
||||||
|
|
||||||
This will:
|
This will:
|
||||||
|
|
||||||
- Find the closest local version of `electron` installed (using `require.resolve`)
|
- Find or download the correct release of Electron
|
||||||
- Use that version of electron to create a Mac app in `cwd` called `AppName.app`
|
- Use that version of electron to create a app in `cwd` named using `appname` for the platform you specified
|
||||||
|
|
||||||
You should be able to double-click `AppName.app` to launch the app. If not, check your settings and try again.
|
You should be able to launch the app on the platform you built for. If not, check your settings and try again.
|
||||||
|
|
||||||
**Be careful** not to include node_modules you don't want into your final app. For example, do not include the `node_modules/electron-packager` folder or `node_modules/electron-prebuilt`. You can use `--ignore=node_modules/electron-prebuilt` to ignore of these
|
**Be careful** not to include node_modules you don't want into your final app. For example, do not include the `node_modules/electron-packager` folder or `node_modules/electron-prebuilt`. You can use `--ignore=node_modules/electron-prebuilt` to ignore of these
|
||||||
|
|
||||||
### options
|
|
||||||
|
|
||||||
these are optional CLI options you can pass in
|
|
||||||
|
|
||||||
- `out` (default current working dir) - the dir to put the app into at the end
|
|
||||||
- `icon` - the icon file to use as the icon for the app
|
|
||||||
- `app-bundle-id` - bundle identifier to use in the app plist
|
|
||||||
- `app-version` - version to set for the app
|
|
||||||
- `helper-bundle-id` - bundle identifier to use in the app helper plist
|
|
||||||
- `ignore` (default none) - do not copy files into App whose filenames regex .match this string
|
|
||||||
- `prune` - runs `npm prune --production` on the app
|
|
||||||
- `asar` - packages the source code within your app into an archive
|
|
||||||
|
20
usage.txt
Normal file
20
usage.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Usage: electron-packager <sourcedir> <appname> --platform=<platform> --arch=<arch> --version=<version>
|
||||||
|
|
||||||
|
Required options
|
||||||
|
|
||||||
|
platform linux, win32, darwin
|
||||||
|
arch ia32, x64
|
||||||
|
version see https://github.com/atom/electron/releases
|
||||||
|
|
||||||
|
Example electron-packager ./ FooBar --platform=darwin --arch=x64 --version=0.25.1
|
||||||
|
|
||||||
|
Optional options
|
||||||
|
|
||||||
|
out the dir to put the app into at the end. defaults to current working dir
|
||||||
|
icon the icon file to use as the icon for the app
|
||||||
|
app-bundle-id bundle identifier to use in the app plist
|
||||||
|
app-version version to set for the app
|
||||||
|
helper-bundle-id bundle identifier to use in the app helper plist
|
||||||
|
ignore do not copy files into App whose filenames regex .match this string
|
||||||
|
prune runs `npm prune --production` on the app
|
||||||
|
asar packages the source code within your app into an archive
|
@ -10,18 +10,16 @@ var mv = require('mv')
|
|||||||
var rcedit = require('rcedit')
|
var rcedit = require('rcedit')
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createApp: function createApp (opts, cb, electronPath) {
|
createApp: function createApp (opts, electronApp, cb) {
|
||||||
var electronApp = path.join(electronPath, 'dist')
|
|
||||||
var tmpDir = path.join(os.tmpdir(), 'electron-packager-windows')
|
var tmpDir = path.join(os.tmpdir(), 'electron-packager-windows')
|
||||||
|
|
||||||
var newApp = path.join(tmpDir, opts.name + '.app')
|
var newApp = path.join(tmpDir, opts.name + '-win32')
|
||||||
console.log('newApp', newApp)
|
|
||||||
// reset build folders + copy template app
|
// reset build folders + copy template app
|
||||||
rimraf(tmpDir, function rmrfd () {
|
rimraf(tmpDir, function rmrfd () {
|
||||||
// ignore errors
|
// ignore errors
|
||||||
mkdirp(newApp, function mkdirpd () {
|
mkdirp(newApp, function mkdirpd () {
|
||||||
// ignore errors
|
// ignore errors
|
||||||
// copy .app folder and use as template (this is exactly what Atom editor does)
|
// copy app folder and use as template (this is exactly what Atom editor does)
|
||||||
ncp(electronApp, newApp, function copied (err) {
|
ncp(electronApp, newApp, function copied (err) {
|
||||||
if (err) return cb(err)
|
if (err) return cb(err)
|
||||||
// rename electron.exe
|
// rename electron.exe
|
||||||
@ -82,8 +80,7 @@ function buildWinApp (opts, cb, newApp) {
|
|||||||
|
|
||||||
function moveApp () {
|
function moveApp () {
|
||||||
// finally, move app into cwd
|
// finally, move app into cwd
|
||||||
var finalPath = path.join(opts.out || process.cwd(), opts.name + '.app')
|
var finalPath = path.join(opts.out || process.cwd(), opts.name + '-win32')
|
||||||
console.log('finalPath', finalPath)
|
|
||||||
copy(newApp, finalPath, function moved (err) {
|
copy(newApp, finalPath, function moved (err) {
|
||||||
if (err) return cb(err)
|
if (err) return cb(err)
|
||||||
if (opts.asar) {
|
if (opts.asar) {
|
||||||
@ -98,13 +95,13 @@ function buildWinApp (opts, cb, newApp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updateIcon () {
|
function updateIcon () {
|
||||||
var finalPath = path.join(opts.out || process.cwd(), opts.name + '.app')
|
var finalPath = path.join(opts.out || process.cwd(), opts.name + '-win32')
|
||||||
|
|
||||||
if (!opts.icon) {
|
if (!opts.icon) {
|
||||||
return cb(null, finalPath)
|
return cb(null, finalPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
var exePath = path.join(opts.out || process.cwd(), opts.name + '.app', opts.name + '.exe')
|
var exePath = path.join(opts.out || process.cwd(), opts.name + '-win32', opts.name + '.exe')
|
||||||
|
|
||||||
rcedit(exePath, {icon: opts.icon}, function (err) {
|
rcedit(exePath, {icon: opts.icon}, function (err) {
|
||||||
cb(err, finalPath)
|
cb(err, finalPath)
|
||||||
@ -113,7 +110,7 @@ function buildWinApp (opts, cb, newApp) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function asarApp (cb) {
|
function asarApp (cb) {
|
||||||
var finalPath = path.join(opts.out || process.cwd(), opts.name + '.app', 'resources')
|
var finalPath = path.join(opts.out || process.cwd(), opts.name + '-win32', 'resources')
|
||||||
var src = path.join(finalPath, 'app')
|
var src = path.join(finalPath, 'app')
|
||||||
var dest = path.join(finalPath, 'app.asar')
|
var dest = path.join(finalPath, 'app.asar')
|
||||||
asar.createPackage(src, dest, function (err) {
|
asar.createPackage(src, dest, function (err) {
|
Loading…
Reference in New Issue
Block a user