chsrc icon indicating copy to clipboard operation
chsrc copied to clipboard

在chsrc执行 命令时 遇到错误会强制退出

Open combinx opened this issue 4 months ago • 9 comments

你操作了什么?

Image

发生了什么?

在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

combinx avatar Aug 19 '25 02:08 combinx

根据我搜索到的结果,这似乎是由于pnpm不可用导致的,可能导致的原因:网络、程序未实际安装、系统等,需要进一步信息以进行排查

https://github.com/arco-design/arco-cli/issues/83

问题:

  1. 请问您直接在命令行中执行 pnpm --version 有结果吗?
  2. 如果您用 everything 或其他搜索软件搜索 pnpm. 有哪些结果?如下图所示
Image

Mikachu2333 avatar Aug 19 '25 06:08 Mikachu2333

根据我搜索到的结果,这似乎是由于pnpm不可用导致的,可能导致的原因:网络、程序未实际安装、系统等,需要进一步信息以进行排查

arco-design/arco-cli#83

问题:

1. 请问您直接在命令行中执行 `pnpm --version` 有结果吗?

2. 如果您用 everything 或其他搜索软件搜索 `pnpm.` 有哪些结果?如下图所示
Image

错误的原因是 pnpm 写死依赖 npm 但在linux npm包和nodejs为分开形式,所以只安装nodejs 和 pnpm会触发这个问题, 但我觉得应该忽略错误的 命令, 继续执行 例如 yarn npm 正确的 而不是意外退出 并返回查询不到的错误码

combinx avatar Aug 19 '25 08:08 combinx

Image

combinx avatar Aug 19 '25 08:08 combinx

Image

combinx avatar Aug 19 '25 08:08 combinx

@ccmywish 你啥看法?

反正目前chsrc大抵是遵循“少做少错”的原则,在换源过程中任意一步出错即退出(除了极少数特殊的情景以外)。毕竟,忽略了前一步的错误可能导致后一步出现更多的问题

不过这里折仨的逻辑是分开的,我感觉可接受(

Mikachu2333 avatar Aug 19 '25 08:08 Mikachu2333

@Mikachu2333 提到的 "前一步的错误可能导致后一步出现更多的问题" 是有道理的

这个问题实际变成了:每一个 follower target 之间有没有依赖关系。

  • 如果没有依赖关系,前一个 follower target 的执行失败不应该影响后一个
  • 如果后一个依赖前一个,前一个的失败就应该影响后一个

目前使用 Target Group Mode 的两个就是 Python 和 JavaScript,都是对包管理器的处理,按理说,每个包管理器都是独立的,没什么直接联系。

ccmywish avatar Aug 19 '25 11:08 ccmywish

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

combinx avatar Aug 20 '25 03:08 combinx

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)

combinx avatar Aug 20 '25 03:08 combinx

chsrc 关于命令的错误处理不太明白, 之前java的设计是取第二行(maven home:),现在虽然遍历所有,但是对于找不到是没有做到异常处理的,对于底层命令的异常输出, 似乎没有做到在framework 的处理, 也没有在 具体实现中处理, 期望是, framework 处理 错误的 退出码, 具体实现处理自己的查找不到自己或者其他逻辑。

看 #268 我的回复,实现了 xy_run_capture() 直接得到 stdout 的输出,忽视 stderr。

ccmywish avatar Aug 20 '25 11:08 ccmywish