我的
os/exec
模块有一些问题。例如,我使用以下代码运行另一个项目:
**注意到我在 Linux 中创建了一个服务并将其与操作系统一起运行。
[Unit]
Description=Service Name
[Service]
Type=simple
ExecStart=/path/to/binary/file
[Install]
WantedBy=default.target
cmd := exec.Command("go", "run", "./cmd/build/main.go")
cmd.Dir = "/home/username/otherprojectname"
out, err = cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
我收到了类似
exec: "go": executable file not found in $PATH
的错误。然后我在运行命令之前添加了这段代码并且
goPath := ":/usr/local/go/bin"
os.Setenv("PATH", os.Getenv("PATH")+goPath)
newEnv := os.Environ()
cmd := exec.Command("go", "run", "./cmd/build/main.go")
cmd.Env = newEnv
cmd.Dir = "/home/username/otherprojectname"
out, err = cmd.CombinedOutput()
if err != nil {
log.Fatal(err)
}
我也遇到了如下错误,
GOPATH set to GOROOT () has no effect
go: module cache not found: neither GOMODCACHE nor GOPATH is set
但是,当我在没有创建服务的情况下运行此代码时,没有遇到任何错误。
有人可以帮我解决这个问题吗?
要解决您的直接问题,请不要费心去满足
PATH
。
如果您知道
go
二进制文件的完全限定路径,请明确指定它。我怀疑它是在 /usr/local/go/bin
中 — 看起来就是存储 go install
结果的地方。它可能位于 /usr/bin/go
,但可以通过运行 which go
进行确认
cmd := exec.Command("/usr/bin/go", "run", "./cmd/build/main.go")
对于第二个错误,Go 期望构建在模块中。更多信息可以在这里找到,但这就是要点:
go mod init $name
go mod tidy
go build # Or go run
现在为了解决您的总体目标,在 init 服务中动态构建二进制文件是......不典型的。
如果这是运行它的个人或手工制作的服务器,则构建一次二进制文件并复制到
/usr/local/bin/yourprogram
。如果是为了工作,请集中构建并将二进制文件分发到每个实例。这两个都超出了您的问题范围。
如果您确实需要来实现此目的,设置模块应该可以使其正常工作。我仍然建议不要走更好的路线。