在chsrc执行 命令时 遇到错误会强制退出
你操作了什么?
发生了什么?
在chsrc运行底层命令时,如遇到错误总是会提示意外退出
本应该怎么样?
应给予更友好的提示处理
chsrc 版本
v0.2.2-2025/07/26
你使用的是哪个操作系统?
Linux
OS 版本 / OS 发行版
manjaro
Log 输出
[chsrc 运行] pnpm config get registry
ENOENT spawnSync npm ENOENT
pnpm: spawnSync npm ENOENT
at Object.spawnSync (node:internal/child_process:1120:20)
at Object.spawnSync (node:child_process:910:24)
at spawn.spawnSync [as sync] (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:14786:26)
at runScriptSync (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:134874:45)
at runNpm (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:134862:14)
at configGet (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:135032:59)
at Object.handler (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:135386:46)
at /usr/lib/node_modules/pnpm/dist/pnpm.cjs:198750:52
at async main (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:198716:34)
at async runPnpm (/usr/lib/node_modules/pnpm/dist/pnpm.cjs:198983:5)
[chsrc 运行] x 命令执行失败,退出状态: 65024
chsrc: 关键错误,强制结束
防止重复问题
- [x] 我已在项目中搜索过类似的 issue
根据我搜索到的结果,这似乎是由于pnpm不可用导致的,可能导致的原因:网络、程序未实际安装、系统等,需要进一步信息以进行排查
https://github.com/arco-design/arco-cli/issues/83
问题:
- 请问您直接在命令行中执行
pnpm --version有结果吗? - 如果您用 everything 或其他搜索软件搜索
pnpm.有哪些结果?如下图所示
根据我搜索到的结果,这似乎是由于pnpm不可用导致的,可能导致的原因:网络、程序未实际安装、系统等,需要进一步信息以进行排查
问题:
1. 请问您直接在命令行中执行 `pnpm --version` 有结果吗? 2. 如果您用 everything 或其他搜索软件搜索 `pnpm.` 有哪些结果?如下图所示![]()
错误的原因是 pnpm 写死依赖 npm 但在linux npm包和nodejs为分开形式,所以只安装nodejs 和 pnpm会触发这个问题, 但我觉得应该忽略错误的 命令, 继续执行 例如 yarn npm 正确的 而不是意外退出 并返回查询不到的错误码
@ccmywish 你啥看法?
反正目前chsrc大抵是遵循“少做少错”的原则,在换源过程中任意一步出错即退出(除了极少数特殊的情景以外)。毕竟,忽略了前一步的错误可能导致后一步出现更多的问题
不过这里折仨的逻辑是分开的,我感觉可接受(
@Mikachu2333 提到的 "前一步的错误可能导致后一步出现更多的问题" 是有道理的
这个问题实际变成了:每一个 follower target 之间有没有依赖关系。
- 如果没有依赖关系,前一个 follower target 的执行失败不应该影响后一个
- 如果后一个依赖前一个,前一个的失败就应该影响后一个
目前使用 Target Group Mode 的两个就是 Python 和 JavaScript,都是对包管理器的处理,按理说,每个包管理器都是独立的,没什么直接联系。
chsrc 关于命令的错误处理不太明白, 之前java的设计是取第二行(maven home:),现在虽然遍历所有,但是对于找不到是没有做到异常处理的,对于底层命令的异常输出, 似乎没有做到在framework 的处理, 也没有在 具体实现中处理, 期望是, framework 处理 错误的 退出码, 具体实现处理自己的查找不到自己或者其他逻辑。 例如
➜ /workspace git:(bingchunmoli) ./chsrc-debug get mvnd
[chsrc 检查] x 命令 mvn 不存在
[chsrc 检查] x 命令 gradle 不存在
[chsrc 检查] ✓ 命令 mvnd 存在
[main] WARNING org.mvndaemon.mvnd.client.DaemonParameters - Falling back to finding JAVA_HOME by running java executable available in PATH. You may want to avoid this time consuming task by setting JAVA_HOME environment variable or by passing java.home system property through command line or in one of mvnd configuration files.
Exception in thread "main" java.lang.IllegalStateException: Could not get value for Environment.JAVA_HOME from any of the following sources: value: java.home, property java.home in /workspace/.mvn/mvnd.properties, property java.home in /root/.m2/mvnd.properties, property java.home in /workspace/maven-mvnd-1.0.2-linux-amd64/conf/mvnd.properties, system property java.home, environment variable JAVA_HOME, java command
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.couldNotgetValue(DaemonParameters.java:681)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.lambda$orFail$8(DaemonParameters.java:656)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.get(DaemonParameters.java:691)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.get(DaemonParameters.java:686)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue$1.get(DaemonParameters.java:753)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.asPath(DaemonParameters.java:712)
at org.mvndaemon.mvnd.client.DaemonParameters.javaHome(DaemonParameters.java:168)
at org.mvndaemon.mvnd.client.DaemonConnector.connect(DaemonConnector.java:100)
at org.mvndaemon.mvnd.client.DefaultClient.execute(DefaultClient.java:353)
at org.mvndaemon.mvnd.client.DefaultClient.main(DefaultClient.java:171)
at [email protected]/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
[chsrc 提示] 请查看 Terminal: org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jni.linux.LinuxNativePty/conf/settings.xml
mvnd -v 原始输出(其实是没安装jdk 找不到java环境变量的问题)
➜ /workspace git:(bingchunmoli) mvnd -v
[main] WARNING org.mvndaemon.mvnd.client.DaemonParameters - Falling back to finding JAVA_HOME by running java executable available in PATH. You may want to avoid this time consuming task by setting JAVA_HOME environment variable or by passing java.home system property through command line or in one of mvnd configuration files.
Apache Maven Daemon (mvnd) 1.0.2 linux-amd64 native client (cccc1ec8a5b741c62b29f9fb04d37b1678a029bb)version
Terminal: org.jline.terminal.impl.PosixSysTerminal with pty org.jline.terminal.impl.jni.linux.LinuxNativePty
Exception in thread "main" java.lang.IllegalStateException: Could not get value for Environment.JAVA_HOME from any of the following sources: value: java.home, property java.home in /workspace/.mvn/mvnd.properties, property java.home in /root/.m2/mvnd.properties, property java.home in /workspace/maven-mvnd-1.0.2-linux-amd64/conf/mvnd.properties, system property java.home, environment variable JAVA_HOME, java command
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.couldNotgetValue(DaemonParameters.java:681)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.lambda$orFail$8(DaemonParameters.java:656)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.get(DaemonParameters.java:691)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.get(DaemonParameters.java:686)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue$1.get(DaemonParameters.java:753)
at org.mvndaemon.mvnd.client.DaemonParameters$EnvValue.asPath(DaemonParameters.java:712)
at org.mvndaemon.mvnd.client.DaemonParameters.javaHome(DaemonParameters.java:168)
at org.mvndaemon.mvnd.client.DaemonConnector.connect(DaemonConnector.java:100)
at org.mvndaemon.mvnd.client.DefaultClient.execute(DefaultClient.java:353)
at org.mvndaemon.mvnd.client.DefaultClient.main(DefaultClient.java:171)
at [email protected]/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
chsrc 关于命令的错误处理不太明白, 之前java的设计是取第二行(maven home:),现在虽然遍历所有,但是对于找不到是没有做到异常处理的,对于底层命令的异常输出, 似乎没有做到在framework 的处理, 也没有在 具体实现中处理, 期望是, framework 处理 错误的 退出码, 具体实现处理自己的查找不到自己或者其他逻辑。
看 #268 我的回复,实现了 xy_run_capture() 直接得到 stdout 的输出,忽视 stderr。