我在使用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
型
但是,当我在不创建服务的情况下运行这段代码时,我没有遇到任何错误。
有人能帮我解决这个问题吗?
1条答案
按热度按时间nzk0hqpo1#
为了回答你的直接问题,不要费心去满足
PATH
。如果您知道
go
二进制文件的完全限定路径,请显式指定它。我怀疑它在/usr/local/go/bin
中-这看起来是存储go install
结果的位置。它可能位于/usr/bin/go
,但通过运行which go
进行确认字符串
对于第二个错误,这是Go期望内置在一个模块中。更多信息can be found here,但这是要点:
型
现在,为了实现您的总体目标,在init服务中动态构建二进制文件是不典型的。
如果这是一个运行它的个人服务器或手工制作的服务器,那么构建一次二进制文件并复制到
/usr/local/bin/yourprogram
。如果是工作,那么集中构建并将二进制文件分发到每个示例。这两个都超出了你的问题的范围。如果你真的需要这样做,设置模块应该可以让它工作。我仍然建议走一条更好的路线。