You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go执行exec.Command调用solcjs提示文件不存在但手动运行正常如何解决

原因分析
  • 工作目录不匹配:Go程序运行时的工作目录与手动执行终端命令的目录不一致,相对路径./node_modules/.bin/solcjs是相对于程序运行的工作目录解析的,若该目录下不存在对应路径就会抛出找不到文件的错误。
  • 软链接解析差异:./node_modules/.bin/solcjs是npm生成的软链接,指向实际的可执行文件,Go的exec.Command对相对路径软链接的解析逻辑和原生终端存在差异,也会导致路径识别失败。
  • 运行环境差异:极少数情况下Go程序运行时的用户权限、环境变量等配置与终端会话不一致,也会触发路径解析错误。
解决方案
  1. 切换程序工作目录到项目根目录(即你手动执行命令的目录)后再执行命令,示例代码如下:
package main

import (
        "fmt"
        "os"
        "os/exec"
)

func main() {
  // 替换为你实际的项目根目录绝对路径
  err := os.Chdir("/home/xxx/your-project-path")
  if err != nil {
    panic(err)
  }
  out, err := exec.Command("./node_modules/.bin/solcjs", "--version").Output()
  if err != nil {
    panic(err)
  }
  // out为字节数组,需要转成字符串输出才能看到正常的版本号
  fmt.Println(string(out))
}
  1. 直接通过node调用solcjs的实际入口文件,规避软链接解析问题:
// 确认solc包的路径正确即可,不需要依赖.bin目录下的软链接
out, err := exec.Command("node", "./node_modules/solc/solcjs", "--version").Output()
  1. 若不确定程序运行的工作目录,可添加代码打印当前工作目录确认:
pwd, err := os.Getwd()
if err != nil {
  panic(err)
}
fmt.Println("程序当前工作目录:", pwd)

内容的提问来源于stack exchange,提问作者ade ramdani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 20:36:00