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

jchrr9hc  于 6个月前  发布在  Go
关注(0)|答案(1)|浏览(81)

我在使用os/exec模块时遇到了一些问题。例如,我使用以下代码运行另一个项目:

**注意到我在Linux中创建了一个服务,并将其与操作系统一起运行。

[Unit]
Description=Service Name

[Service]
Type=simple
ExecStart=/path/to/binary/file

[Install]
WantedBy=default.target

个字符
我得到了一个像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


但是,当我在不创建服务的情况下运行这段代码时,我没有遇到任何错误。
有人能帮我解决这个问题吗?

nzk0hqpo

nzk0hqpo1#

为了回答你的直接问题,不要费心去满足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期望内置在一个模块中。更多信息can be found here,但这是要点:

go mod init $name
go mod tidy
go build  # Or go run


现在,为了实现您的总体目标,在init服务中动态构建二进制文件是不典型的。
如果这是一个运行它的个人服务器或手工制作的服务器,那么构建一次二进制文件并复制到/usr/local/bin/yourprogram。如果是工作,那么集中构建并将二进制文件分发到每个示例。这两个都超出了你的问题的范围。
如果你真的需要这样做,设置模块应该可以让它工作。我仍然建议走一条更好的路线。

相关问题