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'
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} `
}
const packagePath = path. resolve ( __dirname, '../package.json' ) ;
const packageJson = JSON . parse ( fs. readFileSync ( packagePath, 'utf8' ) ) ;
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 ) ) ;
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 = [ '星期一' , '星期二' , '星期三' , '星期四' , '星期五' , '星期六' , '星期天' ] const week = weekArr[ date. getDay ( ) ] 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
}
function getBranchVersionInfo ( ) { const vName = execSync ( 'git name-rev --name-only HEAD' ) . toString ( ) . trim ( ) 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 ( ) const ip = needHostconst buildDate = getNowDate ( ) return ` buildDate: ${ buildDate} \nip地址: ${ ip} \n当前分支名: ${ vName} \n提交的hash: ${ commitHash} \n提交人姓名: ${ name} \n提交日期: ${ date} \n提交描述: ${ message} `
}
class BranchVersionWebpackPlugin { constructor ( options ) { } 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
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:44ip地址: 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
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'
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 } ` ; }
packageJson. version = updateVersion ( )
console . log ( ` 版本号已更新为: ${ packageJson. version} ` ) ;
fs. writeFileSync ( packagePath, JSON . stringify ( packageJson, null , 2 ) ) ;
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' ) } ; } function getBranchVersionInfo ( ) { const vName = execSync ( 'git name-rev --name-only HEAD' ) . toString ( ) . trim ( ) const commitHash = execSync ( 'git show -s --format=%H' ) . toString ( ) . trim ( ) const name = execSync ( 'git show -s --format=%cn' ) . toString ( ) . trim ( ) const date = formatDateTime ( new Date ( execSync ( 'git show -s --format=%cd' ) . toString ( ) ) ) . humanconst message = execSync ( 'git show -s --format=%s' ) . toString ( ) . trim ( ) const ip = needHostconst buildDate = formatDateTime ( ) . buildDatereturn ` buildDate: ${ buildDate} \nip地址: ${ 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' , generateBundle ( ) { config. VERSION_FILES . forEach ( file => { this . emitFile ( { type : 'asset' , fileName: file, source: file. endsWith ( '.json' ) ? JSON . stringify ( packageJson. version, null , 2 ) : getBranchVersionInfo ( ) } ) ; } ) ; } } as Plugin;
}
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' ) ;
export default defineConfig ( { plugins: [ vue ( ) , BranchVersionPlugin ( ) ] ,
} )
打包在dist 目录下生成的version.txt 和 version.json 文件同上