From 45ecfa5591c575b755daa13da88100ecc23b254c Mon Sep 17 00:00:00 2001 From: harrywan Date: Mon, 8 Dec 2025 16:32:36 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(builder):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BF=A1=E6=81=AF=E7=94=9F=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在构建过程中自动生成包含项目名称、版本号、构建时间等信息的 version.json 和 version.txt 文件 --- .../builder-vite/src/features/versionEmit.ts | 41 ++++++++++++++++ packages/builder-vite/src/index.ts | 1 + packages/builder-vite/tsup.config.ts | 1 + packages/builder-webpack/src/index.ts | 1 + .../src/plugins/features/versionEmit.ts | 47 +++++++++++++++++++ packages/builder-webpack/tsup.config.ts | 3 +- 6 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 packages/builder-vite/src/features/versionEmit.ts create mode 100644 packages/builder-webpack/src/plugins/features/versionEmit.ts diff --git a/packages/builder-vite/src/features/versionEmit.ts b/packages/builder-vite/src/features/versionEmit.ts new file mode 100644 index 00000000..c6fad4e7 --- /dev/null +++ b/packages/builder-vite/src/features/versionEmit.ts @@ -0,0 +1,41 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import process from 'node:process'; + +export default (api: IPluginAPI) => { + api.modifyBundleConfig((memo: any) => { + const versionPlugin = { + name: 'fes-version-emit', + generateBundle() { + const pkgPath = join(process.cwd(), 'package.json'); + let name = ''; + let version = ''; + if (existsSync(pkgPath)) { + try { + const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) || {}; + name = pkg.name || ''; + version = pkg.version || ''; + } + catch {} + } + + const info = { + name, + version, + buildTime: new Date().toISOString(), + builder: 'vite', + nodeEnv: process.env.NODE_ENV, + }; + + (this as any).emitFile({ type: 'asset', fileName: 'version.json', source: `${JSON.stringify(info, null, 2)}\n` }); + const txt = `name: ${info.name}\nversion: ${info.version}\nbuildTime: ${info.buildTime}\nbuilder: ${info.builder}\nnodeEnv: ${info.nodeEnv ?? ''}\n`; + (this as any).emitFile({ type: 'asset', fileName: 'version.txt', source: txt }); + }, + }; + + memo.plugins = memo.plugins || []; + memo.plugins.push(versionPlugin); + return memo; + }); +}; diff --git a/packages/builder-vite/src/index.ts b/packages/builder-vite/src/index.ts index 8008b68f..ed980676 100644 --- a/packages/builder-vite/src/index.ts +++ b/packages/builder-vite/src/index.ts @@ -19,6 +19,7 @@ export default function (): BuilderPlugin { join(OWNER_DIR, 'dist/features/viteOption.mjs'), join(OWNER_DIR, 'dist/features/viteVueJsx.mjs'), join(OWNER_DIR, 'dist/features/viteVuePlugin.mjs'), + join(OWNER_DIR, 'dist/features/versionEmit.mjs'), join(OWNER_DIR, 'dist/features/viteAnalyze.mjs'), join(OWNER_DIR, 'dist/features/viteLegacy.mjs'), diff --git a/packages/builder-vite/tsup.config.ts b/packages/builder-vite/tsup.config.ts index 8896efef..c1aa91ce 100644 --- a/packages/builder-vite/tsup.config.ts +++ b/packages/builder-vite/tsup.config.ts @@ -10,6 +10,7 @@ export default defineConfig({ 'src/features/viteOption.ts', 'src/features/viteVueJsx.ts', 'src/features/viteVuePlugin.ts', + 'src/features/versionEmit.ts', 'src/features/viteAnalyze.ts', 'src/features/viteLegacy.ts', 'src/commands/build/index.ts', diff --git a/packages/builder-webpack/src/index.ts b/packages/builder-webpack/src/index.ts index edbf248c..72b5fe3a 100644 --- a/packages/builder-webpack/src/index.ts +++ b/packages/builder-webpack/src/index.ts @@ -31,6 +31,7 @@ export default function () { join(__dirname, './plugins/features/extraBabelPresets.mjs'), join(__dirname, './plugins/features/extraPostCSSPlugins.mjs'), join(__dirname, './plugins/features/html.mjs'), + join(__dirname, './plugins/features/versionEmit.mjs'), join(__dirname, './plugins/features/lessLoader.mjs'), join(__dirname, './plugins/features/postcssLoader.mjs'), join(__dirname, './plugins/features/nodeModulesTransform.mjs'), diff --git a/packages/builder-webpack/src/plugins/features/versionEmit.ts b/packages/builder-webpack/src/plugins/features/versionEmit.ts new file mode 100644 index 00000000..6d629e5a --- /dev/null +++ b/packages/builder-webpack/src/plugins/features/versionEmit.ts @@ -0,0 +1,47 @@ +import type { IPluginAPI } from '@fesjs/shared'; +import { existsSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import process from 'node:process'; +import webpack from 'webpack'; + +class VersionEmitPlugin { + apply(compiler: webpack.Compiler) { + compiler.hooks.thisCompilation.tap('VersionEmitPlugin', (compilation) => { + compilation.hooks.processAssets.tap({ name: 'VersionEmitPlugin', stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, () => { + const pkgPath = join(process.cwd(), 'package.json'); + let name = ''; + let version = ''; + if (existsSync(pkgPath)) { + try { + const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) || {}; + name = pkg.name || ''; + version = pkg.version || ''; + } + catch {} + } + + const info = { + name, + version, + buildTime: new Date().toISOString(), + builder: 'webpack', + nodeEnv: process.env.NODE_ENV, + }; + + const jsonSource = new webpack.sources.RawSource(`${JSON.stringify(info, null, 2)}\n`); + const txt = `name: ${info.name}\nversion: ${info.version}\nbuildTime: ${info.buildTime}\nbuilder: ${info.builder}\nnodeEnv: ${info.nodeEnv ?? ''}\n`; + const txtSource = new webpack.sources.RawSource(txt); + compilation.emitAsset('version.json', jsonSource); + compilation.emitAsset('version.txt', txtSource); + }); + }); + } +} + +export default (api: IPluginAPI) => { + api.modifyBundleConfig((memo: any) => { + memo.plugins = memo.plugins || []; + memo.plugins.push(new VersionEmitPlugin()); + return memo; + }); +}; diff --git a/packages/builder-webpack/tsup.config.ts b/packages/builder-webpack/tsup.config.ts index 27c6ac5f..ba12aa4b 100644 --- a/packages/builder-webpack/tsup.config.ts +++ b/packages/builder-webpack/tsup.config.ts @@ -20,6 +20,7 @@ export default defineConfig({ 'src/plugins/features/extraBabelPresets.ts', 'src/plugins/features/extraPostCSSPlugins.ts', 'src/plugins/features/html.ts', + 'src/plugins/features/versionEmit.ts', 'src/plugins/features/lessLoader.ts', 'src/plugins/features/postcssLoader.ts', 'src/plugins/features/nodeModulesTransform.ts', @@ -35,7 +36,7 @@ export default defineConfig({ dts: true, shims: true, format: ['esm'], - onSuccess() { + onSuccess: async () => { copySync('src/plugins/commands/index-default.html', 'dist/plugins/commands/index-default.html'); }, }); From c8ce8eba53e92ec714ad54b9bcdba0f73a205d0a Mon Sep 17 00:00:00 2001 From: harrywan Date: Mon, 8 Dec 2025 17:21:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(builder):=20=E7=BB=9F=E4=B8=80=E4=BD=BF?= =?UTF-8?q?=E7=94=A8api.paths.cwd=E8=8E=B7=E5=8F=96=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改vite和webpack构建器的版本信息插件,不再直接使用process.cwd(),而是通过api.paths.cwd获取工作目录路径,确保路径获取的一致性 --- packages/builder-vite/src/features/versionEmit.ts | 2 +- packages/builder-webpack/src/plugins/features/versionEmit.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/builder-vite/src/features/versionEmit.ts b/packages/builder-vite/src/features/versionEmit.ts index c6fad4e7..b793bb88 100644 --- a/packages/builder-vite/src/features/versionEmit.ts +++ b/packages/builder-vite/src/features/versionEmit.ts @@ -8,7 +8,7 @@ export default (api: IPluginAPI) => { const versionPlugin = { name: 'fes-version-emit', generateBundle() { - const pkgPath = join(process.cwd(), 'package.json'); + const pkgPath = join(api.paths.cwd, 'package.json'); let name = ''; let version = ''; if (existsSync(pkgPath)) { diff --git a/packages/builder-webpack/src/plugins/features/versionEmit.ts b/packages/builder-webpack/src/plugins/features/versionEmit.ts index 6d629e5a..4aaad6f7 100644 --- a/packages/builder-webpack/src/plugins/features/versionEmit.ts +++ b/packages/builder-webpack/src/plugins/features/versionEmit.ts @@ -5,10 +5,11 @@ import process from 'node:process'; import webpack from 'webpack'; class VersionEmitPlugin { + constructor(private cwd: string) {} apply(compiler: webpack.Compiler) { compiler.hooks.thisCompilation.tap('VersionEmitPlugin', (compilation) => { compilation.hooks.processAssets.tap({ name: 'VersionEmitPlugin', stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, () => { - const pkgPath = join(process.cwd(), 'package.json'); + const pkgPath = join(this.cwd, 'package.json'); let name = ''; let version = ''; if (existsSync(pkgPath)) { @@ -41,7 +42,7 @@ class VersionEmitPlugin { export default (api: IPluginAPI) => { api.modifyBundleConfig((memo: any) => { memo.plugins = memo.plugins || []; - memo.plugins.push(new VersionEmitPlugin()); + memo.plugins.push(new VersionEmitPlugin(api.paths.cwd)); return memo; }); };