태그 보관물: compilation

compilation

Go 빌드 빌드는 무엇입니까? (go build vs. go install) 알지 못하거나 혼동하는 경우가 많습니다. go build및

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

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



답변

어떤 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 에서 영감을 얻은 질문


답변

패키지 :

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 -igo 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컴파일러 최적화없이 표준 라이브러리에서 패키지 사용을 다시 설치하지 않습니다 .


답변