본문 바로가기

Go

Go project 생성 가이드

[1. 개요]

go 를 이용하여 개발하는 경우, 특히 go mod 를 이용하여 프로젝트 설정을 하는 경우의 과정을 정리

go version 은 1.17 이상 환경을 타겟으로 한다.

  • go 는 GOPATH 를 이용한 개발 방식이 존재함.
  • 그러나 외부 모듈 사용 시, 필요 한 패키지를 일일히 설치 할 필요가 있음(?)
  • 그러나 go mod 를 사용하면 이런 번거로움을 해결할 수 있다고 봄.
  • https://testkernelv2.tistory.com/284

테스트 한 환경은 아래와 같다.

  • GOVERSION = go1.17.3
  • GO111MODULE = on

[2. go mod 명령어]

go mod 명령어 실행 시, 다양한 command 를 확인 할 수 있다.

  • go mod init {패키지_이름}
    # 현재 디렉터리의 go.mod 파일을 생성한다.
  • go mod tidy
    # 현재 디렉터리가 존재하는 패키지에서 모듈 의존성을 파악하여
    # go.mod 파일을 수정한다.
    # 의존 패키지가 있다면, 추가하고
    # 없으면, 삭제한다.
  • go mod edit
    # go.mod 를 수정하는데, 보통 직접 go.mod 파일을 수정하고 있음

[3. go.mod 파일]

go mod init 시 생성되는 파일로, 최초에는 module 이름과 go version 정보 등이 적혀 있다.

이 파일에 필요한 module 을 명시하면 된다.


[4. 외부 패키지 import]

go.mod 에 해당하는 모듈에 속하는 소스코드 작성 시 외부 패키지가 필요한 경우,

go get 명령어를 이용하여 외부 패키지를 설치하면 된다.

  • go get github.com/dhconnelly/rtreego@v1.1.0
    # @version 은 필수가 아닌 듯
    # 버전은 git tag 로 명시되는 것으로 알고있음
  • GOPATH 밑 GOMODCACHE 밑에 다운로드 된다.
  • 이후 go mod tidy 를 하도록 한다.

[5. 로컬 패키지 import]

github 에 공개되지 않은 패키지인 경우, 본인의 개발환경에만 존재하는 패키지인 경우, 

go.mod 파일을 직접 수정하도록(?) 한다.

  • require mypkg v0.0.0
  • replace mypkg => /home/user/somewhere

 

보통 go.mod 파일에 외부 패키지를 아래와 같이 명시한다.

  • require "패키지이름" "버전정보" 

그런데 해당 패키지는 자신의 pc 에만 있으므로, 

replace 를 통해 해당 패키지가 존재하는 로컬 경로를 명시하는 것이다.


[6. 패키지 의존성]

로컬 패키지(A) 가 어떤 외부 패키지(B) 를 이용하여 작성되어 있고,

내가 생성한 (main() 을 갖는) 패키지(C) 가 이 로컬 패키지를 이용할 경우,

 

패키지 C 는 패키지 B 에 의존하게 된다.

 

이 때, go mod tidy 를 이용해서 go.mod 파일에 의존성을 명시해주도록 한다.

이 경우, 참조하게되는 패키지는 " // indirect " 라고 명시된다.


[7. 예제]

  1. go mod init firstapp
  2. vim main.go , 
    # 적절히 main 함수를 작성
  3. go build && ./firstapp
    # 빌드 후, 바이너리 실행
  4. mkdir impl
  5. cd impl
  6. go mod init impl
  7. vim my1.go
    # 적절한 기능 구현
  8. vim my2.go
    # 적절한 기능 구현
  9. cd ..
  10. go get github.com/dhconnelly/rtreego@v1.1.0
  11. cd ..
  12. go mod tidy

'Go' 카테고리의 다른 글

[golang] haversine & bearing  (0) 2024.03.27
비트연산  (0) 2023.08.18
go build 옵션  (0) 2023.04.17
go heap container  (0) 2022.09.08
go mod  (0) 2022.08.10