±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½²½âÈçºÎÔÚMac
OSX 10.11 ÉÏÖ´ÐвÙ×÷½øÐÐElectron Ó¦ÓÃʵÏÖ×Ô¶¯¸üУ¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚSegmentFault,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
ͨ¹ý Electron£¬Äã¿ÉÄÜÖ»ÐèÒ»Õ£ÑÛµÄʱ¼ä¾ÍÍê³ÉÁËÒ»¸ö²»´íµÄ×ÀÃæÓ¦Ó㬲¢·Ö·¢µ½Óû§ÊÖÖС£µ±Äã¾õµÃ×Ô¼ºÄÜÏñÒ»¸ö½ÄÐҵϵµ°Ò»ÑùÇáËÉʱ£¬Äã¿ÉÄÜ»áÒâʶµ½ÄãÒÅ©ÁËÒ»¸öÖØÒªµÄµã£ºÓû§ÈçºÎ»ñÈ¡ÏÂÒ»¸ö°æ±¾ÄØ£¿ÉõÖÁ¸Ãа汾ÐÂÔöÁËһЩÓÅÐãµÄ¹¦ÄÜ¡£µ±È»£¬ËûÃÇÄÜɾ³ýºóÔÙÖØÐ°²×°¸ÃÓ¦Ó㬵«ÕâÄѵÀ²»õ¿½ÅÂð£¿
¿ìËÙä¯ÀÀ Electron Îĵµ ʱ£¬Äã»á×¢Òâµ½¸ÃÎĵµÖк¬ÓÐ auto-updater Ä£¿é£¬Ëü½ö½öÊÇÁíÒ»¸ö¿ò¼Ü¡ª¡ªSquirrel
µÄ½Ó¿Ú¡£Squirrel »áÔÚ±³ºó¼ì²â£¨»òÄãÖ÷¶¯´¥·¢£©ÊÇ·ñÓÐа汾¡¢ÏÂÔØÐ°汾£¬²¢ÔÚÄãÆô¶¯»òÖØÆôÓ¦ÓÃʱ×Ô¶¯¸üÐÂÓ¦Óá£
µ«±¯É˵ÄÊÇ£ºÊµ¼ÊʵÏÖÆðÀ´²¢²»ÊÇÎĵµÉÏдµÄÕâô¼òµ¥¡£ÒòΪ×Ô¶¯¸üÐÂÔÚ OSX ºÍ Windows ÉϵŤ×÷·½Ê½²¢²»Ïàͬ£¨Ä¿Ç°²¢²»Ö§³Ö
Linux£©£¬²¢ÇÒÕâÁ½ÕßµÄÎĵµÊÇ·ÖÉ¢ÔÚ¶à¸ö¿â£¨repository£©ÖС£ÎÒÒѾ»¨·ÑÁË´óÁ¿µÄʱ¼ä°Ñ¸Ã¹¦ÄÜʵÏÖÁË¡£ËùÒÔÎÒ¾õµÃ½«ÎÒËùѧϰµ½µÄ֪ʶ×ܽá³Éһƪ½Ì³ÌÊÇÖµµÃµÄ£¬Ï£ÍûËüÄܽÚÊ¡ÄãµÄʱ¼ä¡£
ËäÈ»ÕâÀïËù½²µÄÒ»ÇÐÓ¦¸Ã¾ùÄÜÔÚ Windows ºÍ OSX ÉÏÔËÐУ¬µ«ÎªÁ˼õÉÙÒìÒ飬ÎÒÏÈÉùÃ÷ÎÒÊÇÔÚ
Mac OSX 10.11 ÉÏÖ´ÐеIJÙ×÷£¬³ýÁËΪ Windows ϵͳ¹¹½¨°²×°°ü£¨ÔÚÐéÄâ»úÉÏ£©¡£
Ó¦Óôò°ü
ÔÚʵÏÖ×Ô¶¯¸üÐÂ֮ǰ£¬ÓÐÒ»¸öÖØÒªµÄ²½Öè ¡ª¡ª ´ò°ü¡£ÎÒ¼ÙÉè´ó¶àÊýÈËÒѾ֪µÀÈçºÎͨ¹ý electron-packager
ʵÏָòÙ×÷£¬µ«ÓÐÁ½¼þÊÂÊÇʱ³£±»ºöÂԵġ£
{ "name":
"MyApp", "main": "app.js",
"private": true, "productName":
"MyApp", "version":
"1.0.0", "author": "My
Company Ltd", "description":
"MyApp", "devDependencies":
{ "electron-installer-squirrel-windows":
"^1.3.0", "electron-packager":
"^5.1.1", "electron-prebuilt":
"0.36.7"
}, "scripts": { "start":
"NODE_ENV=development ./node_modules/.bin/electron
.", "pack:osx": "./node_modules/.bin/electron-packager
. $npm_package_productName --app-version=$npm_package_version
--version=0.36.7 --out=builds --ignore='^/builds$'
--platform=darwin --arch=x64 --sign='Developer
ID Application: My Company Ltd (ABCDEFGH10)'
--icon=icon.icns --overwrite", "pack:win":
"./node_modules/.bin/electron-packager
. $npm_package_productName --app-version=$npm_package_version
--version=0.36.7 --out=builds --ignore='^/builds$'
--platform=win32 --arch=ia32 --version-string.CompanyName='My
Company Ltd' --version-string.LegalCopyright='Copyright
(C) 2016 My Company Ltd' --version-string.FileDescription=$npm_package_productName
--version-string.OriginalFilename='MyApp.exe'
--version-string.InternalName=$npm_package_productName
--version-string.ProductName=$npm_package_productName
--version-string.ProductVersion=$npm_package_version
--asar=true --icon=logo.ico --overwrite"
}
} |
package.json
×¢Òâ package.json µÄ¶îÍâ×Ö¶Î ¡ª¡ª productName¡¢author ºÍ description£¬ËäÈ»Õ⼸¸ö×ֶβ¢²»ÊÇ´ò°ü±Ø±¸µÄ£¬µ«ËüÃÇ»áÔÚ
Windows µÄ Squirrel °²×°°üÖÐʹÓõ½¡£
ΪӦÓÃÖ´ÐдúÂëÇ©Ãû£¨Code-signing£©µÄÕⲿ²Ù×÷²¢²»ÊÇ×Ô¶¯¸üеıر¸²½Ö裨ÒëÕß×¢£ºÒ²Ðí×÷Õßµ±Ê±µÄ
Electron °æ±¾µÄ×Ô¶¯¸üÐÂÄ£¿é²»±Ø½øÐдúÂëÇ©Ãû£¬µ«µ±Ç°°æ±¾ÊDZØÐëÒª½øÐÐÕⲿ²Ù×÷µÄ£¬¹Ù·½ÎĵµÖÐдµÀ£ºYour
application must be signed for automatic updates on
macOS. This is a requirement of Squirrel.Mac. £©£¬µ«ÕâÊǷdz£¿ÉÈ¡µÄ²Ù×÷¡£¶ÔÓÚ
OSX£¬ÄãÐèÒªÒ»¸ö Apple µÄ¿ª·¢ÕßÈÏÖ¤£¬È»ºóÔÚ script ×Ö¶ÎµÄ pack:osx Ìæ»»ÒÔϲÎÊý¼´¿É£º
--sign='Developer
ID Application: My Company Ltd (ABCDEFGH10)' |
ÔÚ OSX ÖУ¬Äã¿ÉÒÔͨ¹ý Keychain Access > My Certificates
²é¿´£¨Ó¦ÓóÌÐò -> Ô¿³×´® > ÎÒµÄÖ¤Ê飬Èç¹ûÓеϰ£©¡£
ÎÒ²¢Ã»ÓÐÔÚ Windows ÉÏÖ´ÐдúÂëÇ©ÃûÕâÏî²Ù×÷£¬µ«Äã¿ÉÒÔ¿´¿´¸ÃÖ÷ÌâÏà¹ØµÄÓÅÐã½Ì³Ì¡£
¶ÔÓÚ Windows£¬ÍƼöΪ electron-packager ´«µÝ version-string
µÄËùÓпÉÑ¡²ÎÊý£¬Èç company name¡¢product name µÈ¡£ÒòΪһµ©ÎÒÃÇÉú³É Windows
µÄ Squirrel °²×°°ü£¬¸ÃÓ¦ÓþÍÄÜÔÚ Windows µÄ¡º¿ªÊ¼¡»²Ëµ¥ÏÔʾÕýÈ·µÄÔªÐÅÏ¢£¨metadata£©£¬¶ø²»ÊÇ
Atom µÄĬÈÏÐÅÏ¢¡£
Atom Shell is now called Electron¡£
ËùÒÔ£¬ÈÃÎÒÃÇ¿ªÊ¼°É£¡
OSX
ÔÚ OSX ÖУ¬×Ô¶¯¸üÐÂÊÇͨ¹ý Squirrel.Mac ´¦ÀíµÄ£¬ËüÊÇÄÚÖÃÓÚ Electron ÖС£ÕâÒâζ×ÅÄãÖ»Ðè´ò°üÄãµÄÓ¦Óã¬È»ºóÕÕ³£ÔËÐоͺã¡
¶÷£¬Æäʵ²»ÍêÈ«ÊÇ¡£
Squirrel.Mac µÄ¹¤×÷·½Ê½ÊÇͨ¹ý·ÃÎÊÒ»¸öÄãËùÌṩµÄ API ¡ºÂ·¾¶¡»£¨endpoint£©£¬ÅжÏÊÇ·ñÓÐа汾¡£Èç¹ûûÓÐа汾£¬ÄÇô¸Ã·¾¶Ó¦¸Ã·µ»Ø
HTTP 204¡£Èç¹ûÓÐа汾£¬ÔòËü»áÆÚ´ý½ÓÊÕÒ»¸ö HTTP 200¡¢ÇÒÊÇ JSON ¸ñʽ µÄÏìÓ¦£¬ÆäÖаüº¬Ò»¸ö
ÄÜ»ñÈ¡ .zip ÎļþµÄ url¡£
PS£º¡ºÂ·¾¶¡»ÓÖ³Æ"ÖÕµã"£¨endpoint£©£¬±íʾAPIµÄ¾ßÌåÍøÖ·¡£
{ "url":
"http://mysite.com/path/to/zip/MyApp.zip"
} |
Ôڵõ½¸Ã url ºó£¬Squirrel »á¹¹ÔìÒ»¸ö application/zip µÄÇëÇóÈ¥·ÃÎʸÃ
url£¬ÏÂÔØÏàÓ¦Îļþ£¬È»ºó´¥·¢×îÖÕʼþ£¨ÏÂÔØÍê³É£©ÈÃÄãÖªµÀ¸üаü¼´½«°²×°¡£¶ÔÓÚÄãÀ´Ëµ£¬ËùÓÐÊÂÇéµÄ´¦Àí¶¼ÊÇ×Ô¶¯»¯µÄ¡£
Èç¹ûÄ㲻ʮ·ÖÈ·¶¨·þÎñÆ÷³ÌÐòÓ¦¸Ã³¤Ê²Ã´Ñù£¬¿É¿´¿´ÏÂÃæµÄÒ»¸ö³¬¼¶Ð¡Ð굀 Node.js/Express
·þÎñ£¬¼Ù¶¨ËüµÄĿ¼½á¹¹ÈçÏ£º
©¸©¤©¤ releases
©À©¤©¤ darwin
©¦ ©À©¤©¤ 1.0.0
©¦ ©À©¤©¤ 1.0.2
©¦ ©¸©¤©¤ 1.0.3
©¸©¤©¤ win32 |
{ "name":
"squirrel-version-checker", "version":
"0.0.0", "private":
true, "scripts": { "start":
"PORT=80 node app.js", "dev":
"./node_modules/.bin/nodemon app.js"
}, "dependencies": { "express":
"^4.9.8", "morgan":
"^1.3.2"
}, "devDependencies": { "nodemon":
"^1.8.1"
}
} |
»ùÓÚ Node µÄ¸üзþÎñ package.json
'use strict';
const fs = require('fs');
const express = require('express');
const path = require('path');
const app = express();
app.use(require('morgan')('dev')); app.use('/updates/releases', express.static(path.join(__dirname,
'releases'))); app.get('/updates/latest', (req, res) =>
{
const latest = getLatestRelease();
const clientVersion = req.query.v;
if (clientVersion === latest) {
res.status(204).end();
} else {
res.json({
url: `${getBaseUrl()}/releases/darwin/${latest}/MyApp.zip`
});
}
}); let getLatestRelease = () => {
const dir = `${__dirname}/releases/darwin`; const versionsDesc = fs.readdirSync(dir).filter((file)
=> {
const filePath = path.join(dir, file);
return fs.statSync(filePath).isDirectory();
}).reverse(); return versionsDesc[0];
} let getBaseUrl = () => {
if (process.env.NODE_ENV === 'development')
{
return 'http://localhost:3000';
} else {
return 'http://download.mydomain.com'
}
} app.listen(process.env.PORT, () => {
console.log(`Express server listening on port
${process.env.PORT}`);
}); |
Ò»¸ö¼òµ¥µØ¡¢ÓÃÓÚ²âÊÔ Squirrel.Mac ×Ô¶¯¸üÐ嵀 Express ·þÎñÆ÷
Õ⽫»á´Ó±¾µØµÄÎļþϵͳ½øÐзַ¢Îļþ£¬µ«Õâ²»ÊÇÀíÏëµÄ´¦Àí·½Ê½¡£ÎҵĽ¨ÒéÊÇ£º½«ÕâЩÎļþ·ÅÖÃÔÚ Amazon
S3¡£
Amazon S3£ºAmazon
Simple Storage Service |
È»ºóÄã¿ÉÒÔÔÚ¿ª·¢»·¾³Ï£¬Í¨¹ý Electron ·ÃÎʸ÷¾¶£º
http://localhost:3000/updates/latest?v=1.0.1 |
?v=1.0.1 ÊÇÄ㵱ǰӦÓõİ汾¡£
ÏÖÔÚÄãÒѾӵÓÐÁË·þÎñÆ÷³ÌÐòºÍ·¾¶ÁË£¬ÄÇôÔÚÓ¦ÓÃÖд¦Àí¸üвÙ×÷¾ÍÊ®·Ö¼òµ¥ÁË¡£
ÔÚ Electron µÄÖ÷½ø³ÌÎļþÖУ¬ÒýÈë auto-updater Ä£¿é£¬È»ºó»ñÈ¡µ±Ç°ÏµÍ³ºÍÓ¦Óõİ汾£º
const autoUpdater
= require('auto-updater');
const appVersion = require('./package.json').version;
const os = require('os').platform(); |
È»ºóÅäÖ÷¾¶£¬¸Ã·¾¶»áÒòϵͳ£¨Windows ºÍ Mac£©²»Í¬¶øÓÐËù²îÒ죨ÖÁÓÚÔÒò£¬»áÔÚ Windows
Õ½ڿ´µ½£©£º
var updateFeed
= 'http://localhost:3000/updates/latest';
if (process.env.NODE_ENV !== 'development')
{
updateFeed = os === 'darwin' ?
'https://mysite.com/updates/latest' :
'http://download.mysite.com/releases/win32';
} autoUpdater.setFeedURL(updateFeed + '?v='
+ appVersion); |
¸æËß Electron µ½ÄÄÀï¼ì²âа汾
autoUpdater Ä£¿éÌṩÁËһЩʼþ£¬Äã¿Éͨ¹ýäÖȾ½ø³Ì´¥·¢ËüÃÇ£¨ÒëÕß×¢£ºÍ¨¹ý IPC ͨѶģ¿é£©£¬Ïë»ñÈ¡¸ü¶àÐÅÏ¢£¬¿É²éÔÄ
auto-Updater ÎĵµÒ³Ãæ ¡£Ïà¹Ø½»»¥µÄʵÏÖ¾ö¶¨È¡¾öÓÚÄãÈçºÎ´¦ÀíÕâЩʼþ£¨Èç·¢Éú´íÎóµÈ£©£¬²¢Í¨ÖªÓû§¡£µ«Äã×îºóÒ»²½Ó¦¸Ã×öµÄÊÇ£º
autoUpdater.quitAndInstall(); |
½«ÉÏÊöÓï¾ä·ÅÔÚÖ÷½ø³ÌÎļþºó£¬Ó¦ÓûáÒÔб¾°æµÄÐÎÊ½ÖØÆô¡£ÔÞ£¡
Windows
ÈçÄãÏëÏóµÄÄÇÑù£¬ÔÚ Windows ÉÏʵÏÖ×Ô¶¯¸üÐÂÊÇͨ¹ý Squirrel.Windows¡£µ«ËüµÄ´¦Àí·½Ê½Óë
OSX ÍêÈ«²»Í¬¡£
Óë Squirrel.Mac ²»Í¬µÄµãÔÚÓÚ£ºSquirrel.Windows ²¢²»ÐèÒªÒ»¸öÓÃÓÚ¼ì²âа汾µÄ
API ·¾¶£¬ËüÐèÒªµÄÊÇÒ»¸öÎļþ·þÎñÆ÷£¬ËùÒÔÄã¿ÉÒÔ¼òµ¥µØ½«ÎļþÍÏ×§µ½ Amazon S3 bucket
ÉÏ¡£ÁíÍ⣬¸Ã Squirrel ¸üÐÂÆ÷²¢²»ÄÚÖÃÓÚ Electron£¬ËüÊÇÒ»¸öµÚÈý·½ÒÀÀµ¡£ÕâÒâζ×ÅÄãÐèҪΪÄãËù´ò°üµÄ
Windows Ó¦ÓÃÉú³ÉÒ»¸ö°²×°Æ÷£¬ÕâÑùËü²Å»á°üº¬ Squirrel ¸üÐÂÆ÷¡£
Amazon S3 bucket£ºS3 µÄÊý¾Ý´æ´¢½á¹¹·Ç³£¼òµ¥£¬¾ÍÊÇÒ»¸ö±âƽ»¯µÄÁ½²ã½á¹¹£ºÒ»²ãÊǴ洢Ͱ£¨Bucket£¬Óֳƴ洢¶Î£©£¬ÁíÒ»²ãÊÇ´æ´¢¶ÔÏó£¨Object£¬ÓÖ³ÆÊý¾ÝÔª£©¡£
ºÃÏûÏ¢ÊÇ£ºWindows µÄ°²×°°üºÍ¸üÐÂÆ÷µÄÔËÐйý³Ì˳»¬µÄ¡£ÒòΪµ±ÄãÆô¶¯ Setup.exe ʱ£¬Äã»á·¢ÏÖ°²×°ºÍÆô¶¯¸ÃÓ¦ÓÃÊÇѸËٵġ£Ã»ÓÐÎÞÁĵݲװÏòµ¼ºÍÒ»Ö±°´¡°ÏÂÒ»²½¡±¡¢×îºó°´¡°Íê³É¡±µÄ²½Ö裬²»È»Óë´ó¶àÊý
Windows °²×°Æ÷Èç³öÒ»ÕÞ¡£µ±È»£¬ËüÒ²ÄÜÉú³É delta packages£¬ÕâÈÃÄãÔÚÖ´ÐиüÐÂʱ£¬²»±ØÏÂÔØÕû¸öÓ¦Óã¬ÕâÕæµÄÊÇÒ»Á÷°¡¡£
ÒëÕß×¢£ºÎÒͨ¹ý electron-builder Éú³ÉµÄ Windows
°²×°°üÓëÎÒÃdz£¼ûµÄÈí¼þ°²×°½çÃæ²»Ì«Ò»Ñù£¬ËûûÓа²×°Ïòµ¼ºÍµã»÷¡°ÏÂÒ»²½¡±£¬Ö»ÓÐÒ»¸ö°²×°Ê±µÄ gif ¶¯»£¨Ä¬ÈϵÄ
gif ¶¯»ÈçÏÂͼ£©£¬Òò´ËÒ²¾ÍûÓÐÈÃÓû§Ñ¡Ôñ°²×°Â·¾¶µÈȨÀû¡£Ò²Ðí×÷Õßϰ¹ßÁË Mac µÄ°²×°·½Ê½£¨¼´ÏÂÃæµÚ¶þ·ùͼ£©£¬ËùÒÔ»á¾õµÃ
Windows µÄ°²×°°ü±È½Ï·±Ëö¡£
Mac ³£¼ûµÄ°²×°Ä£Ê½£¬½«¡°×ó²àµÄÓ¦ÓÃͼ±ê¡±ÍÏ×§µ½¡°ÓÒ²àµÄ Applications¡±¼´¿É
Èç¹ûÄãÏëΪ Windows Ó¦ÓÃÉú³É³£¼ûµÄ¡¢ÐèÒªµã»÷¡°ÏÂÒ»²½¡±µÄ£¨¼´Óû§¿É×Ô¶¨ÒåµÄ£©°²×°°ü£¬¿ÉÒÔͨ¹ý
NSIS ³ÌÐò£¬¾ßÌå¿É¿´ÕâÆª½Ì³Ì¡¶[½ÌŒW]Ö»Òª10·Ö犌W•þʹÓà NSIS °üÑbÄúµÄ×ÀÃæÜ›ów¨C°²Ñb³Ìʽ´ò°ü¡£ÍêÈ«ÃâÙM¡£¡·¡£µ±È»£¬Ç°ÌỹÊÇͨ¹ý
electron-packager ´ò°ü³ÌÐò¡£
NSIS£¨Nullsoft Scriptable Install System£©ÊÇÒ»¸ö¿ªÔ´µÄ Windows
ϵͳϰ²×°³ÌÐòÖÆ×÷³ÌÐò¡£ËüÌṩÁ˰²×°¡¢Ð¶ÔØ¡¢ÏµÍ³ÉèÖá¢Îļþ½âѹËõµÈ¹¦ÄÜ¡£ÕâÈçÆäÃû×ÖËùÖ¸³öµÄÄÇÑù£¬NSIS
ÊÇͨ¹ýËüµÄ½Å±¾ÓïÑÔÀ´ÃèÊö°²×°³ÌÐòµÄÐÐΪºÍÂß¼µÄ¡£NSIS µÄ½Å±¾ÓïÑÔºÍͨ³£µÄ±à³ÌÓïÑÔÓÐÀàËÆµÄ½á¹¹ºÍÓï·¨£¬µ«ËüÊÇΪ°²×°³ÌÐòÕâÀàÓ¦ÓÃËùÉè¼ÆµÄ¡£
»µÏûÏ¢ÊÇ£¨ÖÁÉÙ¶ÔÓÚ Mac Óû§£©£ºÎÒ²»ÄÜÔÚ OSX ÉÏÕýÈ·µØÉú³É°²×°°ü£¬ËùÒÔÎÒ½¨ÒéÄãÏÂÔØÒ»¸ö Windows
ÐéÄâ»ú£¨Èç VirtualBox¡¢parallels£©£¬²¢°²×° Node.js¡£
ÒëÕß×¢£ºÎÒͨ¹ý electron-builder£¬¿ÉÔÚ MacOS ÖÐÖ±½Ó£¨¼´²»Í¨¹ýÐéÄâ»ú£©Éú³É
Windows °²×°°ü£¨¼´Setup.exe£©¡£¾ßÌå¿É ²é¿´ÕâÀï¡£
¼ÙÉèÄãÒѾÅäÖúò¢ÉèÖÃÁËÕýÈ·µÄ¸üÐÂÔ´£¬ÄÇôÔÚÉÏÊö OSX Õ½ڵĴúÂë»ù´¡ÉÏ£¬»¹ÐèÒª´¦ÀíһЩ Squirrel.Windows
ʼþ£¬ÕâЩʼþÓë OSX ÉϵIJ»Í¬¡£Äã¿ÉÒԲ鿴¸Ã °¸Àý¡£È»¶ø£¬ÕâÀïÌṩһ¸ö¸ü¼òµ¥µÄ·½Ê½£¬½öÐè°²×° electron-squirrel-startup
npm Ä£¿é£º
npm install
electron-squirrel-startup --save-dev |
È»ºóÔÚ Electron µÄÖ÷½ø³ÌÎļþ¶¥²¿Ìí¼ÓÒÔÏÂÒ»ÐÐÓï¾ä£º
if (require('electron-squirrel-startup'))
return; |
Squirrel.Windows ʼþÓ¦¸Ã±»¾¡Ôç´¦Àí£¬ÏÔÈ»£¬ÕâÊÇÒª×ߵķ¡£
×îºó£¬ÎªÁËÉú³É°²×°°ü£¬ÎÒÃÇ»áʹÓà Atom µÄ grunt-electron-installer¡£ÎªÊ²Ã´ËüÊÇÒ»¸ö
grunt ²å¼þ£¬¶ø²»ÊÇÒ»¸ö¼òµ¥µÄÃüÁîÐй¤¾ß¡ª¡ªÎÒ²»ÖªµÀ£¬µ«Ëü¾ÍÊǽâ¾ö·½·¨¡£
¸üУºElectron ÍŶӿª·¢ÁËÒ»¸ö¶ÀÁ¢µÄ°²×°Æ÷´ò°ü¹¤¾ß¡ª¡ªelectron-winstaller£¬ËüÓµÓÐÓë
grunt task ͬÑùµÄ API
½« Electron-packager Éú³ÉµÄ win32 Îļþ¼Ð´ò°üѹËõ£¨zip£©£¬È»ºó½«Æä¸´ÖƵ½ÐéÄâ»úÉÏ¡£ÔÚ¸ÃÎļþ¼ÐÍ⣨ÒëÕß×¢£ºÔÚ½âѹºó£©£¬ÄãÐèÒªÅäÖÃ
grunt task£¬¸Ã task »áÉú³É°²×°°ü£¬Òò´ËÄãÓ¦¸ÃÊ×ÏȰ²×°ËùÓÐÒÀÀµ£º
npm install
-g grunt-cli
npm install grunt grunt-electron-installer --save-dev |
¼ÙÉè Windows ±àÒëºóµÄ°ü·ÅÖÃÔÚÒ»¸ö³ÆÎª MyApp-win32-ia32 µÄÎļþ¼ÐÏ¡£ÏÂÃæÕ¹Ê¾
Gruntfile µÄÑù×Ó£º
module.exports
= function(grunt) {
grunt.initConfig({
'create-windows-installer': {
ia32: {
appDirectory: './MyApp-win32-ia32',
outputDirectory: './dist',
name: 'MyApp',
description: 'MyApp',
authors: 'My Company Ltd',
exe: 'MyApp.exe'
}
}
});
grunt.loadNpmTasks('grunt-electron-installer');
}; |
ÐèҪעÒâµÄÊÇ£ºÈç¹ûÄãÏëΪÄãµÄÎļþºÍ°²×°°ü½øÐдúÂëÇ©Ãû£¨code-sign£©²Ù×÷£¬ÄãÒ²ÐèҪΪ¸Ã task
ÅäÖÃÌṩËùÓвÎÊý¡£
ÔËÐиà grunt task ºó£¬»áÔÚ ./dist Ŀ¼Ï²úÉúÒ»¶ÑÎļþ£º
grunt create-windows-installer |
ÄãÔ¤ÆÚ¿´µ½µÄÓëÏÂÃæÀàËÆ£º
©¸©¤©¤ dist
©À©¤©¤ MyApp.1.0.0.nupkg
©À©¤©¤ MyApp-1.0.0-full.nupkg
©À©¤©¤ RELEASES
©À©¤©¤ Setup.exe |
ÔÚÏÂÒ»´Î·¢²¼Ê±£¬¸Ã°²×°Æ÷Ò²»á×Ô¶¯Éú³ÉÒ»¸ö delta packages¡£
ÏÖÔÚ½øÐÐ×î¼òµ¥µÄÒ»²½ ¡ª¡ª ÍÏ×§ÕâЩÎļþµ½ S3 bucket ½øÐÐÉÏ´«¡£È»ºó url Ö¸Ïò¸ÃÎļþ¼Ð£¨°üº¬
RELEASES ºÍ nupkg Îļþ£©¡£µ±Ó¦ÓÃÔËÐÐÔÚ Windows ϵͳÉÏʱ£¬Ëü»á½«¸Ã url
ÉèÖõ½ updateFeed ²ÎÊýÉÏ£¨ÒòΪÎÒÃÇÔÚÏÈǰµÄ OSX Õ½ڴ¦ÒÑʵÏÖ£©¡£
×¢Ò⣺ĿǰÓÐÒ»¸öÓë°²×°Æ÷µÄ node-rcedit Ä£¿éÏà¹ØµÄÎÊÌ⣬¸ÃÄ£¿é»áÔÚÄã³¢ÊÔÈ¥ÐÞ¸Ä .exe
ÎļþµÄһЩԪÐÅÏ¢ºÍÌæ»»Ä¬ÈÏͼ±ê£¨icon£©Ê±Å׳ö´íÎó¡£Äã¿ÉÒÔÔÚ ÕâÀï²é¿´¸Ã issue¡£Òò´Ë£¬Ä¿Ç°Èç¹ûÄãÏëΪ°²×°Æ÷ÎļþÐÞ¸Ä
icon »òΪÆä¸³Óèʵ¼ÊÊý¾Ý£¬Äã¿ÉÄܲ»µÃ²»ÊÖ¶¯µØÍ¨¹ý ResHacker ½øÐÐÐ޸ġ£
½áÊøÓï
Ï£ÍûÕâÆªÎÄÕÂÄÜ×÷Ϊһ¸öºÃµÄÆðµã£¬ÄܰïÖúºÍ·þÎñÿһ¸öÕýÔÚΪ Electron
Ó¦ÓÃʵÏÖ×Ô¶¯¸üеÄÅóÓÑÃÇ¡£
|