go get과 go install의 차이점은 무엇입니까?


83

잠시 go동안 도구를 사용하면 다음과 같이 보입니다 go get.

  1. (선택적으로) 다운로드,
  2. 컴파일,
  3. 및 설치

소프트웨어의 조각 반면, go install단순히

  1. 컴파일
  2. 및 설치

그것. 이 경우 go install명령을 go get대체하는 이유는 무엇입니까?

답변:


79

go install로컬에서 작업 할 때 워크 플로의 일부입니다. 라이브러리를 사용하고 싶지만 어떤 이유로 든 변경이 필요하다고 가정 해 보겠습니다. 당신은 할 것입니다 :

  • go get -d library, 다운로드 만합니다.
  • 다운로드 한 패키지를 변경하십시오.
  • go install library 로컬 버전을 설치합니다.

내가 아는 한 다운로드 하지go get 않아야 함을 나타내는 플래그가 없으므로 여기에서 바꿀 수 없습니다 .go install

새 패키지를 처음부터 개발할 때도 동일한 워크 플로가 사용됩니다.


1
좋아, 첫 번째 예 덕분에 이제 이해했다고 생각합니다. 그러나 두 번째 (처음부터 새 패키지 개발) go get ./path/to/local_package에서도 사용할 수 있으며 go install ./path/to/local_package. 이 경우 다운로드 프로세스가 없기 때문입니다.
thiagowfx

go install당신의 목표를 더 분명하게 만들지 만, 나는 둘 다 같은 것을 성취 할 것이라고 생각합니다. 다음과 같이 선언 된 패키지를 포함하여 몇 가지 패키지로 테스트했으며 main동등하게 보였습니다. 이 명령에 대한 문서는 매우 부족합니다.
BoppreH

여기 에는 gcc가 필요 go get하지만 go install. 이 설명과 어떤 관련이 있습니까?
AndreKR

3
이 답변에 동의하지 않습니다. 라이브러리를 다시 다운로드하지 않기 때문에 세 번째 글 머리 기호 go get대신 사용할 수도 있습니다 (를 추가하지 않는 한 ). 라이브러리를 처음부터 작성할 때도 사용할 수 있습니다 . 완전히 중복 된 것 같습니다. go installgo get-ugo getgo install
Simon

34

go get 이 순서로 두 가지 주요 작업을 수행합니다.

  • $GOPATH/src/<import-path>가져 오기 경로에 이름이 지정된 패키지 (소스 코드)를 종속성과 함께 다운로드하고 저장 한 다음

  • 실행 go install

-d플래그 ( go get -d) 지시 go get패키지를 다운로드 한 후 중지; 즉, go get하지 말라고 지시 합니다.go install


차이점:

go get // 패키지를 다운로드해야하는지 확인하고 필요한 경우 다운로드 한 다음 컴파일

go install // 패키지 다운로드가있는 부분을 건너 뛰고 컴파일 만합니다 (패키지가 없으면 오류가 발생 함).


에 대한 GOPATH환경 변수

GOPATH환경 변수는 이동 도구로 사용됩니다. 그것은 가능하도록하기 위해 설정해야합니다 get, build그리고 install패키지, 그리고 작업 공간의 위치를 지정합니다. Go 코드를 개발할 때 설정해야하는 유일한 환경 변수 일 수 있습니다.

다시 말하지만 GOPATH은 Go 설치가 아니라 작업 공간을 가리켜 야합니다.

예를 들어 Windows에서 작업 공간이에 있다고 결정 c:\gowork\하면 GOPATH값을 다음과 같이 설정해야합니다.c:\gowork

여기에 이미지 설명 입력

소스 코드는에 있어야하며 명령 프롬프트에서 c:\gowork\src\<some project folder>\실행 한 후에 는 및 생성되는 것을 볼 수 있습니다 .go getc:\gowork\src\<some project folder>\c:\gowork\bin\c:\gowork\pkg\


go install모듈 인식 설정에서 패키지를 다운로드합니다.
Berkant Ipek

2

참고 이동 1.16 (Q1 2021)를 구현, 그 차이가 명확하게됩니다 CL 266360 의 일환으로 문제 40276 :

go install이제 버전 접미사가있는 인수를받습니다 (예 :) go install example.com/cmd@v1.0.0.
이 원인은 go install하는 구축 및 모듈 인식 모드에서 패키지를 설치 , 무시하고 go.mod파일이 존재하는 경우, 현재 디렉토리 또는 상위 디렉토리에 있습니다.
이것은 주 모듈의 종속성에 영향을주지 않고 실행 파일을 설치하는 데 유용합니다 .

go install, 버전 접미사가 있거나없는 (위에서 설명한대로) 이제 모듈 모드에서 패키지를 빌드하고 설치하는 데 권장되는 방법입니다.

go get-d패키지 를 빌드 하지 않고 현재 모듈의 종속성을 조정 하려면 플래그 와 함께 사용해야하며 패키지 를 빌드하고 설치하는 데를 사용하는 go get것은 더 이상 사용되지 않습니다 .
A의 향후 릴리스의 -d플래그는 항상 활성화됩니다 .


아마도 나는 이것의 이유를 모르겠지만 단일 빌드 / 설치 명령을 비활성화하려는 이유를 알지 못합니다. 이것은 내가 본 다른 패키지 관리자와 다릅니다
Trevor Jex

@TrevorJex가 - 다시 읽기 github.com/golang/go/issues/40276을 여전히 하나의 빌드 / 설치 명령을있다 : go install. 그리고 현재 모듈 컨텍스트에 관계없이 특정 버전에 패키지를 설치합니다. 그것은 이전에 비해 즉흥적 go get입니다.
VonC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.