一键发布npm包,智能升级版本号:打破发布困扰的神奇Node.js脚本

89 阅读1分钟

告别复杂的npm包发布流程!这个Node.js脚本将帮你摆脱版本管理的困扰。不论是发布主版本、次版本还是修订版本,只需简单的一键操作,脚本就会自动获取最新版本并更新你的package.json文件。

image.png

const { exec } = require('child_process');
const fs = require('fs');
const path = require('path');
const inquirer = require('inquirer'); // 导入 inquirer

const packageName = require('./package.json').name;

// 获取最新版本号
function getLatestVersion(callback) {
  exec(`npm show ${packageName} version`, (error, stdout) => {
    if (error) {
      console.error(`获取最新版本失败: ${error.message}`);
      return;
    }
    const latestVersion = stdout.trim();
    callback(latestVersion);
  });
}

// 更新 package.json 版本号
function updateVersion(newVersion) {
  // 读取本地package.json文件
  const packageJsonPath = path.join(__dirname, 'package.json');
  const packageJson = require(packageJsonPath);

  // 更新版本号
  packageJson.version = newVersion;

  // 将更新后的package.json写回文件
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));

  console.log(`已将版本号更新为 ${newVersion}`);
}

// 选择发布的版本类型
function displayOptions(latestVersion) {
  const [major, minor, patch] = latestVersion.split('.').map(Number);
  const enumVersion = {
    major: `${major + 1}.0.0`,
    minor: `${major}.${minor + 1}.0`,
    patch: `${major}.${minor}.${patch + 1}`,
  };
  const choices = [
    {
      name: `Patch: ${enumVersion.patch}`,
      value: enumVersion.patch,
    },
    {
      name: `Minor: ${enumVersion.minor}`,
      value: enumVersion.minor,
    },
    {
      name: `Major: ${enumVersion.major}`,
      value: enumVersion.major,
    },
  ];

  inquirer
    .prompt([
      {
        type: 'list',
        name: 'newVersion',
        message: '请选择发布的版本类型:',
        choices: choices,
      },
    ])
    .then((answers) => {
      updateVersion(answers.newVersion);
    });
}

getLatestVersion((latestVersion) => {
  displayOptions(latestVersion);
});