Support structured env config reload#6400
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a repeatable --env KEY=VALUE flag to xray run, applying environment variables before config load and before -test / -dump / normal startup, improving reliability in launch scenarios where environment inheritance is unreliable (e.g., Windows elevation).
Changes:
- Add a repeatable
-env/--envflag (backed bycmdarg.Arg) and apply the providedKEY=VALUEpairs viaos.Setenvat the start ofexecuteRun. - Add
applyRunEnvVarshelper to parse and validateKEY=VALUEinputs. - Add unit tests covering valid and invalid
--envvalues.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| main/run.go | Adds --env flag wiring, applies env vars before config-related actions, and documents the new flag. |
| main/run_env_test.go | Adds tests for applyRunEnvVars behavior (success cases and invalid input rejection). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
之前我想给配置文件加个 |
|
AI 梳理了一下,确实不行。目前仅支持以下 env 可用。 后续可以单独开 PR 优化一下。 |
|
|
|
你说的对。 |
|
|
|
总之你要真想加这种东西就加个 |
|
OK。我再研究研究。 |
|
目前有三个 env 设置没法放到配置里。 计划分成两部分,--env 可以设置这三个 key,其他 key 统一由配置文件更新。 |
|
读配置文件之前的 env 那确实没办法,但还是我说的,命令行本来就能设临时环境变量,感觉没必要徒增复杂度 |
|
|
|
其实做这个修改主要想在 Windows 和 Linux 上直接用官方裸核,原来 libXray 是有一层 wrapper 的。 |
|
算了,PR 先关了。我再想想用哪种方式更好一些。 |
|
PR 不用关,改成配置文件里写 env 就行 我的意思是通过命令行加临时环境变量本来就不用改 Xray 的代码,你研究一下 |
|
|
已同步添加文档。 |
|
新开配置块的话要不要给默认配置文件标个编号 docker install doc 里目前是都有 |
|
已补充 |
|
文档把 env 移到“基础配置”吧,这个的确更应该跟配置项们放一起 |
|
文档已调整 |
|
没看你那个 test 是咋写的但如果只是读取、验证的话盲猜没用,因为你这个读取、验证不是在 写 test 用处不大,要把 |
|
只是AI干什么都喜欢写个test而已 |
现在 init 里已经不读取环境变量了。 |
|
核心的修改思路是保留原有的包内变量,但改为实时读取,并加入 reload 机制。 |
|
env 全放一个地方统一读取,本来在 init 里要初始化变量啥的改为在启动 Xray Instance 之前统一回调,这个思路没啥问题 不过把 test 全删了吧,感觉没必要 |
|
已处理:删除了这次新增的 env reload / root env 相关测试,只保留实现逻辑。 本地验证:
其中 |
|
调用 ReloadEnvSettings() 的地方似乎有几处没必要?似乎只保留启动 Xray Instance 之前那处就行了 |
|
|
|
所以 Xray run 那个 ReloadEnvSettings() 是否有必要 |
|
已调整: 具体改动:
这样配置根 |
|
|
|
重新梳理和优化了一下,逻辑上没问题了。 这三个本身配置内 env 是不支持的,也不受 reload 的影响。 这两个会在 其余的 均在 |
|
@yiguodev 把配置解析 env 的优先级提到最前面就可以在配置中写那两个 env 了 |
|
目前的执行顺序是对的。 ApplyConfigEnvSettings 在第一行。 读到的就是 config 里配置的 env value 。 |
|
感觉配置解析的代码有点啰嗦了,不能简化为 for 加上 os.SetEnv 吗,不要一个个都写出来,另外需要支持 这样的话由于 ReloadEnvSettings() 主要是回调调用,只放启动 instance 前那一处似乎没问题,因为那两个 env 不需要回调 |
|
env_reload.go 里似乎也不需要把所有 env 都列出来,都走 os 包来存取就行,这个文件似乎也能大幅简化代码 |
这块是有意设计,本意是限制开发者不要随意设置 env ,只暴露支持的 env key。 |
|
|
|
重新简化了一版。支持的 key 已进行运行时验证,读取正常。 |
修改内容
新增配置根
env,使用结构化EnvConfig配置可运行时重载的 Xray 环境项,并在配置构建时应用。xray run --env已移除;xray.json.strict、xray.location.config、xray.location.confdir继续通过进程环境变量提供。验证
go test ./main ./common/platform ./infra/conf ./infra/conf/serial -count=1AI 辅助:GPT-5.5 Extra High