프로그래밍

golang module을 사용해보자.

2kindsofcs 2020. 2. 21. 20:45

golang으로 작업을 하면서 팀원분이 go module를 사용해보라고 하셨다.

분명 수많은 사람들이 쉽게 go module를 사용하는데, 뭔가 잘 되지 않아서 앓고 있었는데 알고보니 내가 2018년도 글을 보고 있었다. 

미래의 나 & 다른 사람들이 삽질하지 않기를 바라며, 몹시 간단한 일이지만 그래도 적어둔다.

 

일단 프로젝트 폴더가 $GOPATH/src 밖에 있는지 확인하자. 

밖에 있다면, 프로젝트 최상위 디렉토리에서 대략 아래와 같은 형태로 명령어를 실행한다.

 

go mod init example.com/m

 

golang 블로그에도 go module 사용방법에 대한 글이 있고, 저런 식으로 예시를 드는데 example.com이 무엇을 의미하는지 알 수가 없어서 혼란스러웠다. JAVA 같은 언어를 사용해 본 사람이라면 익숙하겠지만, 저건 우리가 만들고자 하는 패키지의 이름이다. 

보통 자신이 속한 회사 도메인 주소 등을 쓴다. 어찌되었든 이름을 붙여주는 것이기 때문에 example.com이라고 해도 go.mod 파일은 정상적으로 생성될 것이다. 하지만 우리는 진짜 실 프로젝트에 쓰고 싶은 거니까, github.com/깃헙아이디/저장소이름 형식으로 패키지 이름을 만들어주자.  

 

그러면 프로젝트 최상위 디렉토리 밑에 go.mod 파일이 생겼을 것이다. 

 

한편 만약 IDE로 goland를 사용하고 있다면, 설정을 바꿔줘야 한다.

맥OS기준 커맨드 + 콤마 키를 누르면 Preference창이 뜬다. 좌측의 Go 밑에 있는 Go Modules (Vgo) 로 들어가서, "Enable Go Modules (vgo) integration"를 확인하자. 체크박스가 비어있다면 체크를 해주자. Apply를 해주고 창을 닫자. 

 

이제 go build를 실행하면 go.mod에 import된 패키지들의 정보가 업데이트될 것이다. 간단하다. 

go build

 

팁1

- go mod tidy: import되지 않은 디펜던시를 제거해준다. 

 

팁2

- import cycle not allowd 컴파일 에러: 말 그대로 import cycle을 제거해주면 된다. 예를 들어 A, B, C 파일이 있다고 했을 때 A가 B를 임포트하고, B는 C를 임포트하는데, C가 A를 임포트하는 경우에 발생하는 에러이다. 기능 분리를 잘 했는지, 폴더 구조를 잘 잡았는지 다시 확인하자. 

 

우리의 친구 스택오버플로에 이미 올라와있다. 참고하자. 

https://stackoverflow.com/questions/28256923/import-cycle-not-allowed 

 

 

 

반응형