<commit_before>const path = require('path');
const fse = require('fs-extra');
const spawn = require('cross-spawn');

const matmanMock = require('matman-mock');

module.exports = (configOpts) => {
  // console.log('run-by-pm2', configOpts);

  // pm2 的方式下，则需要先生成 pm2.json 文件，然后再使用 pm2 启动
  const buildPath = matmanMock.util.getMockServerBuildPath(configOpts.rootPath, configOpts.buildPath);
  const pm2ConfigFilePath = path.join(buildPath, 'pm2.json');

  // 获取配置信息
  let pm2Config = getPm2Config(configOpts);

  // 本地构建一份配置到 buildPath 下
  fse.outputJson(pm2ConfigFilePath, pm2Config)
    .then(() => {
      console.log('Generate pm2.json success!', pm2ConfigFilePath);

      // 构建成功之后启动
      run(pm2ConfigFilePath);
    })
    .catch((err) => {
      throw err;
    });
};

/**
 * 启动 pm2
 * @param {String} pm2ConfigFilePath pm2.json 配置文件绝对路径
 */
function run(pm2ConfigFilePath) {
  const runPm2 = spawn('pm2', ['start', pm2ConfigFilePath]);

  // 打印输出
  let output = '';

  // 成功信息
  runPm2.stdout.on('data', (data) => {
    output += data;
  }).pipe(process.stdout);

  // 异常信息
  runPm2.stderr.on('data', (data) => {
    output += data;
  }).pipe(process.stderr);

  // 运行结束
  runPm2.on('close', (code) => {
    // console.log({ code: code, data: output });<commit_msg>fix: 文件变更之后， mock server 没有自动重启更新 #119<commit_after>const path = require('path');
const fse = require('fs-extra');
const spawn = require('cross-spawn');

const matmanMock = require('matman-mock');

module.exports = (configOpts) => {
  // console.log('run-by-pm2', configOpts);

  // pm2 的方式下，则需要先生成 pm2.json 文件，然后再使用 pm2 启动
  const buildPath = matmanMock.util.getMockServerBuildPath(configOpts.rootPath, configOpts.buildPath);
  const pm2ConfigFilePath = path.join(buildPath, 'pm2.json');

  // 获取配置信息
  let pm2Config = getPm2Config(configOpts);

  // 本地构建一份配置到 buildPath 下
  fse.outputJson(pm2ConfigFilePath, pm2Config)
    .then(() => {
      console.log('Generate pm2.json success!', pm2ConfigFilePath);

      // 注意这里一定要先删除之后再启动，否则可能造成 watch 失效  #119
      deleteTask(() => {
        startTask(pm2ConfigFilePath);
      });
    })
    .catch((err) => {
      throw err;
    });
};

/**
 * 启动 pm2
 * @param {String} pm2ConfigFilePath pm2.json 配置文件绝对路径
 */
function startTask(pm2ConfigFilePath) {
  const runPm2 = spawn('pm2', ['start', pm2ConfigFilePath]);

  // 打印输出
  let output = '';

  // 成功信息
  runPm2.stdout.on('data', (data) => {
    output += data;
  }).pipe(process.stdout);

  // 异常信息
  runPm2.stderr.on('data', (data) => {
    output += data;
  }).pipe(process.stderr);

  // 运行结束
  runPm2.on('close', (code) => {
    // console.log({ code: code, data: output });
  });
}

/**
 * 停止 pm2
 */
function deleteTask(callback) {
  const deletePm2 = spawn('pm2', ['delete', 'matman_app']);

  // 打印输出
  let output = '';

  // 成功信息
  deletePm2.stdout.on('data', (data) => {
    output += data;
  }).pipe(process.stdout);

  // 异常信息
  deletePm2.stderr.on('data', (data) => {
    output += data;
  }).pipe(process.stderr);

  // 运行结束
  deletePm2.on('close', (code) => {
    // console.log({ code: code, data: output });

    setTimeout(() => {
      callback();
    }, 200);

{'fraction_non_alphanumeric': 0.18046305106248017, 'fraction_numerical': 0.01934665398033619, 'mean_word_length': 3.2621621621621624, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 20, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4888825', 'n_tokens_mistral': 1274, 'n_tokens_neox': 1298, 'n_words': 216}