Skip to content

Root config: Add env config#6400

Merged
RPRX merged 14 commits into
XTLS:mainfrom
OneXray:run-set-env
Jul 10, 2026
Merged

Root config: Add env config#6400
RPRX merged 14 commits into
XTLS:mainfrom
OneXray:run-set-env

Conversation

@yiguodev

@yiguodev yiguodev commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

修改内容

新增配置根 env,使用结构化 EnvConfig 配置可运行时重载的 Xray 环境项,并在配置构建时应用。

xray run --env 已移除;xray.json.strictxray.location.configxray.location.confdir 继续通过进程环境变量提供。

验证

  • go test ./main ./common/platform ./infra/conf ./infra/conf/serial -count=1

AI 辅助:GPT-5.5 Extra High

Copilot AI review requested due to automatic review settings June 29, 2026 09:37

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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/--env flag (backed by cmdarg.Arg) and apply the provided KEY=VALUE pairs via os.Setenv at the start of executeRun.
  • Add applyRunEnvVars helper to parse and validate KEY=VALUE inputs.
  • Add unit tests covering valid and invalid --env values.

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.

Comment thread main/run.go Outdated
Comment thread main/run_env_test.go Outdated
@RPRX

RPRX commented Jul 3, 2026

Copy link
Copy Markdown
Member

之前我想给配置文件加个 env 结构但有些地方读 env 是在 init() 里的就搁置了,你这个 PR 没问题吗

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

AI 梳理了一下,确实不行。目前仅支持以下 env 可用。

xray.location.config
xray.location.confdir
xray.location.asset
xray.location.cert
xray.cone.disabled
xray.tun.fd

后续可以单独开 PR 优化一下。

@RPRX

RPRX commented Jul 4, 2026

Copy link
Copy Markdown
Member

说实话这个 PR 可能不会合,你都命令行启动了,命令行本来就能设临时环境变量

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

你说的对。
不过这个 PR 核心就解决一个场景,就是 Windows 上 UAC 提权启动的时候,是没有可靠手段来设置或者传递环境变量的。
大概位置在 https://github.com/OneXray/OneXray/blob/ae9e3f61ddb7033fdaa8648794d6833b6d19be04/lib/core/ffi/windows_ffi_api.dart#L50

@RPRX

RPRX commented Jul 4, 2026

Copy link
Copy Markdown
Member

Windows 上设临时环境变量需要多行,你就不能弄个特权命令行再启动 Xray 吗

@RPRX

RPRX commented Jul 4, 2026

Copy link
Copy Markdown
Member

总之你要真想加这种东西就加个 env 根配置,用的人还更多一些,然后有些 init() 的看看能不能改成延时读取啥的

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

OK。我再研究研究。

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

目前有三个 env 设置没法放到配置里。

xray.json.strict
xray.location.config
xray.location.confdir

计划分成两部分,--env 可以设置这三个 key,其他 key 统一由配置文件更新。

@RPRX

RPRX commented Jul 4, 2026

Copy link
Copy Markdown
Member

读配置文件之前的 env 那确实没办法,但还是我说的,命令行本来就能设临时环境变量,感觉没必要徒增复杂度

@RPRX

RPRX commented Jul 4, 2026

Copy link
Copy Markdown
Member

就是说有一种多打包进了一个 wxray.exe 的那种感觉

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

其实做这个修改主要想在 Windows 和 Linux 上直接用官方裸核,原来 libXray 是有一层 wrapper 的。

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

算了,PR 先关了。我再想想用哪种方式更好一些。

@yiguodev yiguodev closed this Jul 4, 2026
@RPRX

RPRX commented Jul 4, 2026

Copy link
Copy Markdown
Member

PR 不用关,改成配置文件里写 env 就行

我的意思是通过命令行加临时环境变量本来就不用改 Xray 的代码,你研究一下

@RPRX RPRX reopened this Jul 4, 2026
@yiguodev yiguodev changed the title Add --env flag to xray run Support structured env config reload Jul 4, 2026
@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author
  1. 除 xray.tun.fd 外,单元测试已覆盖所有 key 。
  2. xray.tun.fd,xray.location.asset 已经通过所有平台的实机测试。

@yiguodev

yiguodev commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator Author

已同步添加文档。

XTLS/Xray-docs-next#874

@RPRX

RPRX commented Jul 8, 2026

Copy link
Copy Markdown
Member

所以 Xray run 那个 ReloadEnvSettings() 是否有必要

@yiguodev

yiguodev commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator Author

已调整:ReloadEnvSettings() 现在只在创建 Xray instance 前调用一次。

具体改动:

  • 删除 main/run.go 的启动入口 reload;
  • 删除 core.LoadConfig() 的 reload;
  • 删除 core.New() / core.NewWithContext() 各自重复的 reload;
  • 在它们共同进入的 initInstanceWithConfig() 开头统一 reload;
  • ApplyConfigEnvSettings() 现在只负责写入配置根 env 到进程环境,不再立即 reload;rollback 也只恢复环境变量。

这样配置根 env 仍会在 instance 初始化前统一生效,调用点也只保留一处。

@RPRX

RPRX commented Jul 8, 2026

Copy link
Copy Markdown
Member

别啥都丢给 AI 啊,我是让你思考,比如说由于有 geo 的 env,配置加载前也要有

@yiguodev

yiguodev commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator Author

重新梳理和优化了一下,逻辑上没问题了。

xray.location.config
xray.location.confdir
xray.json.strict

这三个本身配置内 env 是不支持的,也不受 reload 的影响。

xray.location.asset
xray.location.cert

这两个会在 Config.Build() 内使用, 但是直接读取 env ,不依赖 reload。读取前 env 已经生效。

其余的

xray.buf.readv
xray.buf.splice
xray.vmess.padding
xray.cone.disabled
xray.ray.buffer.size
xray.browser.dialer
xray.xudp.show
xray.xudp.basekey
xray.tun.fd

均在 initInstanceWithConfig 之后读取。

@RPRX

RPRX commented Jul 8, 2026

Copy link
Copy Markdown
Member

@yiguodev 把配置解析 env 的优先级提到最前面就可以在配置中写那两个 env 了

@yiguodev

yiguodev commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator Author

目前的执行顺序是对的。

https://github.com/XTLS/Xray-core/pull/6400/changes#diff-2683dbaba14bc856bb5c6f6e664313d25dd246b4e262deb3e886579b4f48a3b4R570

ApplyConfigEnvSettings 在第一行。

xray.location.asset
xray.location.cert

读到的就是 config 里配置的 env value 。

@RPRX

RPRX commented Jul 9, 2026

Copy link
Copy Markdown
Member

感觉配置解析的代码有点啰嗦了,不能简化为 for 加上 os.SetEnv 吗,不要一个个都写出来,另外需要支持 _ 的格式

这样的话由于 ReloadEnvSettings() 主要是回调调用,只放启动 instance 前那一处似乎没问题,因为那两个 env 不需要回调

@RPRX

RPRX commented Jul 9, 2026

Copy link
Copy Markdown
Member

env_reload.go 里似乎也不需要把所有 env 都列出来,都走 os 包来存取就行,这个文件似乎也能大幅简化代码

@yiguodev

yiguodev commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

感觉配置解析的代码有点啰嗦了,不能简化为 for 加上 os.SetEnv 吗,不要一个个都写出来,另外需要支持 _ 的格式

这样的话由于 ReloadEnvSettings() 主要是回调调用,只放启动 instance 前那一处似乎没问题,因为那两个 env 不需要回调

这块是有意设计,本意是限制开发者不要随意设置 env ,只暴露支持的 env key。
我再简化一下。

@RPRX

RPRX commented Jul 9, 2026

Copy link
Copy Markdown
Member

但是以后若加个 env 要改很多处就很难绷,按现在的写法加个 env 要改至少四个文件

@yiguodev

yiguodev commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator Author

重新简化了一版。支持的 key 已进行运行时验证,读取正常。

@RPRX

RPRX commented Jul 9, 2026

Copy link
Copy Markdown
Member

不用搞查表加限制,直接写入就行,效果和在 Xray 外设置的 env 一样

@RPRX

RPRX commented Jul 9, 2026

Copy link
Copy Markdown
Member

比如这里甚至能写作用于 Go 的 env(前提是它的代码是实时读取 env),区别只是解析配置文件后这里的 env 才生效

@Fangliding

Copy link
Copy Markdown
Member

AI特有的只完成任务不管后面维护

@RPRX

RPRX commented Jul 9, 2026

Copy link
Copy Markdown
Member

就是说我想要的很简单,配置解析那里按原样 os.SetEnv 就行,别搞这么复杂

@yiguodev

Copy link
Copy Markdown
Collaborator Author

已重新简化。(新模型确实牛逼,意图理解明显提升。

@RPRX

RPRX commented Jul 10, 2026

Copy link
Copy Markdown
Member

这才是我想要的代码,简单直接,之前的代码太复杂了

@yiguodev 所以你测过现在的代码针对 asset 和 cert 有效果吧

@yiguodev

Copy link
Copy Markdown
Collaborator Author

已经针对每个 key 做过读取前 print ,可以正确输出。

@RPRX RPRX changed the title Support structured env config reload Root config: Add env config Jul 10, 2026
@RPRX

RPRX commented Jul 10, 2026

Copy link
Copy Markdown
Member

差不多就这样吧,文档记得把 env 加到最上面,包括侧边栏,特性是 #6400 (comment)

@RPRX RPRX merged commit d5bc58d into XTLS:main Jul 10, 2026
40 checks passed
@yiguodev yiguodev deleted the run-set-env branch July 10, 2026 03:17
Meo597 added a commit to XTLS/Xray-docs-next that referenced this pull request Jul 11, 2026
XTLS/Xray-core#6400

---------

Co-authored-by: yiguodev <147401898+yiguodev@users.noreply.github.com>
Meo597 added a commit to XTLS/Xray-docs-next that referenced this pull request Jul 11, 2026
XTLS/Xray-core#6400

Co-authored-by: yiguodev <147401898+yiguodev@users.noreply.github.com>
Meo597 added a commit to XTLS/Xray-docs-next that referenced this pull request Jul 11, 2026
XTLS/Xray-core#6400

Co-authored-by: yiguodev <147401898+yiguodev@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants