EasyDSS打包方法介绍

来源:互联网 发布:java开发重庆薪酬 编辑:程序博客网 时间:2024/05/20 08:43

EasyDSS 高性能流媒体服务器以打成压缩包的形式提供给客户使用, 同时支持 Linux 和 Windows 平台. Linux 平台打成 tar 包, Windows 平台打成 zip 包. 通过 NodeJS 运行打包脚本, 实现了打包过程的自动化.

打包核心库 archiver

用到一个打包的核心库 archiverjs, 这个 archiver 库, 支持 glob 表达式, 可以非常方便的指定 需要打包哪些文件和目录排除哪些文件和目录. 关于 arhiver 对 glob 的支持, 可以点击这里查看. archiver 功能强大到可以指定工作目录 cwd, 给压缩包指定前缀目录 prefix.

字节大小格式化输出

pretty-bytes 一个将字节大小格式化成 human-readable 的库. 方便在压缩过程中显示进度信息.

commander 命令行工具

commander 结合 tj 创作的这个命令行工具, 快速生成一个打包的命令, 并将打包的格式做成命令行选项.

以下是执行 node release.js -h 输出

  Usage: release [options] [command]  Options:    -V, --version           output the version number    -F, --format [tar,zip]  archive format [tar]    -h, --help              output usage information  Commands:    clean

完整的打包脚本

const archiver = require('archiver');const prettyBytes = require('pretty-bytes');const os = require('os');const path = require('path');const fs = require('fs');const program = require('commander');var dir = path.basename(__dirname);function doArchive() {    switch (program.format) {        case 'zip':            var output = fs.createWriteStream(`${__dirname}/${dir}.zip`);            var archive = archiver('tar', { zlib: { level: 9 } })            break;        case 'tar':            var output = fs.createWriteStream(`${__dirname}/${dir}.tar.gz`);            var archive = archiver('tar', { gzip: true });            break;        default:            console.log('unknow format');            program.help();            break;    }    output.on('close', function () {        console.log(os.EOL + prettyBytes(archive.pointer()) + ' total bytes');    });    archive.on('warning', function (err) {        if (err.code === 'ENOENT') {            console.log(err);        } else {            throw err;        }    }).on('error', function (err) {        throw err;    }).on('progress', data => {        process.stdout.clearLine();        process.stdout.cursorTo(0);        process.stdout.write(`${prettyBytes(data.fs.processedBytes)} / ${prettyBytes(data.fs.totalBytes)}`);    })    archive.pipe(output);    archive.glob(`**`, {        cwd: path.resolve(__dirname, "dist"),        dot: true,        ignore: ['logs/**/*', 'temp/**/*']    },{        prefix: dir    })    console.log(`do ${program.format} ...`);    archive.finalize();}program.version(require('./package.json').version)    .option('-F, --format [tar,zip]', 'archive format [tar]', 'tar')program.command('clean').action(function () {    if(fs.existsSync(path.resolve(__dirname, `${dir}.zip`))){        fs.unlinkSync(path.resolve(__dirname, `${dir}.zip`));    }    if(fs.existsSync(path.resolve(__dirname, `${dir}.tar.gz`))){        fs.unlinkSync(path.resolve(__dirname, `${dir}.tar.gz`));    }    console.log('clean done.');    process.exit();})program.command('*', '', {    noHelp: true}).action(function () {    program.help();})program.parse(process.argv);doArchive();
原创粉丝点击