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.