xzh-vite-plugin-version 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# @xzh/vite-plugin-version
|
|
2
|
+
|
|
3
|
+
> 一个 Vite 插件,用于在构建时生成包含版本信息的 version.json 文件
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 📦 构建时自动生成版本信息
|
|
8
|
+
- 🔧 包含 Git 提交哈希
|
|
9
|
+
- ⚙️ 高度可配置
|
|
10
|
+
- 📝 支持 TypeScript
|
|
11
|
+
- 🌳 支持树摇优化
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @xzh/vite-plugin-version -D
|
|
17
|
+
# 或
|
|
18
|
+
pnpm add @xzh/vite-plugin-version -D
|
|
19
|
+
# 或
|
|
20
|
+
yarn add @xzh/vite-plugin-version -D
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 使用方法
|
|
24
|
+
|
|
25
|
+
### 基础用法
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
// vite.config.ts
|
|
29
|
+
import { defineConfig } from "vite";
|
|
30
|
+
import versionPlugin from "@xzh/vite-plugin-version";
|
|
31
|
+
|
|
32
|
+
export default defineConfig({
|
|
33
|
+
plugins: [versionPlugin()],
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
这会在构建输出目录生成 `version.json` 文件:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"name": "your-project-name",
|
|
42
|
+
"version": "1.0.0",
|
|
43
|
+
"buildTime": "2024-01-01T12:00:00.000Z",
|
|
44
|
+
"gitCommit": "abc1234"
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 高级选项
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import { defineConfig } from "vite";
|
|
52
|
+
import versionPlugin from "@xzh/vite-plugin-version";
|
|
53
|
+
|
|
54
|
+
export default defineConfig({
|
|
55
|
+
plugins: [
|
|
56
|
+
versionPlugin({
|
|
57
|
+
// 自定义输出文件名
|
|
58
|
+
filename: "build-info.json",
|
|
59
|
+
|
|
60
|
+
// 输出到子目录
|
|
61
|
+
outDir: "meta",
|
|
62
|
+
|
|
63
|
+
// 禁用 git 提交哈希
|
|
64
|
+
gitCommit: false,
|
|
65
|
+
|
|
66
|
+
// 自定义转换器
|
|
67
|
+
transform: (info) => ({
|
|
68
|
+
...info,
|
|
69
|
+
appName: "我的应用",
|
|
70
|
+
environment: process.env.NODE_ENV,
|
|
71
|
+
}),
|
|
72
|
+
|
|
73
|
+
// 禁用控制台输出
|
|
74
|
+
verbose: false,
|
|
75
|
+
}),
|
|
76
|
+
],
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 在应用中读取版本信息
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
// 运行时获取
|
|
84
|
+
const versionInfo = await fetch("/version.json").then((r) => r.json());
|
|
85
|
+
console.log(versionInfo.version);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 配置选项
|
|
89
|
+
|
|
90
|
+
| 选项 | 类型 | 默认值 | 描述 |
|
|
91
|
+
| ----------- | --------------- | ---------------------- | ---------------------------- |
|
|
92
|
+
| `name` | `string` | `package.json#name` | 包名 |
|
|
93
|
+
| `version` | `string` | `package.json#version` | 版本号 |
|
|
94
|
+
| `outDir` | `string` | `''` | 输出目录(相对于构建根目录) |
|
|
95
|
+
| `filename` | `string` | `'version.json'` | 输出文件名 |
|
|
96
|
+
| `gitCommit` | `boolean` | `true` | 是否包含 git 提交哈希 |
|
|
97
|
+
| `transform` | `(info) => any` | `undefined` | 自定义转换函数 |
|
|
98
|
+
| `verbose` | `boolean` | `true` | 是否显示控制台输出 |
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
|
|
3
|
+
interface VersionInfo {
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
6
|
+
buildTime: string;
|
|
7
|
+
gitCommit: string;
|
|
8
|
+
}
|
|
9
|
+
interface VersionPluginOptions {
|
|
10
|
+
/**
|
|
11
|
+
* 包名(默认从 process.cwd() 的 package.json 读取)
|
|
12
|
+
*/
|
|
13
|
+
name?: string;
|
|
14
|
+
/**
|
|
15
|
+
* 版本号(默认从 process.cwd() 的 package.json 读取)
|
|
16
|
+
*/
|
|
17
|
+
version?: string;
|
|
18
|
+
/**
|
|
19
|
+
* 输出目录(相对于 build.outDir 或 process.cwd())
|
|
20
|
+
* @default '' (输出到构建根目录)
|
|
21
|
+
*/
|
|
22
|
+
outDir?: string;
|
|
23
|
+
/**
|
|
24
|
+
* 输出文件名
|
|
25
|
+
* @default 'version.json'
|
|
26
|
+
*/
|
|
27
|
+
filename?: string;
|
|
28
|
+
/**
|
|
29
|
+
* 是否获取 git 提交哈希
|
|
30
|
+
* @default true
|
|
31
|
+
*/
|
|
32
|
+
gitCommit?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 自定义版本信息转换器
|
|
35
|
+
*/
|
|
36
|
+
transform?: (info: VersionInfo) => Record<string, any>;
|
|
37
|
+
/**
|
|
38
|
+
* 是否显示控制台输出
|
|
39
|
+
* @default true
|
|
40
|
+
*/
|
|
41
|
+
verbose?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Vite 插件:生成包含构建信息的 version.json 文件
|
|
45
|
+
*/
|
|
46
|
+
declare function versionPlugin(options?: VersionPluginOptions): Plugin;
|
|
47
|
+
|
|
48
|
+
export { type VersionInfo, type VersionPluginOptions, versionPlugin as default, versionPlugin };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
|
|
5
|
+
// src/index.ts
|
|
6
|
+
function versionPlugin(options = {}) {
|
|
7
|
+
const {
|
|
8
|
+
name: pkgName,
|
|
9
|
+
version: pkgVersion,
|
|
10
|
+
outDir = "",
|
|
11
|
+
filename = "version.json",
|
|
12
|
+
gitCommit = true,
|
|
13
|
+
transform,
|
|
14
|
+
verbose = true
|
|
15
|
+
} = options;
|
|
16
|
+
return {
|
|
17
|
+
name: "vite-plugin-version",
|
|
18
|
+
apply: "build",
|
|
19
|
+
writeBundle({ dir }) {
|
|
20
|
+
try {
|
|
21
|
+
let name = pkgName;
|
|
22
|
+
let version = pkgVersion;
|
|
23
|
+
if (!name || !version) {
|
|
24
|
+
const pkgPath = resolve(process.cwd(), "package.json");
|
|
25
|
+
if (fs.existsSync(pkgPath)) {
|
|
26
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
|
|
27
|
+
name = name || pkg.name;
|
|
28
|
+
version = version || pkg.version;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let commitHash = "unknown";
|
|
32
|
+
if (gitCommit) {
|
|
33
|
+
try {
|
|
34
|
+
commitHash = execSync("git rev-parse --short HEAD").toString().trim();
|
|
35
|
+
} catch {
|
|
36
|
+
commitHash = "unknown";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const versionInfo = {
|
|
40
|
+
name: name || "unknown",
|
|
41
|
+
version: version || "0.0.0",
|
|
42
|
+
buildTime: (/* @__PURE__ */ new Date()).toISOString(),
|
|
43
|
+
gitCommit: commitHash
|
|
44
|
+
};
|
|
45
|
+
const finalInfo = transform ? transform(versionInfo) : versionInfo;
|
|
46
|
+
const buildDir = dir || resolve(process.cwd(), "dist");
|
|
47
|
+
const outputPath = resolve(buildDir, outDir, filename);
|
|
48
|
+
const outputDir = resolve(buildDir, outDir);
|
|
49
|
+
if (!fs.existsSync(outputDir)) {
|
|
50
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
fs.writeFileSync(outputPath, JSON.stringify(finalInfo, null, 2), "utf-8");
|
|
53
|
+
if (verbose) {
|
|
54
|
+
console.log("\n\u2705 \u7248\u672C\u4FE1\u606F\u6587\u4EF6\u5DF2\u751F\u6210:");
|
|
55
|
+
console.log(` \u8DEF\u5F84: ${outputPath}`);
|
|
56
|
+
console.log(` \u7248\u672C: ${versionInfo.version}`);
|
|
57
|
+
if (gitCommit) {
|
|
58
|
+
console.log(` Git \u63D0\u4EA4: ${versionInfo.gitCommit}`);
|
|
59
|
+
}
|
|
60
|
+
console.log(` \u6784\u5EFA\u65F6\u95F4: ${versionInfo.buildTime}
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error("\u274C \u751F\u6210\u7248\u672C\u4FE1\u606F\u6587\u4EF6\u5931\u8D25:", error);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
var index_default = versionPlugin;
|
|
71
|
+
|
|
72
|
+
export { index_default as default, versionPlugin };
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { Plugin } from \"vite\";\nimport { resolve } from \"path\";\nimport fs from \"fs\";\nimport { execSync } from \"child_process\";\n\nexport interface VersionInfo {\n name: string;\n version: string;\n buildTime: string;\n gitCommit: string;\n}\n\nexport interface VersionPluginOptions {\n /**\n * 包名(默认从 process.cwd() 的 package.json 读取)\n */\n name?: string;\n /**\n * 版本号(默认从 process.cwd() 的 package.json 读取)\n */\n version?: string;\n /**\n * 输出目录(相对于 build.outDir 或 process.cwd())\n * @default '' (输出到构建根目录)\n */\n outDir?: string;\n /**\n * 输出文件名\n * @default 'version.json'\n */\n filename?: string;\n /**\n * 是否获取 git 提交哈希\n * @default true\n */\n gitCommit?: boolean;\n /**\n * 自定义版本信息转换器\n */\n transform?: (info: VersionInfo) => Record<string, any>;\n /**\n * 是否显示控制台输出\n * @default true\n */\n verbose?: boolean;\n}\n\n/**\n * Vite 插件:生成包含构建信息的 version.json 文件\n */\nexport function versionPlugin(options: VersionPluginOptions = {}): Plugin {\n const {\n name: pkgName,\n version: pkgVersion,\n outDir = \"\",\n filename = \"version.json\",\n gitCommit = true,\n transform,\n verbose = true\n } = options;\n\n return {\n name: \"vite-plugin-version\",\n apply: \"build\",\n writeBundle({ dir }) {\n try {\n // 如果未提供,从 package.json 获取包信息\n let name = pkgName;\n let version = pkgVersion;\n\n if (!name || !version) {\n const pkgPath = resolve(process.cwd(), \"package.json\");\n if (fs.existsSync(pkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n name = name || pkg.name;\n version = version || pkg.version;\n }\n }\n\n // 获取 git 提交哈希\n let commitHash = \"unknown\";\n if (gitCommit) {\n try {\n commitHash = execSync(\"git rev-parse --short HEAD\").toString().trim();\n } catch {\n commitHash = \"unknown\";\n }\n }\n\n // 构建版本信息\n const versionInfo: VersionInfo = {\n name: name || \"unknown\",\n version: version || \"0.0.0\",\n buildTime: new Date().toISOString(),\n gitCommit: commitHash\n };\n\n // 应用自定义转换器\n const finalInfo = transform ? transform(versionInfo) : versionInfo;\n\n // 确定输出路径\n const buildDir = dir || resolve(process.cwd(), \"dist\");\n const outputPath = resolve(buildDir, outDir, filename);\n\n // 确保输出目录存在\n const outputDir = resolve(buildDir, outDir);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // 写入版本文件\n fs.writeFileSync(outputPath, JSON.stringify(finalInfo, null, 2), \"utf-8\");\n\n if (verbose) {\n console.log(\"\\n✅ 版本信息文件已生成:\");\n console.log(` 路径: ${outputPath}`);\n console.log(` 版本: ${versionInfo.version}`);\n if (gitCommit) {\n console.log(` Git 提交: ${versionInfo.gitCommit}`);\n }\n console.log(` 构建时间: ${versionInfo.buildTime}\\n`);\n }\n } catch (error) {\n console.error(\"❌ 生成版本信息文件失败:\", error);\n throw error;\n }\n }\n };\n}\n\nexport default versionPlugin;\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "xzh-vite-plugin-version",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A Vite plugin that generates version.json file with build info",
|
|
5
|
+
"author": "SwordGate",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"vite",
|
|
22
|
+
"plugin",
|
|
23
|
+
"version",
|
|
24
|
+
"build-info"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup",
|
|
28
|
+
"dev": "tsup --watch",
|
|
29
|
+
"prepublishOnly": "pnpm run build"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"vite": ">=4.0.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^20.19.2",
|
|
36
|
+
"tsup": "^8.4.0",
|
|
37
|
+
"typescript": "^5.8.2",
|
|
38
|
+
"vite": "^5.4.11"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=16.0.0"
|
|
42
|
+
},
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/your-username/vite-plugin-version.git"
|
|
46
|
+
},
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/your-username/vite-plugin-version/issues"
|
|
49
|
+
},
|
|
50
|
+
"homepage": "https://github.com/your-username/vite-plugin-version#readme"
|
|
51
|
+
}
|