打包时生成打包环境信息到包中

129 阅读2分钟

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

发包数量多了后,跟踪包的分支、打包时间、软件版本、依赖信息等等成为了一个问题,于是想将这些信息生成,然后写在包的根目录下,项目现场需要定位问题时,开发拿到这个环境信息,可以复现打包环境,便于分析解决现场问题

工具库中记录打包环境信息相关代码

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

包中 buildEnv 文件输出结果(能够知道打包对应的远程分支与commit id,此截图信息直接生成在包的根目录下)

env.png