uni-app发布时动态修改manifest.json有延迟
uni-app发布时动态修改manifest.json有延迟
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
HbuilderX | 3.98 |
示例代码:
// 发布时动态修改 manifest.json
const manifestPath = path.resolve(__dirname, './manifest.json')
let Manifest = fs.readFileSync(manifestPath, {
encoding: 'utf-8'
});
function replaceManifest(path, value) {
const arr = path.split('.');
const len = arr.length;
const lastItem = arr[len - 1];
let i = 0;
let ManifestArr = Manifest.split(/\n/);
for (let index = 0; index < ManifestArr.length; index++) {
const item = ManifestArr[index];
if (new RegExp(`"${arr[i]}"`).test(item)) ++i;
if (i === len) {
const hasComma = /,/.test(item);
ManifestArr[index] = item.replace(
new RegExp(`"${lastItem}"[\\s\\S]*:[\\s\\S]*`),
`"${lastItem}": ${value}${hasComma ? ',' : ''}`
);
break;
}
}
Manifest = ManifestArr.join('\n');
}
// 使用 "/qyppzs_gzh/wx/"
replaceManifest('h5.router.base', "\"/qyppzs_gzh/jtm9\"");
fs.writeFileSync(manifestPath, Manifest, {
flag: 'w',
});
在 uni-app
中,manifest.json
文件是项目的配置文件,通常用于设置应用的基本信息、权限、启动页等。在发布时,如果需要动态修改 manifest.json
文件,可能会遇到延迟问题。以下是一些可能的原因和解决方案:
可能的原因
-
编译缓存:
uni-app
在编译时会缓存manifest.json
文件的内容。如果动态修改后没有清除缓存,可能会导致修改未生效。 -
编译顺序: 如果动态修改
manifest.json
的操作发生在编译过程中或编译之后,可能会导致修改未被正确应用到最终的打包文件中。 -
HBuilderX 工具问题: 如果你使用的是 HBuilderX 工具,可能存在工具本身的缓存或延迟问题。
-
文件读写延迟: 如果动态修改
manifest.json
是通过脚本或程序实现的,可能会因为文件读写操作的延迟导致修改未及时生效。
解决方案
1. 清除缓存
在修改 manifest.json
后,手动清除 uni-app
的编译缓存:
- 删除
unpackage
文件夹(uni-app
的编译输出目录)。 - 在 HBuilderX 中,点击菜单栏的 运行 -> 清除缓存并重新运行。
2. 确保修改在编译前完成
确保动态修改 manifest.json
的操作在编译开始之前完成。可以通过以下方式实现:
- 在自定义脚本中,先修改
manifest.json
,再触发编译命令。 - 使用
npm scripts
或shell
脚本,确保修改和编译的顺序正确。
3. 使用 HBuilderX 插件
如果你使用的是 HBuilderX,可以尝试编写插件来动态修改 manifest.json
,并确保插件在编译前执行。
4. 手动修改并重新编译
如果动态修改的延迟问题无法解决,可以尝试手动修改 manifest.json
文件,并重新编译项目。
5. 使用环境变量
如果需要根据不同的环境动态配置 manifest.json
,可以使用环境变量来控制。例如:
- 在
manifest.json
中引用环境变量。 - 在编译时通过命令行传递环境变量。
6. 检查文件读写操作
如果动态修改是通过脚本实现的,确保文件读写操作的同步性。例如,使用 fs.writeFileSync
而不是 fs.writeFile
。
示例:通过脚本动态修改 manifest.json
以下是一个通过 Node.js 脚本动态修改 manifest.json
的示例:
const fs = require('fs');
const path = require('path');
// 读取 manifest.json
const manifestPath = path.resolve(__dirname, 'src/manifest.json');
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
// 动态修改配置
manifest.name = 'MyApp';
manifest.version = '1.0.0';
// 写回 manifest.json
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
console.log('manifest.json 已更新');