我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!
发包数量多了后,跟踪包的分支、打包时间、软件版本、依赖信息等等成为了一个问题,于是想将这些信息生成,然后写在包的根目录下,项目现场需要定位问题时,开发拿到这个环境信息,可以复现打包环境,便于分析解决现场问题
工具库中记录打包环境信息相关代码
const os = require("os");
const util = require("util");
const exec = util.promisify(require("child_process").exec);
const fs = require("fs");
const path = require("path");
const vueConfig = require("../../../../vue.config");
const defaultDir = path.resolve(__dirname, "../../../../"); //使用项目的根目录
// const vueConfig = require("./vue.config");
// const defaultDir = path.resolve(__dirname, "./"); //使用项目的根目录
var MODE_0666 = parseInt("0666", 8);
//执行命令 获取分支与 npm node相关工具的信息
async function execCommand() {
const { stdout, stderr } = await exec("git branch -vv");
const { stdout: n_stdout, stderr: n_stderr } = await exec("npm -v");
const { stdout: o_stdout, stderr: o_stderr } = await exec("node -v");
if (stderr || n_stderr || o_stderr) {
console.log(stderr, n_stderr, o_stderr);
} else {
return [
stdout.split("\n").find((i) => i.startsWith("*")),
n_stdout,
o_stdout,
];
}
}
//读文件内容
function readFileText(absolutePath) {
//console.log(' \x1b[36mread file from\x1b[0m : ' + absolutePath.substr(-80));
return fs.readFileSync(absolutePath, "utf-8").toString();
}
//将字符写到文件中
function writeFile(absolutePath, str, mode) {
fs.writeFileSync(absolutePath, str, { mode: mode || MODE_0666 });
//console.log(' \x1b[36mwrite file to\x1b[0m : ' + absolutePath.substr(-80));
}
//获取当前时间
let time = new Date().toLocaleString();
//获取当前操作系统
let sys = os.platform();
//获取当前软件名、版本、依赖软件版本
let packageStr = readFileText(path.join(defaultDir, "/package.json")),
pkg = JSON.parse(packageStr),
name = pkg.name, //软件名
version = pkg.version, //当前package.json version
dependencies = pkg.dependencies,
packages = Object.keys(dependencies),
realPackageStr = ""; //
//获取依赖软件版本信息
let lockStr = readFileText(path.join(defaultDir, "/package-lock.json")),
lockPkg = JSON.parse(lockStr),
lockDependencies = lockPkg.dependencies;
for (let i = 0; i < packages.length; i++) {
realPackageStr +=
" ->" + packages[i] + ":" + lockDependencies[packages[i]].version + "\n";
}
//获取当前分支并与其他信息一起写到文件
execCommand().then((res) => {
if (res) {
let str =
`=====build env info(仅仅记录打包时环境,用于问题追踪)=====\nbuild software:${name}\nbuild branch:${res[0]}\nbuild time:` +
`${time}\nbuild platform:${sys}\nnpm version:${res[1]}node version:${res[2]}package version(不准,经常忘记升级版本号):${version}\n` +
`package-lock versions:\n${realPackageStr}`;
//console.log(str);
//写到打包后的根目录
const writeFilePath = path.join(
defaultDir,
vueConfig.outputDir,
"buildEnv"
);
console.log(writeFilePath);
writeFile(writeFilePath, str);
}
});
使用
- 发布相关工具
- 安装发布的工具
- package.json,scripts 相关打包命令后+
&& node ./node_modules/@audaque/vue-config/lib/buildEnv