Skip to content
This repository was archived by the owner on Feb 12, 2022. It is now read-only.

Commit f76e963

Browse files
authored
Merge pull request #119 from seokju-na/geeks-diary-118
App packaging process
2 parents a06ee3a + a8a43ef commit f76e963

File tree

390 files changed

+10760
-56
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

390 files changed

+10760
-56
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ node_modules/
44
coverage*
55
**/*.http
66
**/*.log
7+
build/
8+
tmp/
79
dist/
810
src/assets/vendors/
911
.DS_Store*

angular.json

+1-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
"main": "src/browser/wizard.ts",
2222
"tsConfig": "tsconfig.browser.json",
2323
"polyfills": "src/browser/polyfills.ts",
24-
"assets": [
25-
"src/assets"
26-
],
24+
"assets": [],
2725
"styles": [
2826
"src/browser/wizard.scss"
2927
]

package.json

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "geeks-diary",
2+
"name": "geeks-diary-sources",
33
"version": "1.0.0-beta",
44
"description": "TIL writing tool for geeks",
55
"private": true,
@@ -25,9 +25,10 @@
2525
"test:main-process": "npx electron-mocha --opts test/test-main-process.opts",
2626
"test:libs": "npx electron-mocha --opts test/test-libs.opts",
2727
"ci": "yarn lint && yarn test && yarn build",
28-
"scripts:override-angular-dev-kit": "./scripts/override-angular-dev-kit",
29-
"scripts:build-vendors": "./scripts/build-vendors.sh",
30-
"postinstall": "yarn scripts:override-angular-dev-kit && yarn scripts:build-vendors"
28+
"package": "npx ts-node scripts/package.ts",
29+
"upload-sourcemaps": "npx ts-node scripts/upload-sourcemaps.ts",
30+
"override-angular-dev-kit": "./scripts/override-angular-dev-kit",
31+
"postinstall": "yarn override-angular-dev-kit"
3132
},
3233
"author": {
3334
"name": "Seokju Na",
@@ -56,7 +57,6 @@
5657
"codemirror": "^5.40.2",
5758
"core-js": "^2.5.7",
5859
"date-fns": "^1.29.0",
59-
"devicon-2.2": "^2.2.0",
6060
"dexie": "^2.0.4",
6161
"file-url": "^2.0.2",
6262
"fs-extra": "^7.0.0",
@@ -91,11 +91,13 @@
9191
"@types/node": "^10.5.1",
9292
"@types/nodegit": "^0.22.3",
9393
"@types/remarkable": "^1.7.0",
94+
"@types/rimraf": "^2.0.2",
9495
"awesome-typescript-loader": "^5.2.0",
9596
"chai": "^4.1.2",
9697
"codelyzer": "^4.4.2",
9798
"cross-env": "^5.2.0",
9899
"electron": "~2.x.x",
100+
"electron-builder": "^20.38.4",
99101
"electron-devtools-installer": "^2.2.4",
100102
"electron-mocha": "^6.0.4",
101103
"electron-rebuild": "^1.8.1",
@@ -109,6 +111,7 @@
109111
"lodash.isequal": "^4.5.0",
110112
"node-abi": "^2.4.4",
111113
"nyc": "^12.0.2",
114+
"rimraf": "^2.6.2",
112115
"source-map-support": "^0.5.6",
113116
"ts-node": "^7.0.0",
114117
"tslint": "^5.10.0",

scripts/build-vendors.sh

-11
This file was deleted.

scripts/package.ts

+175
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
import * as Builder from 'electron-builder';
2+
import { copy, ensureDir, readdir, readJson, remove } from 'fs-extra';
3+
import * as path from 'path';
4+
import * as rimraf from 'rimraf';
5+
import { promisify } from 'util';
6+
import { spawnAsync } from './utils';
7+
8+
9+
const ROOT_PATH = path.resolve(__dirname, '../');
10+
const SRC_PATH = path.resolve(ROOT_PATH, 'src/');
11+
const TMP_PATH = path.resolve(ROOT_PATH, 'tmp/');
12+
const DIST_PATH = path.resolve(ROOT_PATH, 'dist/');
13+
const BUILD_PATH = path.resolve(ROOT_PATH, 'build/');
14+
15+
const rimrafAsync = promisify(rimraf);
16+
17+
interface PackageInfo {
18+
name: string;
19+
productName: string;
20+
appId: string;
21+
version: string;
22+
description: string;
23+
repository: {
24+
url: string;
25+
};
26+
author: {
27+
name: string;
28+
email: string;
29+
};
30+
license: string;
31+
}
32+
33+
34+
async function distribute(): Promise<void> {
35+
console.log('Remove distribution directory.');
36+
await remove(DIST_PATH);
37+
38+
console.log('Start distribute.');
39+
40+
// Run all build.
41+
await Promise.all([
42+
spawnAsync('yarn', [
43+
'run',
44+
'build:browser:app',
45+
], { cwd: ROOT_PATH }),
46+
spawnAsync('yarn', [
47+
'run',
48+
'build:browser:wizard',
49+
], { cwd: ROOT_PATH }),
50+
spawnAsync('yarn', [
51+
'run',
52+
'build:main-process',
53+
], { cwd: ROOT_PATH }),
54+
]);
55+
56+
console.log('Move source maps to tmp directory.');
57+
58+
const moveSourceMaps = async (dirName: string): Promise<void> => {
59+
const fileNames = await readdir(path.resolve(DIST_PATH, dirName));
60+
const sourceMapFileNames = fileNames.filter(
61+
fileName => /.js.map$/.test(fileName),
62+
);
63+
64+
await ensureDir(path.resolve(TMP_PATH, dirName));
65+
66+
const tasks: Promise<void>[] = [];
67+
68+
sourceMapFileNames.forEach((sourceMapFileName) => {
69+
tasks.push(copy(
70+
path.resolve(DIST_PATH, dirName, sourceMapFileName),
71+
path.resolve(TMP_PATH, dirName, sourceMapFileName),
72+
));
73+
});
74+
75+
await Promise.all(tasks);
76+
};
77+
78+
await moveSourceMaps('browser/app');
79+
await moveSourceMaps('browser/wizard');
80+
await copy(
81+
path.resolve(DIST_PATH, 'main.js.map'),
82+
path.resolve(TMP_PATH, 'main.js.map'),
83+
);
84+
85+
console.log('Remove all source maps');
86+
await rimrafAsync('dist/browser/app/*.map');
87+
await rimrafAsync('dist/browser/wizard/*.map');
88+
await rimrafAsync('dist/main.js.map');
89+
90+
console.log('End distribute.');
91+
}
92+
93+
94+
async function installDependenciesOnDist(): Promise<void> {
95+
console.log('Copy package.json');
96+
await copy(
97+
path.resolve(SRC_PATH, 'package.json'),
98+
path.resolve(DIST_PATH, 'package.json'),
99+
{ overwrite: true },
100+
);
101+
102+
console.log('Install dependencies.');
103+
await spawnAsync('yarn', ['install'], { cwd: DIST_PATH });
104+
105+
console.log('Rebuild native modules.');
106+
await spawnAsync('npx', [
107+
'electron-rebuild',
108+
'-m',
109+
'dist/',
110+
], { cwd: ROOT_PATH });
111+
112+
console.log('Optimize nodegit.');
113+
await remove(path.resolve(DIST_PATH, 'node_modules/nodegit/vendor'));
114+
115+
console.log('Remove yarn.lock');
116+
await remove(path.resolve(DIST_PATH, 'yarn.lock'));
117+
118+
console.log('Prune node modules.');
119+
await spawnAsync('npm', ['prune', '--production'], { cwd: DIST_PATH });
120+
}
121+
122+
123+
async function build(): Promise<void> {
124+
console.log('Remove build directory.');
125+
await remove(BUILD_PATH);
126+
127+
const packageInfo: PackageInfo = await readJson(
128+
path.resolve(DIST_PATH, 'package.json'),
129+
{ throws: true },
130+
);
131+
132+
console.log('Build started...');
133+
await Builder.build({
134+
config: {
135+
appId: packageInfo.appId,
136+
productName: packageInfo.productName,
137+
buildVersion: packageInfo.version,
138+
asar: true,
139+
npmRebuild: false,
140+
directories: {
141+
app: DIST_PATH,
142+
output: BUILD_PATH,
143+
},
144+
mac: {
145+
category: 'public.app-category.developer-tools',
146+
darkModeSupport: true,
147+
icon: path.resolve(SRC_PATH, 'assets/logos/icon-logo.icns'),
148+
},
149+
extraMetadata: {
150+
name: packageInfo.name,
151+
description: packageInfo.description,
152+
license: packageInfo.license,
153+
author: packageInfo.author,
154+
repository: packageInfo.repository,
155+
},
156+
},
157+
});
158+
}
159+
160+
161+
(async (): Promise<void> => {
162+
console.log('1. Distribute');
163+
await distribute();
164+
165+
console.log('2. Install Dependencies on Dist');
166+
await installDependenciesOnDist();
167+
168+
console.log('3. Build');
169+
await build();
170+
})()
171+
.then(() => process.exit(0))
172+
.catch((error) => {
173+
console.error(error);
174+
process.exit(1);
175+
});

scripts/upload-sourcemaps.ts

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import * as path from 'path';
2+
import * as rimraf from 'rimraf';
3+
import { promisify } from 'util';
4+
import { spawnAsync } from './utils';
5+
6+
7+
const PROD = process.env.NODE_ENV === 'production';
8+
const ROOT_DIR = path.resolve(__dirname, '../');
9+
const ORG_NAME = 'geeks-diary';
10+
const PROJECT_NAME = PROD ? 'geeks-diary-production' : 'geeks-diary-dev';
11+
const release = require('../src/package.json').version;
12+
13+
const rimrafAsync = promisify(rimraf);
14+
15+
16+
async function uploadSourcemaps(): Promise<void> {
17+
await spawnAsync('sentry-cli', [
18+
'releases',
19+
'-o',
20+
ORG_NAME,
21+
'-p',
22+
PROJECT_NAME,
23+
'new',
24+
release,
25+
], { cwd: ROOT_DIR });
26+
27+
await spawnAsync('sentry-cli', [
28+
'releases',
29+
'-o',
30+
ORG_NAME,
31+
'-p',
32+
PROJECT_NAME,
33+
'files',
34+
release,
35+
'upload-sourcemaps',
36+
'--rewrite',
37+
'--url-prefix',
38+
'/browser/app',
39+
'./tmp/browser/app',
40+
], { cwd: ROOT_DIR });
41+
42+
await spawnAsync('sentry-cli', [
43+
'releases',
44+
'-o',
45+
ORG_NAME,
46+
'-p',
47+
PROJECT_NAME,
48+
'files',
49+
release,
50+
'upload-sourcemaps',
51+
'--rewrite',
52+
'--url-prefix',
53+
'/browser/wizard',
54+
'./tmp/browser/wizard',
55+
], { cwd: ROOT_DIR });
56+
57+
await spawnAsync('sentry-cli', [
58+
'releases',
59+
'-o',
60+
ORG_NAME,
61+
'-p',
62+
PROJECT_NAME,
63+
'files',
64+
release,
65+
'upload-sourcemaps',
66+
'--rewrite',
67+
'--url-prefix',
68+
'/main-process',
69+
'./tmp/main.js.map',
70+
], { cwd: ROOT_DIR });
71+
72+
await rimrafAsync(path.resolve(ROOT_DIR, 'tmp/'));
73+
}
74+
75+
76+
(async (): Promise<void> => {
77+
await uploadSourcemaps();
78+
})()
79+
.then(() => process.exit(0))
80+
.catch((error) => {
81+
console.error(error);
82+
process.exit(1);
83+
});

scripts/utils.ts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { spawn, SpawnOptions } from 'child_process';
2+
3+
4+
export function spawnAsync(command: string, args?: string[], options?: SpawnOptions): Promise<any> {
5+
const task = spawn(command, args, options);
6+
7+
return new Promise((resolve, reject) => {
8+
task.stdout.setEncoding('utf8');
9+
task.stderr.setEncoding('utf8');
10+
11+
task.on('close', (code) => {
12+
if (code === 0) {
13+
resolve();
14+
} else {
15+
reject();
16+
}
17+
});
18+
});
19+
}

src/assets/.gitkeep

Whitespace-only changes.

src/assets/logos/1024x1024.png

336 KB
Loading

src/assets/logos/256x256.png

28.8 KB
Loading

src/assets/logos/512x512.png

103 KB
Loading

src/assets/logos/icon-logo.icns

618 KB
Binary file not shown.
Loading
Loading

0 commit comments

Comments
 (0)