Remove lerna, revert postinstall script to Nov 2016 version

This commit is contained in:
Ben Gotow 2017-08-02 13:13:30 -07:00
parent 79b3d58f90
commit 555b4136b8
13 changed files with 84 additions and 155 deletions

View file

@ -1,4 +0,0 @@
{
"lerna": "2.0.0-beta.38",
"version": "0.0.1"
}

View file

@ -33,7 +33,6 @@
"grunt-contrib-less": "0.8.x",
"grunt-lesslint": "0.13.x",
"jasmine": "2.x.x",
"lerna": "emorikawa/lerna#v2.0.0-beta.38.forked",
"load-grunt-parent-tasks": "0.1.1",
"mkdirp": "^0.5.1",
"pm2": "2.4.0",
@ -59,8 +58,8 @@
"stop": "npm run stop-cloud",
"stop-cloud": "pm2 stop all; pm2 delete all;",
"build-cloud": "docker build .",
"postinstall": "babel-node scripts/postinstall.es6",
"daily": "babel-node scripts/daily.js"
"postinstall": "node scripts/postinstall.js",
"daily": "node scripts/daily.js"
},
"repository": {
"type": "git",

View file

@ -1,10 +0,0 @@
# Monorepo Packages
Each folder here is designed to act as its own repository. For development
convenience, they are all included here in one monorepo. This allows us to grep
across multiple codebases, not use submodules, and keep a unified commit
history.
We use [Lerna](https://github.com/lerna/lerna) to manage the monorepo and tie
them all together with the main `nylas-mail-all/scripts/postinstall.es6` script,
which in turn, calls `lerna bootstrap`

View file

@ -1,137 +0,0 @@
import fs from 'fs-plus'
import path from 'path'
import childProcess from 'child_process'
const TARGET_ALL = 'all'
const TARGET_CLOUD = 'cloud'
const TARGET_CLIENT = 'client'
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);
}
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');
}
}
async function lernaBootstrap(installTarget) {
console.log("\n---> Installing packages");
const lernaCmd = process.platform === 'win32' ? 'lerna.cmd' : 'lerna';
const args = ["bootstrap"]
switch (installTarget) {
case TARGET_CLIENT:
args.push(`--ignore='cloud-*'`)
break
case TARGET_CLOUD:
args.push(`--ignore='client-*'`)
break
default:
break
}
await spawn(path.join('node_modules', '.bin', lernaCmd), args)
}
const npmEnvs = {
system: process.env,
electron: Object.assign({}, process.env, {
NPM_CONFIG_TARGET: '1.7.3',
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);
const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm'
await spawn(npmCmd, [cmd], {
cwd: path.resolve(__dirname, '..', cwd),
env: npmEnvs[env],
})
}
async function electronRebuild() {
await npm('rebuild', {
cwd: path.join('packages', 'client-app'),
env: 'electron',
})
}
function getInstallTarget() {
const {INSTALL_TARGET} = process.env
if (!INSTALL_TARGET) {
return TARGET_ALL
}
if (![TARGET_ALL, TARGET_CLIENT, TARGET_CLOUD].includes(INSTALL_TARGET)) {
throw new Error(`postinstall: INSTALL_TARGET must be one of client, cloud, or all. It was set to ${INSTALL_TARGET}`)
}
return INSTALL_TARGET
}
async function main() {
try {
const installTarget = getInstallTarget()
console.log(`\n---> Installing for target ${installTarget}`);
if ([TARGET_ALL, TARGET_CLIENT].includes(installTarget)) {
installPrivateResources()
}
await lernaBootstrap(installTarget);
if ([TARGET_ALL, TARGET_CLIENT].includes(installTarget)) {
if (process.platform === "darwin") {
// Given that `lerna bootstrap` does not install optional dependencies, we
// need to manually run `npm install` inside `client-app` so
// `node-mac-notifier` get's correctly installed and included in the build
// See https://github.com/lerna/lerna/issues/121
console.log("\n---> Reinstalling client-app dependencies to include optional dependencies");
await npm('install', {cwd: 'packages/client-app', env: 'electron'})
}
await electronRebuild();
}
} catch (err) {
console.error(err);
process.exit(1);
}
}
main()

35
scripts/postinstall.js Normal file
View file

@ -0,0 +1,35 @@
#!/usr/bin/env node
/* eslint global-require: 0 */
/* eslint quote-props: 0 */
const path = require('path');
const safeExec = require('./utils/child-process-wrapper.js').safeExec;
const npmEnvs = {
system: process.env,
electron: Object.assign({}, process.env, {
'npm_config_target': require('../packages/client-app/package.json').dependencies.electron,
'npm_config_arch': process.arch,
'npm_config_target_arch': process.arch,
'npm_config_disturl': 'https://atom.io/download/atom-shell',
'npm_config_runtime': 'electron',
'npm_config_build_from_source': true,
}),
};
function npm(cmd, options) {
const {cwd, env} = Object.assign({cwd: '.', env: 'system'}, options);
return new Promise((resolve, reject) => {
console.log(`\n-- Running npm ${cmd} in ./${cwd} with ${env} config --`)
safeExec(`npm ${cmd}`, {
cwd: path.resolve(__dirname, '..', cwd),
env: npmEnvs[env],
}, (err) => {
return err ? reject(err) : resolve(null);
});
});
}
npm('install', {cwd: './packages/client-app', env: 'electron'})
.then(() => npm('dedupe', {cwd: './packages/client-app', env: 'electron'}))

View file

@ -1,4 +1,4 @@
#!/usr/bin/env babel-node
#!/usr/bin/env node
const childProcess = require('child_process')
const path = require('path')
const mkdirp = require('mkdirp')

View file

@ -0,0 +1,46 @@
var childProcess = require('child_process');
// Exit the process if the command failed and only call the callback if the
// command succeed, output of the command would also be piped.
exports.safeExec = function(command, options, callback) {
if (!callback) {
callback = options;
options = {};
}
if (!options)
options = {};
// This needed to be increased for `apm test` runs that generate many failures
// The default is 200KB.
options.maxBuffer = 1024 * 1024;
options.stdio = "inherit"
var child = childProcess.exec(command, options, function(error, stdout, stderr) {
if (error && !options.ignoreStderr)
process.exit(error.code || 1);
else
callback(null);
});
child.stderr.pipe(process.stderr);
if (!options.ignoreStdout)
child.stdout.pipe(process.stdout);
}
// Same with safeExec but call child_process.spawn instead.
exports.safeSpawn = function(command, args, options, callback) {
if (!callback) {
callback = options;
options = {};
}
options.stdio = "inherit"
var child = childProcess.spawn(command, args, options);
child.on('error', function(error) {
console.error('Command \'' + command + '\' failed: ' + error.message);
});
child.on('exit', function(code) {
if (code != 0)
process.exit(code);
else
callback(null);
});
}