@oclif/dev-cli
Version:
helpers for oclif CLIs
105 lines (104 loc) • 4.74 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const command_1 = require("@oclif/command");
const _ = require("lodash");
const qq = require("qqjs");
const Tarballs = require("../../tarballs");
function debArch(arch) {
if (arch === 'x64')
return 'amd64';
if (arch === 'x86')
return 'i386';
if (arch === 'arm')
return 'armel';
throw new Error(`invalid arch: ${arch}`);
}
const debVersion = (buildConfig) => `${buildConfig.version.split('-')[0]}-1`;
const scripts = {
/* eslint-disable no-useless-escape */
bin: (config) => `#!/usr/bin/env bash
set -e
echoerr() { echo "$@" 1>&2; }
get_script_dir () {
SOURCE="\${BASH_SOURCE[0]}"
# While \$SOURCE is a symlink, resolve it
while [ -h "\$SOURCE" ]; do
DIR="\$( cd -P "\$( dirname "\$SOURCE" )" && pwd )"
SOURCE="\$( readlink "\$SOURCE" )"
# If \$SOURCE was a relative symlink (so no "/" as prefix, need to resolve it relative to the symlink base directory
[[ \$SOURCE != /* ]] && SOURCE="\$DIR/\$SOURCE"
done
DIR="\$( cd -P "\$( dirname "\$SOURCE" )" && pwd )"
echo "\$DIR"
}
DIR=\$(get_script_dir)
export ${config.scopedEnvVarKey('UPDATE_INSTRUCTIONS')}="update with \\"sudo apt update && sudo apt install ${config.bin}\\""
\$DIR/node \$DIR/run "\$@"
`,
/* eslint-enable no-useless-escape */
control: (config, arch) => `Package: ${config.config.bin}
Version: ${debVersion(config)}
Section: main
Priority: standard
Architecture: ${arch}
Maintainer: ${config.config.scopedEnvVar('AUTHOR') || config.config.pjson.author}
Description: ${config.config.pjson.description}
`,
ftparchive: (config) => `
APT::FTPArchive::Release {
Origin "${config.scopedEnvVar('AUTHOR') || config.pjson.author}";
Suite "stable";
`,
};
class PackDeb extends command_1.Command {
async run() {
if (process.platform !== 'linux')
throw new Error('must be run from linux');
const { flags } = this.parse(PackDeb);
const buildConfig = await Tarballs.buildConfig(flags.root);
const { config } = buildConfig;
await Tarballs.build(buildConfig, { platform: 'linux', pack: false });
const dist = buildConfig.dist('deb');
await qq.emptyDir(dist);
const build = async (arch) => {
const target = { platform: 'linux', arch };
const versionedDebBase = `${config.bin}_${debVersion(buildConfig)}_${debArch(arch)}`;
const workspace = qq.join(buildConfig.tmp, 'apt', `${versionedDebBase}.apt`);
await qq.rm(workspace);
await qq.mkdirp([workspace, 'DEBIAN']);
await qq.mkdirp([workspace, 'usr/bin']);
await qq.mkdirp([workspace, 'usr/lib']);
await qq.mv(buildConfig.workspace(target), [workspace, 'usr/lib', config.dirname]);
await qq.write([workspace, 'usr/lib', config.dirname, 'bin', config.bin], scripts.bin(config));
await qq.write([workspace, 'DEBIAN/control'], scripts.control(buildConfig, debArch(arch)));
await qq.chmod([workspace, 'usr/lib', config.dirname, 'bin', config.bin], 0o755);
await qq.x(`ln -s "../lib/${config.dirname}/bin/${config.bin}" "${workspace}/usr/bin/${config.bin}"`);
await qq.x(`chown -R root "${workspace}"`);
await qq.x(`chgrp -R root "${workspace}"`);
await qq.x(`dpkg --build "${workspace}" "${qq.join(dist, `${versionedDebBase}.deb`)}"`);
};
const arches = _.uniq(buildConfig.targets
.filter(t => t.platform === 'linux')
.map(t => t.arch));
// eslint-disable-next-line no-await-in-loop
for (const a of arches)
await build(a);
await qq.x('apt-ftparchive packages . > Packages', { cwd: dist });
await qq.x('gzip -c Packages > Packages.gz', { cwd: dist });
await qq.x('bzip2 -k Packages', { cwd: dist });
await qq.x('xz -k Packages', { cwd: dist });
const ftparchive = qq.join(buildConfig.tmp, 'apt', 'apt-ftparchive.conf');
await qq.write(ftparchive, scripts.ftparchive(config));
await qq.x(`apt-ftparchive -c "${ftparchive}" release . > Release`, { cwd: dist });
const gpgKey = config.scopedEnvVar('DEB_KEY');
if (gpgKey) {
await qq.x(`gpg --digest-algo SHA512 --clearsign -u ${gpgKey} -o InRelease Release`, { cwd: dist });
await qq.x(`gpg --digest-algo SHA512 -abs -u ${gpgKey} -o Release.gpg Release`, { cwd: dist });
}
}
}
exports.default = PackDeb;
PackDeb.description = 'pack CLI into debian package';
PackDeb.flags = {
root: command_1.flags.string({ char: 'r', description: 'path to oclif CLI root', default: '.', required: true }),
};
;