@ccos/package_maker
Version:
Coocaa WebOS APP Command-Line Tools.
105 lines (80 loc) • 3.05 kB
JavaScript
import os from 'os';
import path from 'path';
import fs from 'fs';
import crypto from 'crypto';
import tar from './lib/tar.js';
import finder from './lib/finder.js';
import AdmZip from 'adm-zip';
import { rimrafSync } from 'rimraf';
function calculateMD5(filePath) {
return new Promise((resolve, reject) => {
// 创建一个 hash 实例
const hash = crypto.createHash('md5');
const stream = fs.createReadStream(filePath);
stream.on('data', (data) => {
hash.update(data); // 逐块更新 hash 值
});
stream.on('end', () => {
const md5 = hash.digest('hex'); // 获取 MD5 值
resolve(md5);
});
stream.on('error', (err) => {
reject(err);
});
});
}
let distDirExist = false; // 是否存在 dist 目录
let packageJsonFileExist = false; // 是否存在 manifest.json 文件
let tarSourcePath = ''; // tar输入源
let projectName = ''; // 工程名
let outputDirName = 'publish'; // 输出目录
const currDirPath = process.cwd(); // 当前目录
const tmpdir = os.tmpdir(); // 临时文件夹
console.log(' ');
distDirExist = finder.findDirInCurr('dist');
// 如果 dist 目录不存在,则继续寻找 build 目录 (react编译之后放在 build 目录)
if (!distDirExist) {
console.error('目录 \"dist\" 不存在 !');
process.exit(-1);
}
packageJsonFileExist = finder.findFileInCurr('package.json');
if (!packageJsonFileExist) {
console.error('文件 \"package.json\" 不存在 !');
process.exit(-1);
}
tarSourcePath = 'dist';
console.log('正在打包 dist 目录');
const zipfile = new AdmZip();
zipfile.addLocalFolder('./' + tarSourcePath);
if (fs.existsSync('package.json')) {
let packageJsonText = fs.readFileSync('package.json', {encoding: 'utf8'});
console.log(packageJsonText);
try {
let manifest = JSON.parse(packageJsonText);
projectName = manifest.name || '';
//let targetJsonStr = JSON.stringify(manifest);
//zipfile.addFile('manifest.json', Buffer.from(targetJsonStr));
}
catch (e) {
console.log('process manifest.json exception: ' + e);
}
}
if (!projectName) {
projectName = 'app';
}
rimrafSync(outputDirName);
if (!fs.existsSync(outputDirName)) {
fs.mkdirSync(outputDirName);
}
const outputPkgFileName = outputDirName + '/' + projectName + '.zip';
const outputJsonFileName = outputDirName + '/' + projectName + '.json';
zipfile.writeZip(outputPkgFileName);
console.log(`\n 生成文件 ${outputPkgFileName}\n`);
const md5value = await calculateMD5(outputPkgFileName);
console.log(`md5 = ${md5value}`);
const jsonContent = {
md5: md5value,
};
fs.writeFileSync(outputJsonFileName, JSON.stringify(jsonContent));
console.log(`\n 生成文件 ${outputJsonFileName}\n`);