105 lines
3.2 KiB
TypeScript
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()
|