dxcqcv [1] filed a deletion request for v2raya [2]: [AUR/PKGBUILD] v2raya_core 的版本号被注入单引号,误报 "core version mismatch"(2.5.10-1 仍存在)
### 版本、安装方式、系统 1. v2rayA 2.5.7-1(已确认 AUR 最新 2.5.10-1 同样受影响) 2. AUR,`yay -S v2raya`,core 由包内 PKGBUILD 自行编译(非官方 installer 包) 3. Arch Linux x86_64,kernel 7.2.9-arch1-1 ### 描述问题 Web UI 会一直显示一块无法关闭的红色横幅: > 核心版本不匹配:v2raya_core 的版本必须与 v2rayA 版本完全一致。 > core version mismatch: the core reports version "'2.5.7'" but v2rayA is "2.5.7"; v2rayA needs the v2raya_core binary of the same version, not xray-core or v2ray-core 但**两个二进制本来就是同一份 v2.5.7 源码树编出来的**,core 也确实是 `v2raya_core` 而非 xray- core/v2ray-core,属误报。原因不是"核心版本不一致",而是 **AUR PKGBUILD 把版本号连同一对单引号一起编进了 core 二进制**。 #### 根因 AUR PKGBUILD(`commit 916ca30` v2.5.7,当前 2.5.10-1 仍在)中两行写法不一致: ```bash # 第 24 行 service:单引号在 shell 层,会被 shell 剥掉 → 正确,conf.Version = "2.5.7" go build -trimpath -ldflags '-X github.com/v2rayA/v2rayA/conf.Version='$pkgver' -s -w' -o v2raya # 第 26 行 core:单引号在双引号内部,shell 不处理,原样交给链接器 → Version = "'2.5.7'" go build -trimpath -ldflags "-X main.Version='$pkgver' -s -w" -o v2raya_core ./main ``` 对照官方 `build.sh:20` 的写法是正确的:`-ldflags="-X main.Version=$version -s -w"`。 后面这条链路把引号变成了误报: 1. core 把版本号原样打印 —— `core/main/version.go:31`: `V2RAYA_CORE %s (based on xray-core %s)` → 实际输出 `V2RAYA_CORE '2.5.7' (based on xray-core 26.7.28)` 2. v2rayA 解析时不剥引号 —— `service/kernel/v2ray/where/where.go:71-75`: ```go fields := strings.Fields(strings.TrimSpace(output.String())) ver = fields[1] // "'2.5.7'",含单引号 ``` 3. 校验是严格相等 —— `service/kernel/v2ray/service/service.go:63`: `if coreVer != serviceVer` → `'2.5.7'` != `2.5.7` 4. 报错用 `%q` 格式化(`service.go:67-73`),所以显示成 `"'2.5.7'"` vs `"2.5.7"`,看起来"两边都是 2.5.7"。 #### 影响 `lastKernelExit: "running"`、`serviceValid: true`,核心启动/配置生成/代理转发都不经过该校验(`CheckCoreVersionMatch()` 全仓库只有一个调用点:`service/server/controller/version.go:35`),所以**功能不受影响,但**: 1. 该横幅是 `dismissible: false`(`gui/src/AppShell.vue:214`),关不掉,且状态写进 localStorage; 2. **它会掩盖真正的故障提示**:`AppShell.vue:214-226` 里 `coreVersionValid === false` 与 `serviceValid === false` 是 `if / else if` 关系,属于前者时后者永远不显示; 3. `/api/version` 会一直返回 `"coreVersionValid": false`,依赖该字段的脚本/面板会读到错误状态。 ### 复现问题的步骤 无需安装,直接用 AUR 包构建即可: ```bash git clone https://aur.archlinux.org/v2raya.git && cd v2raya makepkg -s --noconfirm ./src/v2rayA-2.5.10/core/v2raya_core version # 注意版本号带单引号 # 对比: ./src/v2rayA-2.5.10/service/v2raya --report config | head -1 # 或安装后跑下面的对比 v2raya --version # 2.5.10 v2raya_core version | awk '{print $2}' # '2.5.10' ← 多了单引号,即不匹配 ``` 安装后打开 Web UI 即可看到红色横幅。 ### v2rayA/v2ray运行日志: 本问题不产生日志,它只是 `/api/version` 的一个字段。`journalctl -u v2raya` 里没有任何相关报错,界面也正常,例如: ```json $ curl -s http://127.0.0.1:2017/api/version { "code": "SUCCESS", "data": { "coreVersion": "'2.5.7'", "coreVersionErr": "core version mismatch: the core reports version \"'2.5.7'\" but v2rayA is \"2.5.7\"; ...", "coreVersionValid": false, "lastKernelExit": "running", "serviceValid": true, "variant": "V2rayaCore", "version": "2.5.7" } } ``` ### 建议修复 PKGBUILD 第 26 行(与官方 build.sh 对齐): ```diff -go build -trimpath -ldflags "-X main.Version='$pkgver' -s -w" -o v2raya_core ./main +go build -trimpath -ldflags "-X main.Version=$pkgver -s -w" -o v2raya_core ./main ``` 可选的健壮性改进(次要,不替代上面的修复):`where.GetV2rayServiceVersion()` 取值时顺手剥掉引号,例如 `ver = strings.Trim(fields[1], "'\"")`,以免将来任何打包方式引入引号时又变成误报。 ### v2rayA设置以及相关截图 如有需要我可以补充横幅截图。我的环境未启用 TUN,使用默认的 socks/http 入站(20170/20171)与 DNS(127.2.0.17:53),代理功能一切正常。 PKGBUILD line 26 的版号注入多了一对单引号,会把 '2.5.10' 连引号一起编进 v2raya_core: go build ... -ldflags "-X main.Version='$pkgver' -s -w" -o v2raya_core ./main core 因此自报 `V2RAYA_CORE '2.5.10' (...)`,而 service 侧是干净的 `2.5.10` (对比同文件 line 24 与上游 build.sh:20),导致 CheckCoreVersionMatch 误报 "core version mismatch",Web UI 一直挂着关不掉的红色横幅。 修复: - -ldflags "-X main.Version='$pkgver' -s -w" + -ldflags "-X main.Version=$pkgver -s -w" [1] https://aur.archlinux.org/account/dxcqcv/ [2] https://aur.archlinux.org/pkgbase/v2raya/
