[eggjs/egg]配置自定义环境无效

2025-11-04 751 views
1
What happens?

按照文档使用EGG_SERVER_ENV=release npm start启动,并未读取config.release.ts文件。在 CI上跑的时候报了如下错误:

连接的是本地的redis,即为开发环境的配置文件。config.release.ts中链接的是阿里云redis数据库的endpoint。

而使用EGG_SERVER_ENV=release npm run dev启动时则读取到config.release.ts,会报错连远端redis timeou了。

Context Node V12.18.0: Egg 2.26.1: Mac OSX:

回答

7

为什么不直接用 prod ?

3

prod环境也有配置,业务需要有多个生产环境。这个本身应该是egg的bug

1

https://github.com/eggjs/egg-core/blob/77e11f5fb38b3646fb20deb78bbc239b06bf8349/lib/loader/mixin/plugin.js#L157

可以考虑用 scope 这个特性(未正式 document,但我们内部都这么用,跟你场景一样)

1

我本地试了下,是可以加载的,是不是 tsc 没编译啥的?

提供下最小可复现仓库。

0

有可能,但我这边tsc编译后会报很多类型错误。这个在之前的版本是没有的。。

5

没太看懂,这个scope与EGG_SERVER_ENV是相关联的么

7

这么多报错,你先检查下是不是 config.relase.js 没生成吧。

8

没太看懂,这个scope与EGG_SERVER_ENV是相关联的么

是它的补充,看 https://github.com/eggjs/egg-core/blob/afa89c1b2ce89a2f8994943905172ee1bab6f77e/test/loader/mixin/load_config.test.js#L169 这个用例

0

生成倒是生成了。那些报错是在tsc出现的,直接运行npm start就没问题。。另外tsc在原先的版本是可以的,更新 了最新版egg后就出了这问题。

8

提供最小可复现仓库吧。

1

经检验是 typescript和全局tsc版本不一致导致,升级依赖包里的typescript版本即可。tsc成功后 使用EGG_SERVER_SCOPE成功读取config.release_prod.js配置文件。

2

抱歉,放在CI里仍然读不到release_prod。

2

这不是 bug,是你写错。

extend/context 里面的 this 就是 ctx,为啥还要 const { ctx } = this

ci 的看下前面的启动日志咯,这种问题,可以自己看看日志,分析下报错堆栈的。

所有的源码都已经在 egg-core 那里了,我们这个都是有单测保障的,如果你有问题,给出最小可复现方式,我们再来跟进,谢谢。

你截个图,我也只能干看不是么?最多看看我本地运行正不正常,看看单测正不正常,然后还能干嘛?

1

https://eggjs.github.io/zh/guide/config.html#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

6

本地用相同命令跑是可以的,依赖包也都是一样的。会不会是ubuntu16.04 环境下 那样传环境变量 有问题?

5

看下日志不就得了。。。

2

我这里npm start后并没有打出上面的环境变量的相关日志。。

最新版的egg和egg-scripts

7

start 是正式环境,直接写文件了。

https://eggjs.github.io/zh/guide/logger.html#%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E8%BE%93%E5%87%BA%E4%BD%8D%E7%BD%AE

都写的清清楚楚的

4

环境变量确实读到了。上图是CI环境的日志。是用config.release_prod.ts这样命名么?

8

没太看懂,这个scope与EGG_SERVER_ENV是相关联的么

是它的补充,看 https://github.com/eggjs/egg-core/blob/afa89c1b2ce89a2f8994943905172ee1bab6f77e/test/loader/mixin/load_config.test.js#L169 这个用例

5

是啊,tsc得到config.release_prod.js。 EGG_SERVER_ENV=prod EGG_SERVER_SCOPE=release。这样应该没错吧。是否会 一同读取 到 config.prod.js?

8

当然会,你跑下那个 fixtures 或写个最小可复现仓库试试就知道了。

npm script 可以改为 egg-scripts start --serverScope=release

1

@yyh1102

推荐在./config/config.prod.js 导入所需要的多环境(stag / preprod / ...)配置文件进行合并,在package.json添加以下命令按需启动:

"stag": "egg-scripts start --daemon --title=egg-server-egg-example",

"preprod": "egg-scripts start --daemon --title=egg-server-egg-example",

./config/config.prod.js 判断依据为:

process.env.npm_lifecycle_event == 'stag'

process.env.npm_lifecycle_event == 'preprod'

自动化上线按环境运行不同的启动脚本予以区分开配置信息 npm run stag / npm run preprod