Refactor automation scripts (reduce need for MSYS to build on Windows)

Change-type: patch
This commit is contained in:
Paulo Castro 2021-03-22 16:05:20 +00:00
parent 329b84d01e
commit 68b61e7424
3 changed files with 2 additions and 64 deletions

View File

@ -34,15 +34,15 @@ import {
diffLines, diffLines,
getSubprocessStdout, getSubprocessStdout,
loadPackageJson, loadPackageJson,
MSYS2_BASH,
ROOT, ROOT,
StdOutTap, StdOutTap,
whichSpawn, whichSpawn,
} from './utils'; } from './utils';
export const packageJSON = loadPackageJson(); export const packageJSON = loadPackageJson();
export const version = 'v' + packageJSON.version; export const version = 'v' + packageJSON.version;
const arch = process.arch; const arch = process.arch;
const MSYS2_BASH =
process.env.MSYSSHELLPATH || 'C:\\msys64\\usr\\bin\\bash.exe';
function dPath(...paths: string[]) { function dPath(...paths: string[]) {
return path.join(ROOT, 'dist', ...paths); return path.join(ROOT, 'dist', ...paths);

View File

@ -27,7 +27,6 @@ import {
release, release,
updateDescriptionOfReleasesAffectedByIssue1359, updateDescriptionOfReleasesAffectedByIssue1359,
} from './deploy-bin'; } from './deploy-bin';
import { fixPathForMsys, ROOT, runUnderMsys } from './utils';
// DEBUG set to falsy for negative values else is truthy // DEBUG set to falsy for negative values else is truthy
process.env.DEBUG = ['0', 'no', 'false', '', undefined].includes( process.env.DEBUG = ['0', 'no', 'false', '', undefined].includes(
@ -48,9 +47,6 @@ function exitWithError(error: Error | string): never {
* 'build:standalone' (to build a standalone pkg package) * 'build:standalone' (to build a standalone pkg package)
* 'release' (to create/update a GitHub release) * 'release' (to create/update a GitHub release)
* *
* In the case of 'build:installer', also call runUnderMsys() to switch the
* shell from cmd.exe to MSYS2 bash.exe.
*
* @param args Arguments to parse (default is process.argv.slice(2)) * @param args Arguments to parse (default is process.argv.slice(2))
*/ */
export async function run(args?: string[]) { export async function run(args?: string[]) {
@ -74,10 +70,6 @@ export async function run(args?: string[]) {
} }
} }
// If runUnderMsys() is called to re-execute this script under MSYS2,
// the current working dir becomes the MSYS2 homedir, so we change back.
process.chdir(ROOT);
// The BUILD_TMP env var is used as an alternative location for oclif // The BUILD_TMP env var is used as an alternative location for oclif
// (patched) to copy/extract the CLI files, run npm install and then // (patched) to copy/extract the CLI files, run npm install and then
// create the NSIS executable installer for Windows. This was necessary // create the NSIS executable installer for Windows. This was necessary
@ -95,23 +87,6 @@ export async function run(args?: string[]) {
for (const arg of args) { for (const arg of args) {
try { try {
if (arg === 'build:installer' && process.platform === 'win32') {
// ensure running under MSYS2
if (!process.env.MSYSTEM) {
process.env.MSYS2_PATH_TYPE = 'inherit';
await runUnderMsys([
fixPathForMsys(process.argv[0]),
fixPathForMsys(process.argv[1]),
arg,
]);
continue;
}
if (process.env.MSYS2_PATH_TYPE !== 'inherit') {
throw new Error(
'the MSYS2_PATH_TYPE env var must be set to "inherit"',
);
}
}
const cmdFunc = commands[arg]; const cmdFunc = commands[arg];
await cmdFunc(); await cmdFunc();
} catch (err) { } catch (err) {

View File

@ -18,10 +18,7 @@
import { spawn } from 'child_process'; import { spawn } from 'child_process';
import * as _ from 'lodash'; import * as _ from 'lodash';
import * as path from 'path'; import * as path from 'path';
import * as shellEscape from 'shell-escape';
export const MSYS2_BASH =
process.env.MSYSSHELLPATH || 'C:\\msys64\\usr\\bin\\bash.exe';
export const ROOT = path.join(__dirname, '..'); export const ROOT = path.join(__dirname, '..');
/** Tap and buffer this process' stdout and stderr */ /** Tap and buffer this process' stdout and stderr */
@ -91,40 +88,6 @@ export function loadPackageJson() {
return require(path.join(ROOT, 'package.json')); return require(path.join(ROOT, 'package.json'));
} }
/**
* Convert e.g. 'C:\myfolder' -> '/C/myfolder' so that the path can be given
* as argument to "unix tools" like 'tar' under MSYS or MSYS2 on Windows.
*/
export function fixPathForMsys(p: string): string {
return p.replace(/\\/g, '/').replace(/^([a-zA-Z]):/, '/$1');
}
/**
* Run the MSYS2 bash.exe shell in a child process (child_process.spawn()).
* The given argv arguments are escaped using the 'shell-escape' package,
* so that backslashes in Windows paths, and other bash-special characters,
* are preserved. If argv is not provided, defaults to process.argv, to the
* effect that this current (parent) process is re-executed under MSYS2 bash.
* This is useful to change the default shell from cmd.exe to MSYS2 bash on
* Windows.
* @param argv Arguments to be shell-escaped and given to MSYS2 bash.exe.
*/
export async function runUnderMsys(argv?: string[]) {
const newArgv = argv || process.argv;
await new Promise((resolve, reject) => {
const args = ['-lc', shellEscape(newArgv)];
const child = spawn(MSYS2_BASH, args, { stdio: 'inherit' });
child.on('close', (code) => {
if (code) {
console.log(`runUnderMsys: child process exited with code ${code}`);
reject(code);
} else {
resolve();
}
});
});
}
/** /**
* Run the executable at execPath as a child process, and resolve a promise * Run the executable at execPath as a child process, and resolve a promise
* to the executable's stdout output as a string. Reject the promise if * to the executable's stdout output as a string. Reject the promise if