golangソースコードをコンパイルするためにシステムから呼び出される外部bashスクリプトがあり、bash
いくつかの変数を設定できます。このスクリプトはgolang-build.eclass。このスクリプトのビルド機能は次のとおりです。
golang-build_src_compile() {
debug-print-function ${FUNCNAME} "$@"
ego_pn_check
set -- env GOPATH="${WORKDIR}/${P}:$(get_golibdir_gopath)" \
GOCACHE="${T}/go-cache" \
go build -v -work -x ${EGO_BUILD_FLAGS} "${EGO_PN}"
echo "$@"
"$@" || die
}
外部で設定できる唯一のことはEGO_BUILD_FLAGS
変数です。
このスクリプトの問題は、EGO_BUILD_FLAGS
変数に引用符を使用しようとしていることです。たとえば、次のようになります。
EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""
ビルドスクリプトはecho
実行する正しいコマンドを印刷(使用)しますが、実際のコマンドはエラーで失敗しますinvalid value "\"-X" for flag -ldflags
。プリントをコピーして手動で実行すると、正常に完了します。
以下は、この現象を再現する単純化されたバージョンです。
EGO_BUILD_FLAGS="-ldflags \"-X main.buildVersion=0\""
set -- go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
echo "$@"
"$@"
出力:
go build -x -ldflags "-X main.buildVersion=0" github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing =<value> in <pattern>=<value>
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.
ここの最初の行は作業コマンドであり、期待したように見えます。ここで質問は、、、$4
です。"-X
$5
main.buildVersion=0"
set
正しいビルドパラメータを場所パラメータとしてスクリプト変数に渡すために引用符をエスケープできますか?
ここで考えられる唯一の解決策は、外部スクリプトファイル内のコマンドにアクセスできないEGO_BUILD_FLAGS
変数を変更することです。set -- ...
ベストアンサー1
引用は簡単です。二重引用符の代わりに一重引用符を使用できます。
EGO_BUILD_FLAGS='-ldflags "-X main.buildVersion=0"'
しかし、これが問題の原因ではありません。
$ go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing =<value> in <pattern>=<value>
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.
問題は、変数の内容を単一の値として渡すことです。以下を実行すると、何が起こるかを確認してくださいset -x
。
$ set -x
$ go build -x ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
+ go build -x -ldflags '"-X' 'main.buildVersion=0"' github.com/g4s8/gitstrap/cmd/gitstrap
invalid value "\"-X" for flag -ldflags: missing =<value> in <pattern>=<value>
usage: go build [-o output] [-i] [build flags] [packages]
Run 'go help build' for details.
最も簡単な解決策は、変数から削除し-ldflags
て渡したい値のみを保存することです-ldflags
。その後、必要に応じて変数を使用できます。
EGO_BUILD_FLAGS='-X main.buildVersion=0'
go build -x -ldflags ${EGO_BUILD_FLAGS} github.com/g4s8/gitstrap/cmd/gitstrap
これがオプションでない場合は、代わりに配列を使用できます。
EGO_BUILD_FLAGS=('-ldflags' '-X' 'main.buildVersion=0')
go build -x "${EGO_BUILD_FLAGS[@]}" github.com/g4s8/gitstrap/cmd/gitstrap
最後に、変数に設定した値を引用できません。
EGO_BUILD_FLAGS='-ldflags -X main.buildVersion=0'