自动构建打包脚本(开发环境)

1.确保你的分支提交完毕; 2.在开发分支运行此脚本; 3.打包完成,部署平台进行部署;

一.vue2项目为例,在根目录下建立一个script文件夹,里面建一个di-build.js文件,文件的内容代码如下:

js 复制代码
const { spawn } = require("child_process");
const { promisify } = require("util");
const exec = promisify(require("child_process").exec);

class BranchDeployer {
  constructor() {
    this.targetBranch = 'develop';
    this.currentBranch = "";
    this.npmStdout = 'di'
  }

  async run() {
    try {
      console.log("🚀 开始di构建打包流程...");

      // 获取当前分支
      await this.getCurrentBranch();
      console.log(`📋 检测到当前分支: ${this.currentBranch}`);

      // 如果当前分支已经是目标分支,则退出
      if (this.currentBranch === this.targetBranch) {
        console.log(`⚠️  当前分支已经是 ${this.targetBranch},跳过部署`);
        return;
      }

      // 检查工作区是否干净
      await this.checkWorkingDirectoryClean();

      // 拉取最新代码
      await this.pullCurrentBranch();

      // 更新所有分支并切换到目标分支
      await this.switchToTargetBranch();

      // 合并分支
      await this.mergeBranches();

      // 构建 - 添加更详细的错误处理
      await this.buildWithFallback();

      // 提交构建产物
      await this.commitBuildArtifacts();

      // 推送
      await this.pushToRemote();

      // 切换回原分支
      await this.switchBackToOriginalBranch();

      console.log(
        `✅ 打包完成!已将 ${this.currentBranch} 成功合并到 ${this.targetBranch}`
      );
    } catch (error) {
      console.error("❌ 打包过程中发生错误:", error.message);

      process.exit(1);
    }
  }

  async getCurrentBranch() {
    try {
      const { stdout } = await exec("git branch --show-current");
      this.currentBranch = stdout.trim();
    } catch (error) {
      throw new Error(`获取当前分支失败: ${error.message}`);
    }
  }

  async checkWorkingDirectoryClean() {
    try {
      const { stdout } = await exec("git status --porcelain");
      if (stdout.trim() !== "") {
        throw new Error("工作区有未提交的更改,请先提交或暂存更改");
      }
    } catch (error) {
      throw new Error(`检查工作区状态失败: ${error.message}`);
    }
  }

  async pullCurrentBranch() {
    console.log("⬇️ 开始拉取最新的远端代码...", this.currentBranch);
    try {
      await exec(`git pull origin ${this.currentBranch}`);
    } catch (error) {
      throw new Error(`拉取当前分支代码失败: ${error.message}`);
    }
  }

  async switchToTargetBranch() {
    try {
      // 更新所有分支
      await exec("git fetch origin");

      // 检查目标分支是否存在
      try {
        await exec(
          `git show-ref --verify --quiet refs/heads/${this.targetBranch}`
        );
      } catch (error) {
        throw new Error(`目标分支 ${this.targetBranch} 不存在,请检查分支名称`);
      }

      // 切换到目标分支并更新
      await exec(`git checkout ${this.targetBranch}`);
      await exec(`git pull origin ${this.targetBranch}`);
    } catch (error) {
      throw new Error(`切换到目标分支失败: ${error.message}`);
    }
  }

  async mergeBranches() {
    console.log(
      `🔄 开始将 ${this.currentBranch} 合并到 ${this.targetBranch}...`
    );

    return new Promise((resolve, reject) => {
      const mergeProcess = spawn(
        "git",
        ["merge", "--no-ff", this.currentBranch],
        {
          stdio: "inherit",
          shell: true
        }
      );

      mergeProcess.on("close", async (code) => {
        if (code === 0) {
          resolve();
        } else {
          // 合并冲突,回滚并切换回原分支
          try {
            await exec("git merge --abort");
            await exec(`git checkout ${this.currentBranch}`);
            reject(new Error("合并冲突!请手动解决冲突后重新运行脚本"));
          } catch (error) {
            reject(new Error(`合并失败且回滚也失败: ${error.message}`));
          }
        }
      });

      mergeProcess.on("error", (error) => {
        reject(new Error(`合并过程出错: ${error.message}`));
      });
    });
  }

  async buildWithFallback() {
    console.log("📦 开始构建过程...");

    try {
      // 首先检查 package.json 是否存在
      const fs = require("fs");
      if (!fs.existsSync("package.json")) {
        throw new Error("package.json 文件不存在,请在项目根目录运行此脚本");
      }

      // 检查 npm 命令是否可用
      try {
        await exec("npm --version");
      } catch (error) {
        throw new Error("npm 命令不可用,请确保已安装 Node.js 和 npm");
      }

      try {
        console.log(`🔄 尝试运行: npm run ${this.npmStdout}`);
        const success = await this.runNpmCommand(this.npmStdout);
        if (success) {
          console.log(`✅ 使用 npm run ${this.npmStdout} 构建成功`);
          return;
        }
      } catch (error) {
        console.log(`❌ npm run ${this.npmStdout} 失败: ${error.message}`);
        throw new Error(`npm run ${this.npmStdout} 失败: ${error.message}`);
      }
    } catch (error) {
      throw new Error(`构建过程失败: ${error.message}`);
    }
  }

  async runNpmCommand(command) {
    return new Promise((resolve, reject) => {
      console.log(`▶️  执行: npm run ${command}`);

      const npmProcess = spawn("npm", ['run', command], {
        stdio: "inherit",
        shell: true
      });

      npmProcess.on("close", (code) => {
        if (code === 0) {
          resolve(true);
        } else {
          reject(new Error(`npm ${command} 退出码: ${code}`));
        }
      });

      npmProcess.on("error", (error) => {
        reject(new Error(`npm ${command} 执行错误: ${error.message}`));
      });
    });
  }

  async commitBuildArtifacts() {
    console.log("💾 检查构建产物...");
    try {
      // 添加所有文件
      await exec("git add .");

      // 检查是否有文件需要提交
      const { stdout } = await exec("git status --porcelain");
      if (stdout.trim() !== "") {
        const timestamp = new Date().toLocaleString("zh-CN");
        await exec(
          `git commit -m "dist: 自动构建提交 from ${this.currentBranch} (${timestamp})"`
        );
        console.log("✅ 构建产物已提交");
      } else {
        console.log("📝 没有检测到构建产物的变化");
      }
    } catch (error) {
      throw new Error(`提交构建产物失败: ${error.message}`);
    }
  }

  async pushToRemote() {
    console.log(`🚀 推送到远程 ${this.targetBranch} 分支...`);
    try {
      await exec(`git push origin ${this.targetBranch}`);
    } catch (error) {
      throw new Error(`推送到远程失败: ${error.message}`);
    }
  }

  async switchBackToOriginalBranch() {
    console.log(`🔙 切换回原分支 ${this.currentBranch}...`);
    try {
      await exec(`git checkout ${this.currentBranch}`);
    } catch (error) {
      throw new Error(`切换回原分支失败: ${error.message}`);
    }
  }
}


// 使用示例
async function main() {
  const deployer = new BranchDeployer();
  await deployer.run();
}

// 如果直接运行此文件
if (require.main === module) {
  main().catch((error) => {
    console.error("❌ 打包失败:", error.message);
    process.exit(1);
  });
}

module.exports = BranchDeployer;

第二步.在package.json文件中加入进行如图:

第三步:运行该命令 npm run di-build 如图:

注意点:各自的开发环境打包命令根据自身的命令来配置

相关推荐
jerrywus2 小时前
为什么每个程序员都应该试试 cmux:AI 加持的终端效率革命
前端·人工智能·claude
codeniu2 小时前
@logicflow/vue-node-registry 在 Vite 中无法解析的踩坑记录与解决方案
前端·javascript
孟祥_成都2 小时前
AI 术语满天飞?90% 的人只懂名词,不懂为什么!
前端·人工智能
Lupino2 小时前
被 React “玩弄”的 24 小时:为了修一个不存在的 Bug,我给大模型送了顿火锅钱
前端·react.js
米丘2 小时前
了解 Javascript 模块化,更好地掌握 Vite 、Webpack、Rollup 等打包工具
前端
Heo2 小时前
深入 React19 Diff 算法
前端·javascript·面试
滕青山2 小时前
个人所得税计算器 在线工具核心JS实现
前端·javascript·vue.js
小怪点点2 小时前
手写promise
前端·promise
国思RDIF框架3 小时前
RDIFramework.NET Web 敏捷开发框架 V6.3 发布 (.NET8+、Framework 双引擎)
前端