vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件

news2025/5/20 23:27:11
vue2 打包生成text文件 和 前端项目的版本号json文件
  • 项目打包生成txt文件-自动记录git版本、当前分支、提交人姓名、提交日期、提交描述等信息
  • 生成版本号json文件-自动记录当前版本号、打包时间等信息
  • 新建branch-version-webpack-plugin.js文件
// 同步子进程
const execSync = require('child_process').execSync
const address = require('address')
const needHost = address.ip() || 'localhost' // 需要更改的ip
const fs = require('fs');
const path = require('path');
const moment = require('moment');
// 配置常量
const VERSION_FILES = {
  TXT: 'version.txt',
  JSON: 'version.json'
};
// 时间格式生成
function dateFormat(date) {
  const y = date.getFullYear()
  const M = date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1
  const d = date.getDate() < 10 ? `0${date.getDate()}` : date.getDate()
  const h = date.getHours() < 10 ? `0${date.getHours()}` : date.getHours()
  const m = date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes()
  const s = date.getSeconds() < 10 ? `0${date.getSeconds()}` : date.getSeconds()
  return `${y}-${M}-${d} ${h}:${m}:${s}`
}
// 读取 package.json 文件
const packagePath = path.resolve(__dirname, '../package.json');
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));

// 读取或创建版本历史文件
// const versionsPath = path.resolve(__dirname, './versions.json');

// 获取要更新的版本类型 (major, minor, patch) 主修订 次修订 修订号
// npm run build:prod major
console.log( process.argv[3],'process');
// 修订当前的版本号
function updateVersion() {
  const [major, minor, patch] = packageJson.version.split('.').map(Number); 
  if(process.argv[3] === 'major') {
    return `${major + 1}.0.0`;
  }
  if(patch > 20) {
    return `${major}.${minor + 1}.0`;
  }
  return `${major}.${minor}.${patch + 1}`;
}

// 增加修订号(可以根据需要修改为增加主版本号或次版本号)
packageJson.version = updateVersion()
console.log(`版本号已更新为:${packageJson.version}`);

// 更新项目的版本号
function getProjectVersion() {
  return{
   version: packageJson.version,
   buildTime: moment().format('YYYY-MM-DD HH:mm:ss')
  }
}


fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2)); // 写回 package.json
// fs.writeFileSync('./version.json', JSON.stringify(getProjectVersion(), null, 2)); // 写入 version.json

// 格式化日对象
const getNowDate = () => {
  const date = new Date()
  const sign2 = ':'
  const year = date.getFullYear() // 年
  let month = date.getMonth() + 1 // 月
  let day = date.getDate() // 日
  let hour = date.getHours() // 时
  let minutes = date.getMinutes() // 分
  let seconds = date.getSeconds() // 秒
  const weekArr = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']
  // eslint-disable-next-line no-unused-vars
  const week = weekArr[date.getDay()]
  // 给一位数的数据前面加 “0”
  if (month >= 1 && month <= 9) {
    month = '0' + month
  }
  if (day >= 0 && day <= 9) {
    day = '0' + day
  }
  if (hour >= 0 && hour <= 9) {
    hour = '0' + hour
  }
  if (minutes >= 0 && minutes <= 9) {
    minutes = '0' + minutes
  }
  if (seconds >= 0 && seconds <= 9) {
    seconds = '0' + seconds
  }
  return year + '-' + month + '-' + day + ' ' + hour + sign2 + minutes + sign2 + seconds
}

// 获取当前git分支信息
function getBranchVersionInfo() {
  // 当前分支名
  const vName = execSync('git name-rev --name-only HEAD').toString().trim()
  // 提交的commit hash
  const commitHash = execSync('git show -s --format=%H').toString().trim()
  // 提交人姓名
  const name = execSync('git show -s --format=%cn').toString().trim()
  // 提交日期
  const date = dateFormat(new Date(execSync('git show -s --format=%cd').toString()))
  // 提交描述
  const message = execSync('git show -s --format=%s').toString().trim()
  // ip
  const ip = needHost

  const buildDate = getNowDate()
  return `
    buildDate: ${buildDate}\n
    ip地址: ${ip}\n
    当前分支名:${vName}\n
    提交的hash:${commitHash}\n
    提交人姓名:${name}\n
    提交日期:${date}\n
    提交描述:${message}
  `
}
// 创建分支版本类
class BranchVersionWebpackPlugin {
  constructor(options) {
    // options 为调用时传的参数
    // console.log('BranchVersionWebpackPlugin 被调用!', options)
  }
  /**
   * compiler: webpack 的实例 所有的内容
   * compilation: 本次打包的内容
   * */

  apply(compiler) {
    // 异步方法,生成打包目录时:生成文件
    compiler.hooks.emit.tapAsync('BranchVersionWebpackPlugin', (compilation, cb) => {
      // 添加分支版本信息文件
      const branchVersionInfo = getBranchVersionInfo()
      compilation.assets[VERSION_FILES.TXT] = {
        source: () => branchVersionInfo,
        size: () => branchVersionInfo.length
      }
      // 添加前端版本信息文件
      compilation.assets[VERSION_FILES.JSON] = {
        source: () => packageJson.version,
        size: () => branchVersionInfo.length
      }

      cb()
    })
  }
}

module.exports = BranchVersionWebpackPlugin

  • 在vue.config.js文件中引入
// 分支版本信息 - 引入自定义插件
const BranchVersionWebpackPlugin = require('./webpack-plugin/branch-version-webpack-plugin');

module.exports = {
    ...省略
   configureWebpack: {
    entry:'./src/main.js',//入口
    plugins: [
      new BranchVersionWebpackPlugin()
    ],
    ...省略
  },
}
  • 打包在dist目录下生成的version.txt文件内容如下
    buildDate: 2025-05-16 16:50:44

    ip地址: xxxx

    当前分支名:dev

    提交的hash:xxxx

    提交人姓名:xxxxx

    提交日期:2025-05-08 11:52:43

    提交描述:'1'
  
  • 打包在dist目录下生成的version.json文件内容如下
{
  "version": "1.0.0",
  "buildTime": "2025-05-16 16:50:44"
}
vue3 打包生成text文件 和 前端项目的版本号json文件
  • 安装插件
npm install moment --save 
npm install address --save
npm install --save-dev @types/address 
npm install --save-dev @types/moment
npm install @types/node --save-dev

  • 新建 branch-version-webpack-plugin.ts
// vite-branch-version-plugin.ts
import { execSync } from 'child_process';
import { ip } from 'address';
import type { PluginOption, Plugin } from 'vite';
import moment from 'moment';
import fs from 'fs';
import path from 'path';

const needHost = ip() || 'localhost' // 需要更改的ip地址

// 读取 package.json 文件
const packagePath = path.resolve(__dirname, '../package.json');
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));

// 修订当前的版本号
function updateVersion() {
    const [major, minor, patch] = packageJson.version.split('.').map(Number); 
    if(process.argv[4] === 'major') {
      return `${major + 1}.0.0`;
    }
    if(patch > 20) {
      return `${major}.${minor + 1}.0`;
    }
    return `${major}.${minor}.${patch + 1}`;
  }
// 更新项目的版本号
// function getProjectVersion() {
//     return{
//      version: packageJson.version,
//      buildTime: moment().format('YYYY-MM-DD HH:mm:ss')
//     }
//   }
  
// 增加修订号(可以根据需要修改为增加主版本号或次版本号)
packageJson.version = updateVersion()
console.log(`版本号已更新为:${packageJson.version}`);
// 写回 package.json 文件
fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 2)); // 写回 package.json

// 在根目录写入 version.json
// fs.writeFileSync('./version.json', JSON.stringify(getProjectVersion(), null, 2)); // 写入 version.json


interface PluginOptions {
  filename?: string;
  silent?: boolean;
  VERSION_FILES?: string[];
}
function formatDateTime(date?: any) {
    return {
      iso: moment().format(),
      human: moment(date).format('YYYY-MM-DD HH:mm:ss'),
      buildDate: moment().format('YYYY-MM-DD HH:mm:ss'),
      git: moment(date).format('ddd MMM D HH:mm:ss YYYY Z')
    };
  }
  // 获取当前git分支信息
  function getBranchVersionInfo() {
    // 当前分支名
    const vName = execSync('git name-rev --name-only HEAD').toString().trim()
    // 提交的commit hash
    const commitHash = execSync('git show -s --format=%H').toString().trim()
    // 提交人姓名
    const name = execSync('git show -s --format=%cn').toString().trim()
    // 提交日期
    // const date = dateFormat(new Date(execSync('git show -s --format=%cd').toString()))
    const date = formatDateTime(new Date(execSync('git show -s --format=%cd').toString())).human
    // 提交描述
    const message = execSync('git show -s --format=%s').toString().trim()
    // ip
    const ip = needHost
  
    const buildDate = formatDateTime().buildDate
    return `
      buildDate: ${buildDate}\n
      ip地址: ${ip}\n
      当前分支名:${vName}\n
      提交的hash:${commitHash}\n
      提交人姓名:${name}\n
      提交日期:${date}\n
      提交描述:${message}
    `
  }

export default function BranchVersionPlugin(options?: PluginOptions): PluginOption {
  // 合并默认配置(通过 配置象实现)
  const config = {
    filename: 'version.txt',
    silent: false,
    VERSION_FILES: [
      'version.json', // 项目信息文件
      'version.txt', // 版本信息文件
    ],
    ...options,
   
  };

  return {
    name: 'vite-plugin-branch-version',
   
    // 使用 build 阶段的 generateBundle 钩子
    generateBundle() {
        // 核心 emitFile 调用
        // version.json 生成前端版本信息 - 通过读取package.json文件中version字段 写入
        // version.txt 项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息
        config.VERSION_FILES.forEach(file => {
            this.emitFile({
              type: 'asset',
              fileName: file,
              source: file.endsWith('.json') 
                ? JSON.stringify(packageJson.version, null, 2) 
                : getBranchVersionInfo()
            });
          });
      // 核心 emitFile 调用
    //   this.emitFile({
    //     type: 'asset', //文件类型(asset/chunk)
    //     name: 'version-info',      // 唯一标识名称
    //     fileName: config.filename, // 输出文件名
    //     source: getBranchVersionInfo()            // 文件内容
    //   });
    }
  } as Plugin; // 类型断言确保兼容性
}

  • 在vite.config.ts文件中引入
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// 分支版本信息
import BranchVersionPlugin from './webpack-plugin/branch-version-webpack-plugin'
import minimist from 'minimist';
// 解析命令行参数
const argv = minimist(process.argv.slice(2));
console.log(argv, 'argv');

// https://vite.dev/config/
export default defineConfig({
  plugins: [
      vue(), 
      BranchVersionPlugin()],
})

  • 打包在dist 目录下生成的version.txt 和 version.json 文件同上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chirpstack v4版本 全流程部署[ubuntu+docker]

背景介绍 由于chirpstackv3 版本使用的是锐米提供的版本,从网络上寻找的资源大多数都是一样的v3版本,是经过别人编译好发布出来的,原本的chirpsatck项目是运行的linxu环境下的,因此我的想法是在linux服务器上部署chirpsatckv4,暂时使用linux上的chirpstack v4版本,目前编译成e…

数字信号处理-大实验1.1

MATLAB仿真实验目录 验证实验&#xff1a;常见离散信号产生和实现验证实验&#xff1a;离散系统的时域分析应用实验&#xff1a;语音信号的基音周期&#xff08;频率&#xff09;测定 目录 一、常见离散信号产生和实现 1.1 实验目的 1.2 实验要求与内容 1.3 实验…

对抗性机器学习:AI模型安全防护新挑战

随着采用对抗性机器学习&#xff08;Adversarial Machine Learning, AML&#xff09;的AI系统融入关键基础设施、医疗健康和自动驾驶技术领域&#xff0c;一场无声的攻防战正在上演——防御方不断强化模型&#xff0c;而攻击者则持续挖掘漏洞。2025年&#xff0c;对抗性机器学习…

[[春秋云境] Privilege仿真场景

文章目录 靶标介绍&#xff1a;知识点卷影拷贝(VSS) 外网任意文件读取Jenkins管理员后台rdp远程登录Gitlab apiToken 内网搭建代理 Oracle RCESeRestorePrivilege提权mimikatzspn卷影拷贝提取SAM 参考文章 靶标介绍&#xff1a; 在这个靶场中&#xff0c;您将扮演一名资深黑客…

Redis学习打卡-Day3-分布式ID生成策略、分布式锁

分布式 ID 当单机 MySQL 已经无法支撑系统的数据量时&#xff0c;就需要进行分库分表&#xff08;推荐 Sharding-JDBC&#xff09;。在分库之后&#xff0c; 数据遍布在不同服务器上的数据库&#xff0c;数据库的自增主键已经没办法满足生成的主键全局唯一了。这个时候就需要生…

数据库第二次作业--SQL的单表查询与多表查询

单表查询 查询专业信息表中的专业名称和专业类型 SELECT Mname, Mtype FROM MajorP;查询一个学校有多少个专业 SELECT COUNT(Mno) AS 专业数量 FROM MajorP;查询学校的男女学生各有多少位 SELECT Ssex&#xff0c; COUNT(*) AS 人数 FROM StudentP GROUP BY Ssex查询每个专业…

在Cursor中启用WebStorm/IntelliJ风格快捷键

在Cursor中启用WebStorm/IntelliJ风格快捷键 方法一&#xff1a;使用预置快捷键方案 打开快捷键设置 Windows/Linux: Ctrl K → Ctrl SmacOS: ⌘ K → ⌘ S 搜索预设方案 在搜索框中输入keyboard shortcuts&#xff0c;选择Preferences: Open Keyboard Shortcuts (JSON) …

vue3:十三、分类管理-表格--编辑、新增、详情、刷新

一、效果 实现封装表格的新增、编辑、详情查看,表格刷新功能 实现表格组件中表单的封装 1、新增 如下图,新增页面显示空白的下拉,文本框,文本域,并实现提交功能 2、编辑 如下图,点击行数据,可将行数据展示到编辑弹窗,并实现提交功能 3、详情 如下图,点击行数据,…

c#基础01(.Net介绍)

文章目录 .Net平台介绍.Net平台简介跨平台开源.Net Core.Net Framework开发工具安装选项 创建项目 .Net平台介绍 .Net平台简介 .NET是一种用于构建多种应用的免费开源开放平台&#xff0c;例如&#xff1a; Web 应用、Web API 和微服务 云中的无服务器函数 云原生应用 移动…

Logrotate:配置日志轮转、高效管理Linux日志文件

Logrotate 是 Linux 系统中用于自动化管理日志文件的工具&#xff0c;能够定期轮转、压缩、删除日志文件&#xff0c;确保系统日志不会无限制增长&#xff0c;占用过多磁盘空间。 它通常由 Cron 作业定期执行&#xff0c;也可以手动触发。 1. &#x1f527; 核心功能 日志轮转…

贵州某建筑物挡墙自动化监测

1. 项目简介 某建筑物位于贵州省某县城区内&#xff0c;靠近县城主干道&#xff0c;周边配套学校、医院、商贸城。建筑物临近凤凰湖、芙蓉江等水系&#xff0c;主打“湖景生态宜居”。改建筑物总占地面积&#xff1a;约5.3万平方米&#xff1b;总建筑面积&#xff1a;约15万平…

nginx服务器实验

1.实验要求 1&#xff09;在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务。 在Web1、Web2服务器上搭建Tomcat 服务。 2&#xff09;为nginx服务配置虚拟主机&#xff0c;新增两个域名 www.kgc.com 和 www.benet.com&#xff0c;使用http://www.kgc.…

高速光耦在通信行业的应用(五) | 5Mbps通信光耦的特性

针对5MBd速率光耦市场&#xff0c;晶台推出KL2200、KL2201和KL2202系列光耦 ,对标大部分国外品牌产品的应用&#xff1b;它分别由一个红外发射二极管和一个高速集成光电检测器逻辑门组成。 它采用 8 引脚 DIP 封装&#xff0c;并提供 SMD 选项。KL2200 的检测器具有一个三态输出…

Apidog MCP服务器,连接API规范和AI编码助手的桥梁

#作者&#xff1a;曹付江 文章目录 1.了解 MCP2.什么是 Apidog MCP 服务器&#xff1f;3.Apidog MCP 服务器如何工作4.利用人工智能改变开发工作流程5.设置 Apidog MCP 服务器&#xff1a; 分步指南5.高级功能和提示5.1 使用 OpenAPI 规范5.2.多个项目配置5.3.安全最佳实践5.4…

国内MCP服务平台推荐 AIbase推出MCP服务器客户端商店

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度发展&#xff0c;不断改变着我们的生活和工作方式。2025年&#xff0c;AI领域迎来了一项重要的技术进展——MCP(Model Context Protocol&#xff0c;模型上下文协议)的广泛应用。这一技术…

Profinet转Ethernet IP主站网关:点燃氢醌生产线的智慧之光!

案例分享&#xff1a;转角指示器和Profinet转EthernetIP网关的应用 在现代工业自动化中&#xff0c;设备和系统之间的高效通信至关重要。最近&#xff0c;我们在某大型化工企业的生产线上实施了一个项目&#xff0c;旨在通过先进的设备和通信技术提高生产效率和安全性。该项目…

爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案

爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案 这张有趣的图片生动描绘了爬虫开发者与反爬工程师之间的"军备竞赛"。作为技术博主,我将基于这张图的各个阶段,深入分析爬虫技术的演进与对应的反制措施,提供一套完整的反爬解决方案,包括技术原理、实施方法…

[ctfshow web入门] web75

信息收集 启用了open_basedir&#xff0c;所以之前的方法又不能用了 解题 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false …

交流学习 | 江西同为科技有限公司赴海尔总部考察交流

2025年4月8日至9日&#xff0c;江西同为科技有限公司在江西省科技装备商会的带领下&#xff0c;以蔡文君经理为代表&#xff0c;一行人赴山东青岛海尔总部开展两天的考察交流活动。本次考察不仅深入剖析了海尔企业的前沿技术与管理理念&#xff0c;更促进了行业内科技创新、商业…

React方向:react的基本语法-数据渲染

1、安装包(js库) yarn add babel-standalone react react-dom 示例图.png 2、通过依赖包导入js库文件 <script src"../node_modules/babel-standalone/babel.js"></script> <script src"../node_modules/react/umd/react.development.js"&g…