diff --git a/node_modules/oclif/lib/commands/pack/win.js b/node_modules/oclif/lib/commands/pack/win.js index c0926bd..e4f645c 100644 --- a/node_modules/oclif/lib/commands/pack/win.js +++ b/node_modules/oclif/lib/commands/pack/win.js @@ -59,6 +59,12 @@ InstallDir "\$PROGRAMFILES${arch === 'x64' ? '64' : ''}\\${config.dirname}" ${customization} Section "${config.name} CLI \${VERSION}" + ; First remove any old client files. + ; (Remnants of old versions were causing CLI errors) + ; Initially tried running the Uninstall.exe, but was + ; unable to make script wait for completion (despite using _?) + DetailPrint "Removing files from previous version." + RMDir /r "$INSTDIR\\client" SetOutPath $INSTDIR File /r bin File /r client diff --git a/node_modules/oclif/lib/tarballs/build.js b/node_modules/oclif/lib/tarballs/build.js index 384ea4b..8f5ed5d 100644 --- a/node_modules/oclif/lib/tarballs/build.js +++ b/node_modules/oclif/lib/tarballs/build.js @@ -30,7 +30,9 @@ async function build(c, options = {}) { await fs.emptyDir(c.workspace()); const tarballNewLocation = path.join(c.workspace(), path.basename(tarball)); await fs.move(tarball, tarballNewLocation); - await exec(`tar -xzf "${tarballNewLocation}"`, { cwd: c.workspace() }); + let tarCmd = `tar -xzf "${tarballNewLocation}"`; + if (process.platform === 'win32') tarCmd += ' --force-local'; + await exec(tarCmd, { cwd: c.workspace() }); await Promise.all((await fs.promises.readdir(path.join(c.workspace(), 'package'), { withFileTypes: true })) .map(i => fs.move(path.join(c.workspace(), 'package', i.name), path.join(c.workspace(), i.name)))); await Promise.all([ @@ -38,6 +40,13 @@ async function build(c, options = {}) { fs.promises.rm(path.join(c.workspace(), path.basename(tarball)), { recursive: true }), fs.remove(path.join(c.workspace(), 'bin', 'run.cmd')), ]); + // rename the original balena-cli ./bin/balena entry point for oclif compatibility + await fs.move(path.join(c.workspace(), 'bin', 'balena'), path.join(c.workspace(), 'bin', 'run')); + // The oclif installers are a production installation, while the source + // `bin` folder may contain a `.fast-boot.json` file of a dev installation. + // This has previously led to issues preventing the CLI from starting, so + // delete `.fast-boot.json` (if any) from the destination folder. + await fs.promises.rm(path.join(c.workspace(), 'bin', '.fast-boot.json')); }; const updatePJSON = async () => { const pjsonPath = path.join(c.workspace(), 'package.json'); @@ -49,35 +58,20 @@ async function build(c, options = {}) { await fs.writeJSON(pjsonPath, pjson, { spaces: 2 }); }; const addDependencies = async () => { - const yarnRoot = findYarnWorkspaceRoot(c.root) || c.root; - if (fs.existsSync(path.join(yarnRoot, 'yarn.lock'))) { - await fs.copy(path.join(yarnRoot, 'yarn.lock'), path.join(c.workspace(), 'yarn.lock')); - const yarnVersion = (await exec('yarn -v')).stdout.charAt(0); - if (yarnVersion === '1') { - await exec('yarn --no-progress --production --non-interactive', { cwd: c.workspace() }); - } - else if (yarnVersion === '2') { - throw new Error('Yarn 2 is not supported yet. Try using Yarn 1, or Yarn 3'); - } - else { - try { - await exec('yarn workspaces focus --production', { cwd: c.workspace() }); - } - catch (error) { - if (error instanceof Error && error.message.includes('Command not found')) { - throw new Error('Missing workspace tools. Run `yarn plugin import workspace-tools`.'); - } - throw error; - } - } - } - else { - const lockpath = fs.existsSync(path.join(c.root, 'package-lock.json')) ? - path.join(c.root, 'package-lock.json') : - path.join(c.root, 'npm-shrinkwrap.json'); - await fs.copy(lockpath, path.join(c.workspace(), path.basename(lockpath))); - await exec('npm install --production', { cwd: c.workspace() }); + const ws = c.workspace(); + exec(`cd ${ws}`); + console.error(`[debug] oclif copying node_modules to "${ws}"`) + const source = path.join(c.root, 'node_modules'); + if (process.platform === 'win32') { + await exec(`xcopy "${source}" "${ws}\\node_modules" /S /E /B /I /K /Q /Y`); + } else { + // use the shell's `cp` on macOS in order to preserve extended + // file attributes containing `codesign` digital signatures + await exec(`cp -pR "${source}" "${ws}"`); } + console.error(`[debug] oclif running "npm prune --production" in "${ws}"`); + await exec('npm prune --production', { cwd: c.workspace() }); + console.error(`[debug] oclif done`); }; const pretarball = async () => { const pjson = await fs.readJSON(path.join(c.workspace(), 'package.json'));