Mailspring/scripts/postinstall.es6
Juan Tejada 1485575e48 [client-app] Fix build
Partially revert 3071856a8e

Symlinking instead of copying the error-logger-extensions prevents the
app from finding the appropriate dependencies required in the error
logger extensions in the main process and in the renderer processes
because globalPaths are only set in renderer processes and /after/
error-logger-extensions are loaded.

We should fix this properly in a separate diff, and move the error
logger to isomorphic-core instead of copying it or symlinking it
2017-02-21 15:57:38 -08:00

110 lines
3 KiB
JavaScript

import fs from 'fs-plus'
import path from 'path'
import childProcess from 'child_process'
async function spawn(cmd, args, opts = {}) {
return new Promise((resolve, reject) => {
const options = Object.assign({stdio: 'inherit'}, opts);
const proc = childProcess.spawn(cmd, args, options)
proc.on("error", reject)
proc.on("exit", resolve)
})
}
function unlinkIfExistsSync(p) {
try {
if (fs.lstatSync(p)) {
fs.removeSync(p);
}
} catch (err) {
return
}
}
function copyErrorLoggerExtensions(privateDir) {
const from = path.join(privateDir, 'src')
const to = path.resolve(path.join('packages', 'client-app', 'src'))
unlinkIfExistsSync(path.join(to, 'error-logger-extensions'));
fs.copySync(from, to);
}
async function installPrivateResources() {
console.log("\n---> Linking private plugins")
const privateDir = path.resolve(path.join('packages', 'client-private-plugins'))
if (!fs.existsSync(privateDir)) {
console.log("\n---> No client app to link. Moving on")
return;
}
copyErrorLoggerExtensions(privateDir)
// link private plugins
for (const plugin of fs.readdirSync(path.join(privateDir, 'packages'))) {
const from = path.resolve(path.join(privateDir, 'packages', plugin));
const to = path.resolve(path.join('packages', 'client-app', 'internal_packages', plugin));
unlinkIfExistsSync(to);
fs.symlinkSync(from, to, 'dir');
}
// link client-sync
const clientSyncDir = path.resolve(path.join('packages', 'client-sync'));
const destination = path.resolve(path.join('packages', 'client-app', 'internal_packages', 'client-sync'));
unlinkIfExistsSync(destination);
fs.symlinkSync(clientSyncDir, destination, 'dir');
}
async function lernaBootstrap() {
console.log("\n---> Installing packages");
await spawn("lerna", ["bootstrap"])
}
const npmEnvs = {
system: process.env,
apm: Object.assign({}, process.env, {
NPM_CONFIG_TARGET: '0.10.40',
}),
electron: Object.assign({}, process.env, {
NPM_CONFIG_TARGET: '1.4.15',
NPM_CONFIG_ARCH: process.arch,
NPM_CONFIG_TARGET_ARCH: process.arch,
NPM_CONFIG_DISTURL: 'https://atom.io/download/electron',
NPM_CONFIG_RUNTIME: 'electron',
NPM_CONFIG_BUILD_FROM_SOURCE: true,
}),
};
async function npm(cmd, options) {
const {cwd, env} = Object.assign({cwd: '.', env: 'system'}, options);
await spawn("npm", [cmd], {
cwd: path.resolve(__dirname, '..', cwd),
env: npmEnvs[env],
})
}
async function electronRebuild() {
if (!fs.existsSync(path.join("packages", "client-app"))) {
console.log("\n---> No client app to rebuild. Moving on")
return;
}
await npm('install', {
cwd: path.join('packages', 'client-app', 'apm'),
env: 'apm',
})
await npm('rebuild', {
cwd: path.join('packages', 'client-app'),
env: 'electron',
})
}
async function main() {
try {
await installPrivateResources()
await lernaBootstrap();
await electronRebuild();
} catch (err) {
console.error(err);
process.exit(1);
}
}
main()