如何使用多个参数将 -ldflags 传递给 exec.Command
How do I pass -ldflags to exec.Command with multiple arguments
我有一个相当简单的 go 文件,它构建了几个用 go 编写的内部工具。在我决定将 -ldflags 添加到我的构建命令之前,它运行良好。以下是格式化 go build
命令的片段。
var cmd *exec.Cmd
file := fmt.Sprintf("%s.%s.%s", p.Bin, e.OS, e.Arch)
if len(p.Flags) > 0 {
ldflags := ""
for _, f := range p.Flags {
if len(ldflags) > 0 {
ldflags = ldflags + " "
}
ldflags = ldflags + f.Flag
}
ldflags = "\"" + ldflags + "\""
fmt.Println("go", "build", "-v", "-a", "-ldflags", ldflags, "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
cmd = exec.Command("go", "build", "-a", "-ldflags", ldflags, "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
} else {
fmt.Println("go", "build", "-v", "-a", "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
cmd = exec.Command("go", "build", "-a", "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
}
cmd.Dir = p.Pkg
cmd.Stdout = ioutil.Discard
cmd.Stderr = os.Stdout
cmd.Env = append(cleanEnv(),
fmt.Sprintf("GOOS=%s", e.OS),
fmt.Sprintf("GOARCH=%s", e.Arch),
)
if err := cmd.Run(); err != nil {
return err
}
我的标志被定义为像这样的简单字符串
[]flagarg{
{Flag:"-X main.buildstamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'`"},
{Flag:"-X main.githash=`git rev-parse --short HEAD`"},
}
下面是我打印时的输出
go build -v -a -ldflags "-X main.buildstamp=`date -u
'+%Y-%m-%d_%I:%M:%S%p'` -X main.githash=`git rev-parse --short HEAD`"
-o /tmp/bin/bro.linux.amd64 .
上面的命令在我将它粘贴到我的 CLI 时有效,但当我通过我的 go 脚本 运行 这个 go build
时失败。当我说失败时,我的意思是它没有设置我的变量 githash
和 buildstamp
。复制和粘贴命令确实按预期设置了这些变量。
我认为它一定是带有引号的东西,我已经尝试改变它们,但我无法让事情正常工作。我开始认为我走错了路,这一定是实现这一目标的更好方法。
问题可能出在 command substitution (backticks);它没有按照您的预期进行,因为它是 shell 的功能,而不是 "go build" 命令的功能。
[]flagarg{
{Flag:"-X main.buildstamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'`"},
// Bash command subst ----^------------------------------^
尝试将打印的命令行作为 "bash -c" 的单个字符串参数执行,例如:
cmd = exec.Command("bash", "-c", "go build -v -a ...")
您可能还想考虑使用 $(...)
形式的 bash 命令替换(我认为它更容易阅读),这里有一个简单的例子来演示:
cmdline := "echo \"The time is now '$(date)'!\""
out, err := exec.Command("bash", "-c", cmdline).Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
// The time is now 'Tue Aug 28 09:33:34 MDT 2018'!
我有一个相当简单的 go 文件,它构建了几个用 go 编写的内部工具。在我决定将 -ldflags 添加到我的构建命令之前,它运行良好。以下是格式化 go build
命令的片段。
var cmd *exec.Cmd
file := fmt.Sprintf("%s.%s.%s", p.Bin, e.OS, e.Arch)
if len(p.Flags) > 0 {
ldflags := ""
for _, f := range p.Flags {
if len(ldflags) > 0 {
ldflags = ldflags + " "
}
ldflags = ldflags + f.Flag
}
ldflags = "\"" + ldflags + "\""
fmt.Println("go", "build", "-v", "-a", "-ldflags", ldflags, "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
cmd = exec.Command("go", "build", "-a", "-ldflags", ldflags, "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
} else {
fmt.Println("go", "build", "-v", "-a", "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
cmd = exec.Command("go", "build", "-a", "-o", fmt.Sprintf("/tmp/bin/%s", file), ".")
}
cmd.Dir = p.Pkg
cmd.Stdout = ioutil.Discard
cmd.Stderr = os.Stdout
cmd.Env = append(cleanEnv(),
fmt.Sprintf("GOOS=%s", e.OS),
fmt.Sprintf("GOARCH=%s", e.Arch),
)
if err := cmd.Run(); err != nil {
return err
}
我的标志被定义为像这样的简单字符串
[]flagarg{
{Flag:"-X main.buildstamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'`"},
{Flag:"-X main.githash=`git rev-parse --short HEAD`"},
}
下面是我打印时的输出
go build -v -a -ldflags "-X main.buildstamp=`date -u
'+%Y-%m-%d_%I:%M:%S%p'` -X main.githash=`git rev-parse --short HEAD`"
-o /tmp/bin/bro.linux.amd64 .
上面的命令在我将它粘贴到我的 CLI 时有效,但当我通过我的 go 脚本 运行 这个 go build
时失败。当我说失败时,我的意思是它没有设置我的变量 githash
和 buildstamp
。复制和粘贴命令确实按预期设置了这些变量。
我认为它一定是带有引号的东西,我已经尝试改变它们,但我无法让事情正常工作。我开始认为我走错了路,这一定是实现这一目标的更好方法。
问题可能出在 command substitution (backticks);它没有按照您的预期进行,因为它是 shell 的功能,而不是 "go build" 命令的功能。
[]flagarg{
{Flag:"-X main.buildstamp=`date -u '+%Y-%m-%d_%I:%M:%S%p'`"},
// Bash command subst ----^------------------------------^
尝试将打印的命令行作为 "bash -c" 的单个字符串参数执行,例如:
cmd = exec.Command("bash", "-c", "go build -v -a ...")
您可能还想考虑使用 $(...)
形式的 bash 命令替换(我认为它更容易阅读),这里有一个简单的例子来演示:
cmdline := "echo \"The time is now '$(date)'!\""
out, err := exec.Command("bash", "-c", cmdline).Output()
if err != nil {
panic(err)
}
fmt.Println(string(out))
// The time is now 'Tue Aug 28 09:33:34 MDT 2018'!