From f17483d8b87ea691897db970bdc4033c67141345 Mon Sep 17 00:00:00 2001 From: Sential Date: Fri, 23 Aug 2019 14:37:46 +0200 Subject: [PATCH] feat: add downloading electron custom dist --- .gitignore | 2 +- makefile.darwin | 4 +- makefile.linux | 4 +- makefile.win32 | 4 +- package-lock.json | 121 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 + scripts/build.sh | 4 +- tools/cli/index.ts | 26 +++++++++- tools/index.ts | 99 +++++++++++++++++++++++++++++++++++-- 9 files changed, 252 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 152bd82..502a988 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ target electron-launcher* obj curl-build* - +download \ No newline at end of file diff --git a/makefile.darwin b/makefile.darwin index 7a13c84..8d6adb5 100644 --- a/makefile.darwin +++ b/makefile.darwin @@ -5,8 +5,8 @@ CFLAGS = -Os -fdata-sections -ffunction-sections LDFLAGS = -lm -lcurl -lpthread -ldl `pkg-config gtk+-3.0 --libs` -s -Wl,-dead_strip OBJ_DIR = obj/darwin -electron-launcher: $(OBJ_DIR)/main.o $(OBJ_DIR)/zip.o $(OBJ_DIR)/libui.a - $(CXX) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(LDFLAGS) -o build/electron-launcher +electron: $(OBJ_DIR)/main.o $(OBJ_DIR)/zip.o $(OBJ_DIR)/libui.a + $(CXX) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(LDFLAGS) -o build/electron $(OBJ_DIR): mkdir -p $(OBJ_DIR) diff --git a/makefile.linux b/makefile.linux index 23cb79a..a140b64 100644 --- a/makefile.linux +++ b/makefile.linux @@ -5,8 +5,8 @@ CFLAGS = -Os -fdata-sections -ffunction-sections LDFLAGS = -lm -lcurl -lpthread -ldl `pkg-config gtk+-3.0 --libs` -s -Wl,--gc-sections OBJ_DIR = obj/linux -electron-launcher: $(OBJ_DIR)/main.o $(OBJ_DIR)/zip.o $(OBJ_DIR)/libui.a - $(CXX) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(LDFLAGS) -o build/electron-launcher +electron: $(OBJ_DIR)/main.o $(OBJ_DIR)/zip.o $(OBJ_DIR)/libui.a + $(CXX) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(LDFLAGS) -o build/electron $(OBJ_DIR): mkdir -p $(OBJ_DIR) diff --git a/makefile.win32 b/makefile.win32 index b438fae..2d9f9d2 100644 --- a/makefile.win32 +++ b/makefile.win32 @@ -7,8 +7,8 @@ CMAKE_COMMANDS = env CFLAGS="-fdata-sections -ffunction-sections" CXXFLAGS="-fda LDFLAGS = -lm -s -Wl,--gc-sections -static-libgcc -static-libstdc++ -mwindows -lcomctl32 -lole32 -ld2d1 -ldwrite -lws2_32 -lcrypt32 -lpthread -static OBJ_DIR = obj/mingw32 -electron-launcher.exe: $(OBJ_DIR)/main.o $(OBJ_DIR)/resources.o $(OBJ_DIR)/zip.o $(OBJ_DIR)/libui.a $(OBJ_DIR)/libcurl.a - $(CXX) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(LDFLAGS) -o build/electron-launcher.exe +electron.exe: $(OBJ_DIR)/main.o $(OBJ_DIR)/resources.o $(OBJ_DIR)/zip.o $(OBJ_DIR)/libui.a $(OBJ_DIR)/libcurl.a + $(CXX) $(OBJ_DIR)/*.o $(OBJ_DIR)/*.a $(LDFLAGS) -o build/electron.exe $(OBJ_DIR): mkdir -p $(OBJ_DIR) diff --git a/package-lock.json b/package-lock.json index 2619f71..9aac4fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,12 @@ "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, + "@types/extract-zip": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@types/extract-zip/-/extract-zip-1.6.2.tgz", + "integrity": "sha1-XH60QcQRNhZ6QriLZAUeYmDCnoY=", + "dev": true + }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", @@ -241,6 +247,11 @@ "concat-map": "0.0.1" } }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -310,6 +321,22 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -534,6 +561,32 @@ "tmp": "^0.0.33" } }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -558,6 +611,14 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, "figures": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", @@ -748,6 +809,11 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -917,6 +983,11 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, "phin": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/phin/-/phin-3.4.0.tgz", @@ -946,6 +1017,11 @@ "fast-diff": "^1.1.2" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -958,6 +1034,20 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -1006,6 +1096,11 @@ "tslib": "^1.9.0" } }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -1074,6 +1169,14 @@ "strip-ansi": "^5.2.0" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -1186,6 +1289,11 @@ "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "typescript": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", @@ -1201,6 +1309,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", @@ -1235,6 +1348,14 @@ "requires": { "mkdirp": "^0.5.1" } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } } } } diff --git a/package.json b/package.json index 51d62b3..4eaa15d 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ }, "homepage": "https://github.com/sentialx/electron-global#readme", "devDependencies": { + "@types/extract-zip": "^1.6.2", "@types/mkdirp": "^0.5.2", "@types/ncp": "^2.0.1", "@types/node": "^12.7.2", @@ -47,6 +48,7 @@ "typescript": "^3.5.3" }, "dependencies": { + "extract-zip": "^1.6.7", "mkdirp": "^0.5.1", "ncp": "^2.0.0", "phin": "^3.4.0", diff --git a/scripts/build.sh b/scripts/build.sh index b54e985..d79a942 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -17,11 +17,11 @@ if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then else make -f makefile.linux OS="linux" - zip -r "build/electron-launcher-${TRAVIS_TAG}-${OS}-ia32.zip" "build/electron-launcher" + zip -r "build/electron-${TRAVIS_TAG}-${OS}-ia32.zip" "build/electron" # TODO: I need help with it, Travis keeps throwing `ERROR: Could not invoke sanity test executable` # make -f makefile.win32 clean # make -f makefile.win32 # OS="win32" - # zip -r "build/electron-launcher-${TRAVIS_TAG}-${OS}-ia32.zip" "build/electron-launcher.exe" + # zip -r "build/electron-${TRAVIS_TAG}-${OS}-ia32.zip" "build/electron.exe" fi diff --git a/tools/cli/index.ts b/tools/cli/index.ts index ba17b1e..cbdbb4d 100644 --- a/tools/cli/index.ts +++ b/tools/cli/index.ts @@ -1,7 +1,12 @@ #!/usr/bin/env node import * as program from 'commander'; -import { createElectronDistMac } from '..'; +import { + createDistMac, + createDistWindows, + downloadBinaries, + createDistLinux, +} from '..'; import { DEFAULT_DEST } from '../constants'; program.option('-m, --mac', 'Create Electron dist for macOS.'); @@ -20,7 +25,24 @@ program.parse(process.argv); (async function(): Promise { if (program.mac) { - await createElectronDistMac( + await downloadBinaries('darwin'); + await createDistMac( + program.projectDir ? program.projectDir : process.cwd(), + program.output ? program.output : DEFAULT_DEST, + ); + } + + if (program.windows) { + await downloadBinaries('win32'); + await createDistWindows( + program.projectDir ? program.projectDir : process.cwd(), + program.output ? program.output : DEFAULT_DEST, + ); + } + + if (program.linux) { + await downloadBinaries('linux'); + await createDistLinux( program.projectDir ? program.projectDir : process.cwd(), program.output ? program.output : DEFAULT_DEST, ); diff --git a/tools/index.ts b/tools/index.ts index 93cc6a7..7ec8b85 100644 --- a/tools/index.ts +++ b/tools/index.ts @@ -2,8 +2,12 @@ import { ncp } from 'ncp'; import * as mkp from 'mkdirp'; import { promisify } from 'util'; import { join } from 'path'; -import { promises } from 'fs'; +import { promises, createWriteStream } from 'fs'; import * as semver from 'semver'; +import { request } from 'https'; +import * as extract from 'extract-zip'; + +const pkg = require('../package.json'); const mkdirp = promisify(mkp); const copy = promisify(ncp); @@ -34,7 +38,96 @@ export const getElectronVersion = async ( return electronVersion; }; -export const createElectronDistMac = async ( +export const downloadBinaries = ( + os: 'win32' | 'linux' | 'darwin', +): Promise => { + return new Promise( + async (resolve, reject): Promise => { + const url = `https://github.com/sentialx/electron-global/releases/download/v${pkg.version}/electron-v${pkg.version}-${os}-ia32.zip`; + const zipPath = join( + __dirname, + `../download/${os}/electron-v${pkg.version}-${os}-ia32.zip`, + ); + + const stream = createWriteStream(zipPath); + + const req = request( + url, + { + headers: { + 'User-Agent': `electron-global/${pkg.version}`, + }, + }, + res => { + res.pipe(stream); + + res.on('end', () => { + extract( + zipPath, + { dir: join(__dirname, `../download/${os}`) }, + err => { + if (err) return reject(err); + resolve(); + }, + ); + }); + }, + ); + + req.on('error', err => { + reject(err); + }); + }, + ); +}; + +export const createDistWindows = async ( + baseDir: string, + dest: string, +): Promise => { + try { + await mkdirp(dest); + + const electronVersion = await getElectronVersion(baseDir); + + await promises.writeFile( + join(dest, 'electron_version'), + electronVersion.major, + ); + + await copy( + join(__dirname, '../download/win32/electron.exe'), + join(dest, 'electron.exe'), + ); + } catch (e) { + console.error(e); + } +}; + +export const createDistLinux = async ( + baseDir: string, + dest: string, +): Promise => { + try { + await mkdirp(dest); + + const electronVersion = await getElectronVersion(baseDir); + + await promises.writeFile( + join(dest, 'electron_version'), + electronVersion.major, + ); + + await copy( + join(__dirname, '../download/linux/electron'), + join(dest, 'electron'), + ); + } catch (e) { + console.error(e); + } +}; + +export const createDistMac = async ( baseDir: string, dest: string, ): Promise => { @@ -64,7 +157,7 @@ export const createElectronDistMac = async ( await Promise.all([ copy( - join(__dirname, '../resources/darwin/start.sh'), + join(__dirname, '../download/darwin/electron'), join(contentsPath, 'MacOS/Electron'), ), copy(