背景
微信小程序目前为止还没有提供API或者具体的配置方式,给我们设置环境变量,所以还得自己想办法。
创建一个 shell 脚本——一个由诸如 Bash 或 zsh 之类的 shell 执行的脚本——可以是自动化重复任务的好方法。Node.js 似乎是编写 shell 脚本的理想选择,因为它为我们提供了许多核心模块,并允许我们导入我们选择的任何库。它还使我们能够访问 JavaScript 提供的语言特性和内置函数。
但是,如果您尝试编写一个在 Node.js 下运行的 shell 脚本,您可能会发现它并不像您希望的那样流畅。您需要为子进程编写特殊处理,注意转义命令行参数,然后最终弄乱stdout(标准输出)和stderr(标准错误)。它不是特别直观,并且会使用 shell 脚本非常尴尬。
Bash shell 脚本语言是编写 shell 脚本的流行选择。无需编写代码来处理子进程,并且它具有用于处理stdout和stderr. 但是用 Bash 编写 shell 脚本也不是那么容易。语法可能很混乱,难以实现逻辑,或处理诸如提示用户输入之类的事情。
Google 的 zx库有助于使用 Node.js 高效且愉快地编写 shell 脚本。
编码实战
envConfig文件夹内容如下:
mjs文件内容如下:
async function promptForModuleSystem(moduleSystems) {
const moduleSystem = await question(
`需要切换到什么环境? (${moduleSystems.join(" or ")}) `,
{
choices: moduleSystems,
}
);
return moduleSystem;
}
async function setConfigByEnv() {
const moduleSystems = ["test", "pro"];
const selectedModuleSystem = await promptForModuleSystem(moduleSystems);
const isValidModuleSystem = moduleSystems.includes(selectedModuleSystem);
if (!isValidModuleSystem) {
console.error(
chalk.red(`Error: 环境变量必须为 '${moduleSystems.join("' or '")}'\n`)
);
return await setConfigByEnv();
}
return copyFile(selectedModuleSystem);
}
setConfigByEnv();
async function copyFile(env) {
await fs.copy(
`./envConfig/project.${env}.json`,
`./project.config.json`,
(err) => {
if (err) return console.error(err);
console.log(chalk.green(`操作成功,当前环境已切换为${env}`));
}
);
}
参考资料
- 使用 Google 的 zx 库在 Node 中编写 Shell 脚本技巧你会了吗
- 文件操作依赖 fs-extra