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'