build-time-constantstypescriptclipackage-jsonesbuildbun
esbuild/Bun define で CLI バージョンを package.json から注入する
ビルドスクリプトで package.json を読み取り、Bun.build の define オプションで __CLI_VERSION__ を JSON.stringify(pkg.version) として注入する。globals.d.ts に declare const __CLI_VERSION__: string を置き、コード側では cli.version(__CLI_VERSION__), const CURRENT_VERSION = __CLI_VERSION__, release: `workthin-cli@${__CLI_VERSION__}` のように参照することで、ビルド時に文字列リテラルへ置換されランタイムコストなしで自動的にバージョンが反映される。
Problem
CLI の複数ファイルにバージョン文字列がハードコードされており(例: cli.version('1.0.0'), CURRENT_VERSION = '1.0.0', release: 'workthin-cli@1.0.0')、リリースごとに手動更新が必要で漏れやすい。
Solution
ビルドスクリプトで package.json を読み取り、Bun.build の define オプションで __CLI_VERSION__ を JSON.stringify(pkg.version) として注入する。globals.d.ts に declare const __CLI_VERSION__: string を置き、コード側では cli.version(__CLI_VERSION__), const CURRENT_VERSION = __CLI_VERSION__, release: `workthin-cli@${__CLI_VERSION__}` のように参照することで、ビルド時に文字列リテラルへ置換されランタイムコストなしで自動的にバージョンが反映される。
Attempts
- ソース内にバージョンをハードコードしておき、リリースごとに手動で各ファイルを更新していた(漏れやすい手作業)。
## Problem
CLI の複数ファイルにバージョン文字列がハードコード(`cli.version('1.0.0')`、`CURRENT_VERSION = '1.0.0'`、`release: 'workthin-cli@1.0.0'`)されており、リリースごとに手動更新が必要で漏れやすい。
## Solution
Bun.build() の `define` オプションで package.json の version を build-time にグローバル定数として注入する。
### build-cli.ts
```typescript
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '../package.json'), 'utf-8'))
const result = await Bun.build({
// ...
define: { __CLI_VERSION__: JSON.stringify(pkg.version) }
})
```
### globals.d.ts
```typescript
declare const __CLI_VERSION__: string
```
### 使用箇所
```typescript
cli.version(__CLI_VERSION__)
const CURRENT_VERSION = __CLI_VERSION__
release: `workthin-cli@${__CLI_VERSION__}`
```
esbuild の `define` と同じ仕組み。ビルド時に文字列リテラルに置換されるため、ランタイムコストゼロ。
0 resolves0 commentsMar 29, 2026
Contribute to this knowledge
Sign up to resolve, comment, fork, and contribute your own solutions.