cordova-13/scripts/build.ts
2024-12-16 21:30:38 +08:00

105 lines
3.2 KiB
TypeScript

import { readFile, writeFile } from 'node:fs/promises'
import { join } from 'node:path'
import { fileURLToPath } from 'node:url'
import { XMLParser, XMLBuilder } from 'fast-xml-parser'
import consola from 'consola'
// 获取当前文件的目录路径
const __dirname = fileURLToPath(new URL('.', import.meta.url))
// 获取项目根目录路径
const root = join(__dirname, '..')
// 定义配置文件的类型接口
interface AppConfig {
name: string // 应用名称
version: string // 应用版本号
description: string // 应用描述
author: { // 作者信息
name: string // 作者名称
email: string // 作者邮箱
}
homeUrl: string // 应用主页 URL
appId: string // 应用 ID
packType: 'debug' | 'release' // 打包类型
}
/**
* 更新 config.xml 文件的配置
* @param config 应用配置对象
*/
async function updateConfigXml(config: AppConfig) {
// 构建 config.xml 的完整路径
const xmlPath = join(root, 'config.xml')
try {
// 读取现有的 config.xml 文件内容
const xmlContent = await readFile(xmlPath, 'utf-8')
// 创建 XML 解析器实例,配置属性处理选项
const parser = new XMLParser({
ignoreAttributes: false, // 不忽略 XML 属性
attributeNamePrefix: '@_' // 属性名称前缀
})
// 解析 XML 内容为 JavaScript 对象
const xmlObj = parser.parse(xmlContent)
// 更新配置信息
xmlObj.widget['@_version'] = config.version // 更新版本号
xmlObj.widget['@_id'] = config.appId // 更新应用 ID
xmlObj.widget.name = config.name // 更新应用名称
xmlObj.widget.description = config.description // 更新应用描述
xmlObj.widget.author = {
'#text': config.author.name, // 作者名称作为节点文本
'@_email': config.author.email // 邮箱作为属性
}
// 更新或添加 content 标签的 src 属性
if (!xmlObj.widget.content) {
xmlObj.widget.content = { '@_src': config.homeUrl }
} else {
xmlObj.widget.content['@_src'] = config.homeUrl
}
// 创建 XML 构建器实例
const builder = new XMLBuilder({
ignoreAttributes: false,
attributeNamePrefix: '@_',
format: true // 启用格式化输出
})
// 将对象转换回 XML 字符串
const newXmlContent = builder.build(xmlObj)
// 将更新后的内容写回文件
await writeFile(xmlPath, newXmlContent, 'utf-8')
consola.success('config.xml has been updated')
} catch (err) {
consola.error('Failed to update config.xml:', err)
process.exit(1)
}
}
/**
* 主函数:读取配置并执行更新
*/
async function main() {
try {
// 读取 config.json 配置文件
const configPath = join(root, 'config.json')
const configContent = await readFile(configPath, 'utf-8')
const config: AppConfig = JSON.parse(configContent)
// 使用配置更新 config.xml
await updateConfigXml(config)
// TODO: 这里可以添加其他构建步骤
consola.success('Build completed successfully')
} catch (err) {
consola.error('Build failed:', err)
process.exit(1)
}
}
// 执行主函数
main()