使用lerna run时Vue指定模式构建被忽略的问题排查
问题原因及解决方法
核心原因:工作目录不匹配
通过Lerna从根目录执行lerna run build-test --scope @company/web-app时,部分Lerna版本或配置会让脚本的执行工作目录停留在项目根目录,而非子包@company/web-app的目录。
Vue CLI加载.env系列文件是基于当前工作目录(process.cwd())查找的:它会优先读取当前目录下的.env.test,找不到则 fallback 到默认.env。如果Lerna在根目录执行脚本,Vue CLI会去根目录找.env.test(大概率不存在),最终加载根目录的.env,而非子包目录下的.env.test。
另外还有两种可能的诱因:
- 项目根目录本身存在
.env文件,Vue CLI会向上读取父目录的环境文件,覆盖子包的配置优先级 - Lerna执行脚本时传递了额外环境变量,干扰了Vue CLI的mode识别
解决方法
强制在子包目录执行脚本
用lerna exec替代lerna run,该命令默认会进入目标子包目录执行后续命令:lerna exec --scope @company/web-app -- npm run build-test --include-dependencies明确指定环境文件路径
修改子包package.json的build-test脚本,通过--env-file参数直接指定.env.test的路径:"build-test": "vue-cli-service build --mode test --env-file ./env.test"这样无论工作目录在哪,Vue CLI都会加载子包目录下的目标环境文件。
调整Lerna配置
在根目录lerna.json中添加配置,强制npm在子包目录执行脚本:{ "npmClientArgs": ["--prefix", "./packages/web-app"] }注意将
./packages/web-app替换为你的子包实际路径。清理根目录环境文件
如果根目录存在.env文件,可直接删除;若需要保留,可在子包的.env.test中添加更高优先级的配置(Vue CLI中.env.[mode]优先级高于上级目录的.env)。
内容的提问来源于stack exchange,提问作者Haim
相关产品推荐
相关产品推荐

