개발바닥

모듈(Module) 본문

GO 언어

모듈(Module)

라이언 2022. 3. 6. 20:08
반응형

모듈(Module)이란?

Go 프로젝트의 종속성을 관리하는 새로운 방법이다. (1.11.1 이후 등장)

모듈을 사용하면 애플리케이션을 중단하지 않고 동일한 종속성의 다른 버전을 통합할 수 있다.

 

Go Modules 이 안나온 시절은 어땠을까?

go get: 3rd party packages 가져오기

 

go에서는 'go get' 명령어로 외부 패키지를 가져올 수 있다.

 1. go get으로 가져온 패키지는 $GOPATH/src 아래에 source file들이 저장된다.

$GOPATH 내에 없으면 종속성을 가져올 수 없다.

 2. go build 명령은 $GOPATH 내에 바이너리 실행 파일과 패키지 아카이브를 생성한다. 

$GOPATH에 많이 의존하는 것을 볼 수 있다.

여기서 잠깐!
Go는 Node.js의 NPM과 같은 중앙 package 저장소가 없다. 대신, 인터넷 상의 어디에서나 가져올 수 있다.
중앙 패키지 저장소도 나름 장점이 있지만, 중앙 패키지 저장소가 다운됐을 때는 큰 문제가 발생하고 해당 기업에서 유료화를 선언한다면 무료로 사용하는 입장에서는 걱정이 될 수 밖에 없다.. 이런 점에서 오픈소스 저장소를 사용하는 것은 중앙 저장소 다운 걱정이나 유료화에 대한 걱정이 없어서 좋은거 같다.

 

이러한 $GOPATH에 지나친 의존 때문에 불편함이 발생한다.

모든 프로젝트를 재배치하거나 여러 프로젝트를 사용하는 데 있어서 GOPATH 환경 변수를 지속적으로 변경해야 하기 때문에 불편했다.

또한 디렉토리 이름이 패키지 이름과 같으므로 go get으로 버전이 달라도 종속 패키지를 동일한 위치에 배치하므로 동일한 종속 패키지 버전을 여러 개 설치할 수 없다...

 

위에 불편한 부분을 Go modules에서 모두 지원을 해준다.

  1.  GOPATH를 신경쓰지 않고 내가 원하는 곳에 sourcecode를 둘 수 있다.
  2.  원하는 버전의 패키지를 설치할 수 있다.
  3.  동일한 패키지의 여러 버전을 가져올 수 있다.
  4.  패키지를 관리하는 패키지 리스트 파일이 존재한다. (go.mod) Go는 이 파일을 보고 종속성을 다운로드 할 수 있다.

자주 사용하는 Go 모듈 명령어 정리

1. go mod init [module-path]

go mod init
go mod init example.com/m

현재 디렉토리에 go.mod 파일을 만든다.현재 디렉토리를 모듈의 루트로 만든다. (go.mod 파일이 존재하면 안된다.)

 

2. go mod tidy

go mod tidy

go.mod 파일이 모듈의 소스 코드와 일치하는지 확인.

소스 코드를 확인해서 import 되지 않는 모듈들을 자동으로 go.mod 파일에서 삭제하고 import 되었지만 실제 모듈이 다운안된 경우에는 go.mod 파일에 추가한다.

 

3. go get [module-name]

go get github.com/example

모듈을 다운로드하는 명령어

 

4. go mod vendor

vendor 디렉토리에 의존성 패키지 다운로드.

해당 디렉토리에는 go.mod 에 명시된 패키지들이 다운로드 되어 저장된다.

vendor 폴더에는 modules.txt 라는 파일이 생성되고, 상세한 하위 패키지와 디렉토리가 기술되어 저장된다.

 

 

필자는 go 1.16 부터 고를 사용했기 때문에 go modules 을 당연시 여기였지만 이전에는 어떠한 문제점들이 존재했는지 알아두는 것이 고 언어를 이해하는데 많은 도움이 될 것으로 생각해서 정리를 해보았습니다.

 

반응형

'GO 언어' 카테고리의 다른 글

유닛 테스트(Unit Test)  (0) 2022.03.09
인터페이스 (interface)  (0) 2022.03.06
구조체(Struct)  (2) 2022.02.28
슬라이스(Slice)  (0) 2022.02.26
채널(Channel)  (0) 2022.02.22
Comments