Go 빌드 빌드는 무엇입니까? (go build vs. go install)


106

새로운 Go 프로그래머는 기본 go build 명령이 수행하는 작업을 알지 못하거나 혼동하는 경우가 많습니다.

go buildgo install명령 은 정확히 무엇을 빌드하고 결과 / 출력을 어디에 배치합니까?


답변:


125

어떤 go명령을 수행하는 것은 우리가 "정상"패키지 실행 여부에 특수에 대한 의존 "main"패키지로 제공된다.

패키지 용

  • go build  패키지를 빌드 한 다음 결과버립니다 .
  • go install그런 다음 builds $GOPATH/pkg 디렉토리에 패키지 를 설치 합니다 .

명령 (패키지 main)

  • go build  명령을 빌드하고 결과를 현재 작업 디렉토리 에 둡니다 .
  • go install임시 디렉토리에 명령을 빌드 한 다음 $GOPATH/bin.

무엇을 전달해야 go build합니까?

빌드하려는 패키지에 패키지 를 전달할 수 있습니다 go build. .go단일 디렉토리에서 파일 목록을 전달할 수도 있으며 , 이는 단일 패키지를 지정하는 소스 파일 목록으로 처리됩니다.

패키지 (가져 오기 경로)가 제공되지 않으면 빌드가 현재 디렉터리에 적용됩니다.

가져 오기 경로에는 하나 이상의 "..."와일드 카드 (이 경우 패턴 ) 가 포함될 수 있습니다 . ...모든 문자열과 일치 할 수 있습니다. 예를 들어 패키지와 하위 폴더에있는 패키지를 net/...일치시킵니다 net. 명령

go build ./...

현재 폴더에 패키지를 빌드하는 데 자주 사용되며 모든 패키지가 다시 반복됩니다. 프로젝트 루트에서 실행 된이 명령은 전체 프로젝트를 빌드합니다.

패키지 지정에 대한 자세한 내용은 go help packages.

모듈에 관하여

Go 모듈에 대한 예비 지원은 Go 1.11에서 도입되었으며 모듈은 Go 1.13부터 기본이되었습니다. 때 go도구 A A이 들어있는 폴더에서 실행 go.mod파일 (또는 현재 폴더의 부모 중 하나)에 go있는 도구가 실행 모듈 인식 모드 (레거시 모드라고 GOPATH 모드 ).

모듈 인식 모드에서 GOPATH는 빌드 중에 가져 오기의 의미를 더 이상 정의하지 않지만 다운로드 된 종속성 (GOPATH / pkg / mod에 있음) 및 설치된 명령 (GOBIN이 설정되지 않은 경우 GOPATH / bin에 있음)을 계속 저장합니다.

모듈을 빌드 할빌드 되는 것은 빌드 목록에 의해 지정됩니다 . 빌드 목록은 처음에 기본 모듈 ( go명령이 실행 되는 디렉토리를 포함하는 모듈) 만 포함 하고 기본 모듈의 종속성이 재귀 적으로 빌드 목록에 추가됩니다 (종속성 종속성도 추가됨).

자세한 내용은 go help modules.


기본적으로 go build패키지를 빌드 할 수 있는지 (종속성과 함께) 확인하는 동시에 go install.NET Framework의 적절한 폴더에 결과를 (영구적으로) 설치할 수 있습니다 $GOPATH.

go build 모든 것이 정상이면 자동으로 종료되고 패키지를 빌드 / 컴파일 할 수없는 경우 오류 메시지가 표시됩니다.

go도구는 패키지 나 바이너리를 설치할 때마다 어떤 종속성도 설치하므로 실행 go install하면 프로그램이 의존하는 패키지 (공개적으로 사용 가능한 "go gettable"패키지)도 자동으로 설치됩니다.

먼저 공식 Go 코드 작성 방법 페이지를 읽어보세요.

go도구 에 대한 추가 정보 : Command go

다음 명령을 실행하여 추가 도움말을 얻을 수도 있습니다.

go help build

Go 1.5로 시작 go install하면 go build( source )에서 만든 실행 파일도 제거 된다는 점도 주목할 가치가 있습니다 .

'go install'(인수없이 현재 디렉토리를 의미)이 성공하면 'go build'로 작성된 실행 파일이 있으면 제거합니다. 이렇게하면 오래된 바이너리가 남지 않습니다.

목록을 완성하기 go run위해 응용 프로그램을 임시 폴더로 컴파일하고 실행 가능한 바이너리를 시작합니다. 앱이 종료되면 임시 파일을 올바르게 정리합니다.

Dave Cheney의 What does go build build 에서 영감을 얻은 질문


1
go install이 이전에 설치된 것과 동일한 경우 실행 파일을 업데이트하지 않는 것이 이상해 보입니다. 여기에 통찰력이 있습니까?
Scott Stensland 2017

14

패키지 :

go build: 패키지를 빌드 한 다음 결과 를 버립니다 .

Go 1.10 (2018 년 1 분기) 이후에는 그렇지 않습니다 . CL 68116CL 75473 덕분 입니다. 여기에서 참조하는 이 스레드를 참조하십시오.

go buildgo install명령 이 정확히 무엇을 빌드 합니까?

go 도구가 패키지 또는 바이너리를 설치할 때마다 종속 항목도 설치하므로 go install을 실행하면 프로그램이 의존하는 패키지 (공개적으로 사용 가능한 "go gettable"패키지)도 자동으로 설치됩니다.

실제로 ... go installGo 1.10에서도 새 캐시 에 추가 됩니다.

" go install"명령은 더 이상 명명 된 패키지의 종속성을 설치하지 않습니다 ( CL 75850 ).

" go install foo" 를 실행하면 설치되는 유일한 항목은foo .

이전에는 다양했습니다. 종속성이 오래된 경우 " go install"도 모든 종속성을 설치했습니다.
" go install" 동안 종속성을 암시 적으로 설치하면 사용자에게 많은 혼란과 골칫거리가 생겼지 만 이전에는 증분 빌드를 활성화해야했습니다.
더 이상은 아닙니다.
우리는 새로운 " install what I said"의미론이 훨씬 더 이해하기 쉬울 것이라고 생각합니다. 특히 많은 사용자가 이미 예상했던 버그 보고서에서 분명하기 때문입니다.
" go install" 동안 종속성을 강제로 설치하려면go install -i " go build -i"및 " go test -i" 과 유사하게 새 " "를 사용하십시오 .

" go install"이 (가) 다시 빌드 된 종속성을 설치하는 데 사용 되었다는 사실은 " "을 -a(를) 의미 하는와 함께 가장 자주 혼동을 일으켰습니다 force rebuild of all dependencies.
이제 " go install -a myprog"는 자신 myprog뿐만 아니라 의 모든 종속성을 완전히 다시 빌드 myprog하지만 myprog설치 만 수행 합니다. (물론 다시 빌드 된 모든 종속성은 여전히 ​​빌드 캐시에 저장됩니다.)
이전보다 종속성을 더 자주 다시 빌드해야하는 좋은 이유를 확인하기 때문에이 사례를 더 이해하기 쉽게 만드는 것은 새로운 콘텐츠 기반 부실 성 분석과 함께 특히 중요합니다. , "내 종속성이 설치되는 이유"혼동이 증가했을 것입니다.
예를 들어 " go install -gcflags=-N myprog" 를 실행 하면myprog컴파일러 최적화없이 빌드되었지만 더 이상 myprog컴파일러 최적화없이 표준 라이브러리에서 패키지 사용을 다시 설치하지 않습니다 .


합니까 go build, 어떻게 get들? 빌드 오류가 cannot find package "github.com/spf13/cobra" in any of:…있습니다. 나는 그것을 얻기 위해 그것을 말하는 방법을 모른다. 명시 적으로 받아야합니까?
ctrl-alt-delor

@ ctrl-alt-delor 어떤 버전의 Go를 사용합니까? 프로젝트에 go.mod파일이 있습니까?
VonC

go version go1.11.4 linux/amd64. 나는 go.mod에 대해 모른다. 저는 다시 https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go빌드하고 있습니다. 방금 전체 패키지를 빌드하고이 예제를 기반으로 사용하고 있으며 작동하는보다 기본적인 버전을 만들었습니다 (이 라이브러리를 사용하지 않음). 콧수염 패키지로 어떻게 설치되지 않았는지 알 수 없습니다.
ctrl-alt-delor

@ cobr이 vendored되도록 CTRL-ALT-delor github.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/...을 . GOPATH가 제대로 설정되어 있습니까?
VonC

나는 당신이 이미 찾은 것을 발견했습니다. 패키지는 공급 업체 하위 디렉토리에 있습니다. 이것이 설치되지 않은 이유입니다. 그러나 지금 빌드에 설치하지 않는 이유를 모르겠습니다. 또는 공급 업체 디렉토리를 사용하는 방법 (내 디렉토리에 복사 한 경우).
ctrl-alt-delor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.