From 4cfbee98ad5fae34c283abf2aea9fe244f25c305 Mon Sep 17 00:00:00 2001 From: xwartz Date: Sun, 24 Apr 2016 14:56:39 +0800 Subject: [PATCH] packager --- .eslintrc.js | 47 ++++++------- .gitignore | 35 ++++++++-- icons/logo.icns | Bin 0 -> 20974 bytes icons/logo.ico | Bin 0 -> 99678 bytes icons/logo.png | Bin 0 -> 6132 bytes main.dev.js | 39 +++++++++++ main.js | 44 +----------- package.js | 134 +++++++++++++++++++++++++++++++++++++ package.json | 13 ++-- webpack.config.electron.js | 55 +++++++++++++++ 10 files changed, 294 insertions(+), 73 deletions(-) create mode 100644 icons/logo.icns create mode 100644 icons/logo.ico create mode 100644 icons/logo.png create mode 100644 main.dev.js create mode 100644 package.js create mode 100644 webpack.config.electron.js diff --git a/.eslintrc.js b/.eslintrc.js index 311a9b6..0235b85 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,25 +1,26 @@ module.exports = { - "extends": "standard", - "env": { - "browser": true, - "mocha": true, - "node": true - }, - "rules": { - "react/jsx-uses-react": 2, - "react/jsx-uses-vars": 2, - "react/react-in-jsx-scope": 2, - "react/sort-comp": 0, - "react/no-multi-comp": 0, - "comma-dangle": 0, - "id-length": 0, - "new-cap": 0, - "eol-last": 0, - "jsx-quotes": 0, - "consistent-return": 0 - }, - "plugins": [ - "standard", - "react" - ] + // "parser": "babel-eslint", + "extends": "standard", + "env": { + "browser": true, + "mocha": true, + "node": true + }, + "rules": { + "react/jsx-uses-react": 2, + "react/jsx-uses-vars": 2, + "react/react-in-jsx-scope": 2, + "react/sort-comp": 0, + "react/no-multi-comp": 0, + "comma-dangle": 0, + "id-length": 0, + "new-cap": 0, + "eol-last": 0, + "jsx-quotes": 0, + "consistent-return": 0 + }, + "plugins": [ + "standard", + "react" + ] } diff --git a/.gitignore b/.gitignore index f991d21..1c7c8d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,33 @@ -.DS_Store +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules -!/app/node_modules -npm-debug.log -*.test + +# OSX +.DS_Store + +# App packaged dist +release +main.js +main.js.map diff --git a/icons/logo.icns b/icons/logo.icns new file mode 100644 index 0000000000000000000000000000000000000000..20063f0027cf6d90b864820f3c69cc459a46022d GIT binary patch literal 20974 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 XYw>?ye6NA`8hEdP_Zs-Ws)7Fn>m)%K literal 0 HcmV?d00001 diff --git a/icons/logo.ico b/icons/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..9dac412f97153789db23a90ef79c407fd892106d GIT binary patch literal 99678 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

As#XGyP+ z<^Rq#=BoWUo=TVl+|vhwa%{%f{oVQbFdPQzD0m2*FYX`1!8v*xXwxO2!q>%I@iWSn zA*)}le_rucVGhOptf*Bl`qpu)eL-8M!iJ#2*TviqpJC%U6#0ytnBBI`XxHa$-)kP* zNXycEnojFPTVAar%KdLVXov6ckam<(lpEJaz~?5z_267?ZAJf!(~&;>7PR4QSQb=_ zt(g1iXSCt`y9<0?JP(+69_yECSOeS_n}coGmiwmjUthUbM!zqRj{UVh+o@VmjKQ_; z+IkJXhiG#~T;HX?)1U*WhT2}NU7YLjjPq%Ia4g34GPn`$fP0$BKY9KpxB}cSj)6_V z{YmM|u%l4Wh>zwx+lX#zt*YHkwLNXraisf&Y1_5DB?vpyK5VzFHtvDq9~7~%6jaA` zC=-ZX$BoAi|9)v=4L>&3_*YFFkbSOUwT?!i=<3{j%@I7>Q6Y)0<&*fV~J5aUR5anH|GYptT zh41SRaJ>e64|>l2W5&f<-m85Ce**z{lDz{F0FZx-H@+qKCRKz;2 zo@KrQzw0Z<9`_0bB|dy+S%^N;D&BJ&2z$IY2pnHGGbqMp+ViIOHaCO9C&kq#b9#0=p6N*5?|I(4FuUhP-&@wt46=SavlVIYEd#35m@JR_eMwtiUWe3Q)ych) zq~{0a4mck6FoX0>w6`Kt295${TXVyw5dGVh zHmKde{uefb!q3HA=}+5?=kqnZ7xqM3=C#-F&dO)wdHeqs7J)6G1FQ`zgEnmmwqxw( zf!@#)I>Tn*ShffI*burxC2R!xV_R@eeh8)d-<|SrU@^EBeEv8%2(;lEFvholb!xz8 z)`yEhn{ESRd>&|%bISBWa5Hp*_h2tjrN-~vHBS1^tG1igcGbRkDf|YeJ+=|^EAII_ zg?{j!Y30@WA3<&7|C)P_?SAM1XTY&w9PR~e83s#$>*_$*1RR^~KMBT4{}~JC^wnTY zhl9_(3w4cOUpWrr>A2?2()vZk{Irffcbq<>>_<6w9IN)4R@Q0A_!p&~>&o~a0|$Wd z_nqSNe+7MXGC00o@CVQq{b2mhfsJ8vI2-KydZ;h{&OgVw0XX(mpeOizUziOx1;@1} zECbro8-50xfic&nF0dr52l_~RjM0ZsTm0=`|LzC+()OI+#%+JFk3&G)wt=-^S+G6( zI1J{7U0``wDNE~{{$MOVfKu^~^{4+&1MU9>>JG-p=j~IL0{!Om z`r%_p{U80iUM7MuyAy0{FdPNO`VP>h2SK~sSN4Mq;W}`gJOcX0xwyt7u}zS1uHGp>$F+m+*0-kSp)TinwIrN6vq8>W5UynFRzaIaVKylMC9X<)pr zgXQ5Ai1FV}+CCkJ?Klti1IK?Y*!NIy{EpfAsZTEh{dFts5BA~uP}--oPYs7p;OAyg z56~{-=sa_*#zH&1w*=Uq`-5${9`x6W;5>G{dr!F*UWB*7ajWPz?AVkt?fVzlu8KOv zT;o3DS?$#)w!LrGMD&?u3u7~VC|GYCTnx@3$7MX0ORhahi)Hz%b=L-Ca29+Bwpjxz z>?-Dd_|(5jAO9W3fb(S%xHh~thAGtl67GS%prVgr?x&yW{kgbpj2+|ZpdT8-8r0J# zOTyd`O52XIQdjHc<5Q|$L(7`lo^kTo=1^O#3$_=2F33KnGCv4%CBJ>V@X@qsAHjsN zQ`a9@WYC1M=Hau~ZrRQ2r>_*RkuTmG``VB0QOCAylixNfnGn@!p9X0`sDkOgQ^e|| zET`~CuDI5$e#?*FxVp{{gkNO1CMEI*k=_cNf2rJCTo-?Vy=Fb3&!J{zn``d9EIEDg%} zq85eY!1s#SeoB-Nq`V8Lc-CvA3peWdm|oxCH06b__=5-DNDm#!KM;RkJ0p2ZS#KOC HUZ4Aagjxmp literal 0 HcmV?d00001 diff --git a/icons/logo.png b/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a97415946d889561d5f503dbfc3ca046a4a8bf78 GIT binary patch literal 6132 zcmV#NFXH03^Iw}5Ku-D5yT+kfQl{XYfx+_K!O7gY<=Bow>FB11CFil zy~g$dt+rr4L{vb1s00BKgA58N$PflYASAq1sjs?rt=i}0Cge`dSyg{^HQAp1pS9Q7 zd+mP@w}EG#dFGjCo_Xe(XP$ZHnP;AP=9y=ndFENz%qIv4;suF<6hT8lhMMcBf$p2 zHo?z={epvnUj*fXx46qE>x1q%tB$%0D-X9$|nTg0sS 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 { + app.quit() +}) + +let winProps = { + width: 1000, + height: 800 +} + +if (process.env.NODE_ENV !== 'development') { + winProps = { + width: 800, + height: 350, + frame: true, + resizeable: false + } +} + +app.on('ready', () => { + mainWindow = new BrowserWindow(winProps) + + // mainWindow.loadURL('http://douban.fm') + + mainWindow.loadURL(`file://${__dirname}/index.html`) + + // if (process.env.NODE_ENV === 'development') { + mainWindow.webContents.openDevTools() + // } + + mainWindow.on('closed', () => { + mainWindow = null + }) +}) diff --git a/main.js b/main.js index d58dd5d..678f08b 100644 --- a/main.js +++ b/main.js @@ -1,42 +1,2 @@ -'use strict' - -import electron from 'electron' - -const app = electron.app -const BrowserWindow = electron.BrowserWindow - -let mainWindow = null - -app.on('window-all-closed', () => { - app.quit() -}) - -let winProps = { - width: 1000, - height: 800 -} - -if (process.env.NODE_ENV !== 'development') { - winProps = { - width: 800, - height: 350, - frame: true, - resizeable: false - } -} - -app.on('ready', () => { - mainWindow = new BrowserWindow(winProps) - - // mainWindow.loadURL('http://douban.fm') - - mainWindow.loadURL(`file://${__dirname}/index.html`) - - if (process.env.NODE_ENV === 'development') { - mainWindow.webContents.openDevTools() - } - - mainWindow.on('closed', () => { - mainWindow = null - }) -}) +!function(e){function n(t){if(o[t])return o[t].exports;var r=o[t]={exports:{},id:t,loaded:!1};return e[t].call(r.exports,r,r.exports,n),r.loaded=!0,r.exports}var o={};return n.m=e,n.c=o,n.p="",n(0)}([function(e,n,o){"use strict";var t=o(1),r=null;t.app.on("window-all-closed",function(){t.app.quit()});var i={width:1e3,height:800};i={width:800,height:350,frame:!0,resizeable:!1},t.app.on("ready",function(){r=new t.BrowserWindow(i),r.loadURL("file://"+__dirname+"/index.html"),r.webContents.openDevTools(),r.on("closed",function(){r=null})})},function(e,n){e.exports=require("electron")}]); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/package.js b/package.js new file mode 100644 index 0000000..bc60a43 --- /dev/null +++ b/package.js @@ -0,0 +1,134 @@ +'use strict' + +import os from 'os' +import webpack from 'webpack' +import packager from 'electron-packager' +import del from 'del' +import { exec } from 'child_process' +import parseArgs from 'minimist' + +import electronCfg from './webpack.config.electron' +import proCfg from './webpack.config.pro' +import pkg from './package' + +const argv = parseArgs(process.argv.slice(2)) + +// const deps = Object.keys(pkg.dependencies) +// const devDeps = Object.keys(pkg.devDependencies) + +const appName = argv.name || argv.n || pkg.productName +const shouldUseAsar = argv.asar || argv.a || false +const shouldBuildAll = argv.all || false + +const DEFAULT_OPTS = { + dir: './', + name: appName, + asar: shouldUseAsar, + ignore: [ + '/test($|/)', + '/tools($|/)', + '/release($|/)', + '/main.dev.js', + 'webpack.config.*', + 'screen.png', + '/node_modules/', + '/app/' + ] + // .concat(devDeps.map((name) => `/node_modules/${name}($|/)`)) + // .concat( + // deps.filter((name) => !electronCfg.externals.includes(name)) + // .map((name) => `/node_modules/${name}($|/)`) + // ) +} + +const icon = argv.icon || argv.i || 'icons/logo' + +if (icon) { + DEFAULT_OPTS.icon = icon +} + +const version = argv.version || argv.v + +if (version) { + DEFAULT_OPTS.version = version + startPack() +} else { + // use the same version as the currently-installed electron-prebuilt + exec('npm list electron-prebuilt --dev', (err, stdout) => { + if (err) { + DEFAULT_OPTS.version = '0.37.6' + } else { + DEFAULT_OPTS.version = stdout.split('electron-prebuilt@')[1].replace(/\s/g, '') + } + startPack() + }) +} + +function build (cfg) { + return new Promise((resolve, reject) => { + webpack(cfg, (err, stats) => { + if (err) return reject(err) + resolve(stats) + }) + }) +} + +function startPack () { + console.log('start pack...') + build(electronCfg) + .then(() => build(proCfg)) + .then(() => del('release/**', { force: true })) + .then((paths) => { + if (shouldBuildAll) { + // build for all platforms + const archs = ['ia32', 'x64'] + const platforms = ['linux', 'win32', 'darwin'] + + platforms.forEach((plat) => { + archs.forEach((arch) => { + pack(plat, arch, log(plat, arch)) + }) + }) + } else { + // build for current platform only + pack(os.platform(), os.arch(), log(os.platform(), os.arch())) + } + }) + .catch((err) => { + console.error(err) + }) +} + +function pack (plat, arch, cb) { + // there is no darwin ia32 electron + if (plat === 'darwin' && arch === 'ia32') return + + const iconObj = { + icon: DEFAULT_OPTS.icon + (() => { + let extension = '.png' + if (plat === 'darwin') { + extension = '.icns' + } else if (plat === 'win32') { + extension = '.ico' + } + return extension + })() + } + + const opts = Object.assign({}, DEFAULT_OPTS, iconObj, { + platform: plat, + arch, + prune: true, + 'app-version': pkg.version || DEFAULT_OPTS.version, + out: `release/${plat}-${arch}` + }) + + packager(opts, cb) +} + +function log (plat, arch) { + return (err, filepath) => { + if (err) return console.error(err) + console.log(`${plat}-${arch} finished!`) + } +} diff --git a/package.json b/package.json index f172866..52adfe8 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,16 @@ { "name": "douban.fm", + "productName": "doubanFM", "version": "1.0.0", "description": "豆瓣fm的桌面版", "main": "main.js", "scripts": { "lint": "eslint app test *.js", "server-hot": "node -r babel-register dev-server.js", - "start-hot": "NODE_ENV=development electron -r babel-register ./", - "build-renderer": "NODE_ENV=production node -r babel-register ./node_modules/.bin/webpack --config webpack.config.pro.js --progress --profile --colors", - "start": "NODE_ENV=production electron -r babel-register ./", + "start-hot": "cross-env NODE_ENV=development electron -r babel-register ./main.dev", + "build-renderer": "cross-env NODE_ENV=production node -r babel-register ./node_modules/.bin/webpack --config webpack.config.pro.js --progress --profile --colors", + "start": "cross-env NODE_ENV=production electron -r babel-register ./main.dev", + "package": "cross-env NODE_ENV=production node -r babel-register package.js", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -27,12 +29,15 @@ "devDependencies": { "babel": "^6.5.2", "babel-core": "^6.7.2", + "babel-eslint": "^6.0.3", "babel-loader": "^6.2.4", + "babel-polyfill": "^6.7.4", "babel-preset-es2015": "^6.5.0", "babel-preset-react": "^6.5.0", "babel-preset-stage-0": "^6.5.0", "babel-register": "^6.7.2", "css-loader": "^0.23.1", + "del": "^2.2.0", "electron-builder": "^2.8.3", "electron-packager": "^5.2.1", "electron-prebuilt": "^0.37.2", @@ -44,8 +49,8 @@ "express": "^4.13.4", "extract-text-webpack-plugin": "^1.0.1", "gulp": "^3.9.1", - "html-webpack-plugin": "^2.15.0", "json-loader": "^0.5.4", + "minimist": "^1.2.0", "node-sass": "^3.5.3", "react-hot-loader": "^1.3.0", "sass-loader": "^3.2.0", diff --git a/webpack.config.electron.js b/webpack.config.electron.js new file mode 100644 index 0000000..3b1d389 --- /dev/null +++ b/webpack.config.electron.js @@ -0,0 +1,55 @@ +// translate main.js + +import webpack from 'webpack' +import baseConfig from './webpack.config.base' + +export default { + ...baseConfig, + + devtool: 'source-map', + + entry: './main.dev', + + output: { + path: __dirname, + filename: './main.js' + }, + + module: { + loaders: [ + ...baseConfig.module.loaders, + { + test: /\.js$/, + exclude: /node_modules/, + loaders: ['babel'] + } + ] + }, + + plugins: [ + new webpack.optimize.UglifyJsPlugin({ + compressor: { + warnings: false + } + }), + // new webpack.BannerPlugin( + // 'require("source-map-support").install();', + // { raw: true, entryOnly: false } + // ), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify('production') + } + }) + ], + + node: { + __dirname: false, + __filename: false + }, + + // externals: [ + // ...baseConfig.externals, + // 'source-map-support' + // ] +}