构建与依赖契约
Wippy 项目的标准构建契约
在由 wippy.exe 启动的 Wippy 应用或模块仓库中,请调用仓库的 Make 目标。不要直接运行包管理器或 Vite 构建命令。
每个生产前端目标的 Makefile 配方都使用:
npm run build -- --outDir <target> --emptyOutDir
部署构建拥有 <target>。vite.config.ts 不得硬编码部署输出目录。
不由 wippy.exe 启动的平台/包源码仓库(例如 Web Host 源码)使用该仓库 package.json 中声明的确切脚本和参数。Wippy 模块的 --outDir <target> --emptyOutDir 配方不适用于包源码仓库,除非其自身声明的脚本明确记载了这些参数。
Makefile
FRONTEND_OUTPUT := $(abspath app/src/app/static/example)
.PHONY: frontend-example
frontend-example:
cd frontend/example && npm run build -- --outDir "$(FRONTEND_OUTPUT)" --emptyOutDir
make.ps1
Windows 用户通过 make.bat 调用对应目标。make.ps1 为 Windows 实现该 Makefile 目标;它不是一个独立的公开构建接口。
param(
[Parameter(Position = 0)]
[string]$Target = "help"
)
$ErrorActionPreference = "Stop"
$targets = @("frontend-example")
if ($Target -notin $targets) {
throw "Unknown target '$Target'. Available targets: $($targets -join ', ')"
}
$Output = "app/src/app/static/example"
$resolvedOutput = [System.IO.Path]::GetFullPath(
[System.IO.Path]::Combine($PSScriptRoot, $Output)
)
Push-Location (Join-Path $PSScriptRoot "frontend/example")
try {
npm.cmd run build -- --outDir $resolvedOutput --emptyOutDir
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
finally {
Pop-Location
}
make.bat
make.bat 只是委托给它的 PowerShell 对应脚本、转发参数并返回其退出码。
对于示例目标,Windows 用户运行 make.bat frontend-example。
@powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0make.ps1" %*
@exit /b %ERRORLEVEL%
import map 快照算法
目标 Web Host 版本定义了宿主提供的模块。
- 确定目标 Web Host 的发布标签。
- 在开发期间获取一次
https://web-host.wippy.ai/<release-tag>/import-map.json。 - 保存发布标签、解析出的确切 URL、完整的
imports对象,以及所获取 import map 载荷字节的小写 SHA-256。 - 把该
imports对象中的每个 key 外部化。 - 无宿主模式使用同一份完整快照。
- 当宿主版本变更时,或当新添加的依赖可能已由宿主提供时,重新获取。
- 检查构建产物,拒绝快照中不存在的裸导入。
不要维护手写的包列表。不要把完整的外部集合镜像进 peer dependencies。
import hostImportMap from './wippy-import-map.json'
export default {
build: {
rollupOptions: {
external: Object.keys(hostImportMap.imports),
},
},
}
快照必须包含其来源和哈希。快照中不存在的依赖会被打包进产物,除非另有成文的构建规则适用。
例如,如果所选发布标签是 v1.2.3,唯一的标准快照 URL 就是
https://web-host.wippy.ai/v1.2.3/import-map.json。不要替换为本地应用 URL、未固定版本的 latest URL,或手工重建的包列表。