使用 os/exec golang 执行命令时的环境

问题描述 投票:0回答:1

我的

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

但是,当我在没有创建服务的情况下运行此代码时,没有遇到任何错误。

有人可以帮我解决这个问题吗?

go command
1个回答
0
投票

要解决您的直接问题,请不要费心去满足

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
。如果是为了工作,请集中构建并将二进制文件分发到每个实例。这两个都超出了您的问题范围。

如果您确实需要来实现此目的,设置模块应该可以使其正常工作。我仍然建议不要走更好的路线。

© www.soinside.com 2019 - 2024. All rights reserved.