From 5ead803d71287aca6a86af17e2ca31b5704f8b0b Mon Sep 17 00:00:00 2001 From: Feross Aboukhadijeh Date: Mon, 21 Mar 2016 20:19:09 -0700 Subject: [PATCH] OS X: Sign apps, build .DMG and .ZIP assets --- bin/package.js | 105 +++++++++++++++++++++++++++++++------------ config.js | 3 +- package.json | 2 + static/appdmg.png | Bin 0 -> 10258 bytes static/appdmg@2x.png | Bin 0 -> 22465 bytes 5 files changed, 81 insertions(+), 29 deletions(-) create mode 100644 static/appdmg.png create mode 100644 static/appdmg@2x.png diff --git a/bin/package.js b/bin/package.js index c72f8475..926a6703 100755 --- a/bin/package.js +++ b/bin/package.js @@ -10,18 +10,25 @@ var electronPackager = require('electron-packager') var fs = require('fs') var path = require('path') var pkg = require('../package.json') -var plist = require('plist') + +var BUILD_NAME = config.APP_NAME + '-v' + config.APP_VERSION function build () { var platform = process.argv[2] if (platform === '--darwin') { - buildDarwin() + buildDarwin(printDone) } else if (platform === '--win32') { - buildWin32() + buildWin32(printDone) } else if (platform === '--linux') { - buildLinux() + buildLinux(printDone) } else { - buildDarwin(() => buildWin32(() => buildLinux())) // Build all + buildDarwin(function (err, buildPath) { + printDone(err, buildPath) + buildWin32(function (err, buildPath) { + printDone(err, buildPath) + buildLinux(printDone) + }) + }) } } @@ -30,7 +37,7 @@ var all = { arch: 'x64', // The application source directory. - dir: path.join(__dirname, '..'), + dir: config.ROOT_PATH, // The release version of the application. Maps to the `ProductVersion` metadata // property on Windows, and `CFBundleShortVersionString` on OS X. @@ -58,7 +65,7 @@ var all = { name: config.APP_NAME, // The base directory where the finished package(s) are created. - out: path.join(__dirname, '..', 'dist'), + out: path.join(config.ROOT_PATH, 'dist'), // Replace an already existing output directory. overwrite: true, @@ -130,18 +137,15 @@ var linux = { build() function buildDarwin (cb) { - electronPackager(Object.assign({}, all, darwin), function (err, appPath) { - printDone(err, appPath) + var appDmg = require('appdmg') + var plist = require('plist') + var sign = require('electron-osx-sign') + + electronPackager(Object.assign({}, all, darwin), function (err, buildPath) { if (err) return cb(err) - var contentsPath = path.join( - __dirname, - '..', - 'dist', - `${config.APP_NAME}-darwin-x64`, - `${config.APP_NAME}.app`, - 'Contents' - ) + var appPath = path.join(buildPath[0], config.APP_NAME + '.app') + var contentsPath = path.join(appPath, 'Contents') var resourcesPath = path.join(contentsPath, 'Resources') var infoPlistPath = path.join(contentsPath, 'Info.plist') var infoPlist = plist.parse(fs.readFileSync(infoPlistPath, 'utf8')) @@ -178,25 +182,70 @@ function buildDarwin (cb) { fs.writeFileSync(infoPlistPath, plist.build(infoPlist)) cp.execSync(`cp ${config.APP_FILE_ICON + '.icns'} ${resourcesPath}`) - if (cb) cb(null) + var zipPath = path.join(buildPath[0], BUILD_NAME + '.zip') + cp.execSync(`zip -r -y ${zipPath} ${appPath}`) + + /* + * Signing OS X apps for distribution outside the App Store requires: + * + * - Xcode + * - Xcode Command Line Tools (xcode-select --install) + * - Membership in the Apple Developer Program + */ + if (process.platform === 'darwin') { + var signOpts = { + app: appPath, + platform: 'darwin', + verbose: true + } + + var dmgPath = path.join(buildPath[0], BUILD_NAME + '.dmg') + var dmgOpts = { + basepath: config.ROOT_PATH, + target: dmgPath, + specification: { + title: config.APP_NAME, + icon: config.APP_ICON + '.icns', + background: path.join(config.STATIC_PATH, 'appdmg.png'), + 'icon-size': 128, + contents: [ + { x: 122, y: 240, type: 'file', path: appPath }, + { x: 380, y: 240, type: 'link', path: '/Applications' }, + // Hide hidden icons out of view, for users who have hidden files shown. + // https://github.com/LinusU/node-appdmg/issues/45#issuecomment-153924954 + { x: 50, y: 500, type: 'position', path: '.background' }, + { x: 100, y: 500, type: 'position', path: '.DS_Store' }, + { x: 150, y: 500, type: 'position', path: '.Trashes' }, + { x: 200, y: 500, type: 'position', path: '.VolumeIcon.icns' } + ] + } + } + + sign(signOpts, function (err) { + if (err) return cb(err) + + var dmg = appDmg(dmgOpts) + dmg.on('error', cb) + dmg.on('progress', function (info) { + if (info.type === 'step-begin') console.log(info.title + '...') + }) + dmg.on('finish', function (info) { + cb(null, buildPath) + }) + }) + } }) } function buildWin32 (cb) { - electronPackager(Object.assign({}, all, win32), function (err, appPath) { - printDone(err, appPath) - if (cb) cb(err) - }) + electronPackager(Object.assign({}, all, win32), cb) } function buildLinux (cb) { - electronPackager(Object.assign({}, all, linux), function (err, appPath) { - printDone(err, appPath) - if (cb) cb(err) - }) + electronPackager(Object.assign({}, all, linux), cb) } -function printDone (err, appPath) { +function printDone (err, buildPath) { if (err) console.error(err.message || err) - else console.log('Built ' + appPath) + else console.log('Built ' + buildPath[0]) } diff --git a/config.js b/config.js index 7ed1458f..51031da4 100644 --- a/config.js +++ b/config.js @@ -9,8 +9,9 @@ module.exports = { APP_FILE_ICON: path.join(__dirname, 'static', 'WebTorrentFile'), APP_ICON: path.join(__dirname, 'static', 'WebTorrent'), APP_NAME: APP_NAME, + APP_VERSION: APP_VERSION, - AUTO_UPDATE_URL: 'https://webtorrent.io/app/updates?version=' + APP_VERSION, + AUTO_UPDATE_URL: 'https://webtorrent.io/app/update?version=' + APP_VERSION, AUTO_UPDATE_CHECK_STARTUP_DELAY: 60 * 1000 /* 1 minute */, CONFIG_PATH: applicationConfigPath(APP_NAME), diff --git a/package.json b/package.json index fef479c6..a3fa6bad 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ "winreg": "^1.0.1" }, "devDependencies": { + "appdmg": "^0.3.6", + "electron-osx-sign": "^0.3.0", "electron-packager": "^5.0.0", "electron-prebuilt": "0.37.2", "path-exists": "^2.1.0", diff --git a/static/appdmg.png b/static/appdmg.png new file mode 100644 index 0000000000000000000000000000000000000000..023e71303e19915f587f398837ed2de89b5e19be GIT binary patch literal 10258 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