Go에서 의존성 관리하기

저는 처음 golang을 배우고 점점 익숙해 질 때마다 golang은 어떻게 의존성을 관리할까? 라는 생각을 했습니다. 그래서 여러군데의 사이트를 찾았고 golang에서도 의존성을 관리하는 도구들이 있다는 것을 알았습니다.

go에는 여러 패키지 매니져 도구들이 있습니다. 하지만 저는 dep이라는 의존성 도구를 사용할 건데, 이걸 사용하는 이유는 dep이 golang 공식 pm될 것 같다는 소리를 자주들어서 dep을 선택했습니다.

dep 설치

deo은 go 1.8 버전 이상이 필요합니다. 설치할 때는 go get -u github.com/golang/dep/cmd/dep 를 적으시면 됩니다.

설치가 완료되면

    dep:
    version     : v0.4.1
    build date  : 2018-01-27
    git hash    : 37d9ea0
    go version  : go1.9.3
    go compiler : gc
    platform    : darwin/amd64

위에 장면과 비슷하게 나올꺼에요! 달라도 신경쓰지마세요!

근데 왜 의존성을 관리 해야할까?

제가 처음 go로 간단한것을 개발할때는 go get 명령으로 파일들을 설치하면 gopath를 기준으로 파일을들 import를 통해서 불러왔습니다.

하지만 그건 혼자서 개발할때는 괜찮겠지만 만약 협업을 하게 된다면? 회사에 작업을 하게 된다면? 다른 사람들은 의존성을 일일이 버전에 맞게 찾아서 설치하는 노가다를 경험하게 되겠죠.

또한 모듈들을 일괄 관리 해주는 역활도 있습니다. 그렇기 때문에 의존성 도구를 사용하는 것입니다.

시작하기

Link: dep

여러분들이 새 프로젝트를 만들고 dep으로 의존성을 관리하고 싶다면 새로 만든 프로젝트로 가서

 dep init

을 해주면

├── Gopkg.lock
├── Gopkg.toml
└── vendor/

이런 파일과 폴더가 만들어 질 것입니다.

Gopkg.toml

Gopkg.toml은 초기화할 때 생성되는 파일로 dep의 동작을 감시하는 여러 규칙을 담고 있습니다.

# Gopkg.toml example
#
# Refer to  https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
/*
    required, ignored로 임포트 경로를 추가하거나 제외해서 임포트 그래프를 조작할 수 있다.
*/
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
/*
    constraint와 override로 임포한 경로를 추가하거나 
    제외해서 임포트 그래프를 조작한다. 즉, dep으로 파일을 설치하면 
    여기에 업데이트 됩니다.
*/
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#   name = "github.com/x/y"
#   version = "2.4.0"
#
/*
어떤 파일과 디렉터리가 불필요하다고 판단할지 설정해서 vendor/에서 자동으로 제거한다
*/
# [prune]
#   non-go = false
#   go-tests = true
#   unused-packages = true


[prune]
  go-tests = true
  unused-packages = true

Gopkg.lock

프로젝트의 의존성 그래프의 스냅숏을 가진 파일이다. 이 파일은 dep ensure 할 때 변경된다.

node.js로 생각하시면 yarn.lock이나 package.lock.json 라고 생각하시면 됩니다.

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  inputs-digest = "ab4fef131ee828e96ba67d31a7d690bd5f2f42040c6766b1b12fe856f87e0ff7"
  solver-name = "gps-cdcl"
  solver-version = 1

dep ensure는 dep으로 모듈을 설치할 때 사용합니다

사용하기

dep으로 의존성을 추가하기 위해서는

    dep ensure -add 설치할 모듈명

을 하시면 됩니다.

만약 이런 예러가 나시면 이렇게 해결하면 됩니다.

// 이건 go코드를 전혀 작성하지 않아서 생기는 오류입니다. 
// go 코드를 작성하면 됩니다.
 no dirs contained any Go code 

// 이거와 같은 에러는 github.com/gin-gonic/gin를 아직 임포트 한 곳이 없어서 Gopkg.lock와 vender/에는 추가되었지만 임포트하지 않고 dep ensure를 실행하면 지워질 것이라고 하는 것입니다. 한마디로 설치한 모듈을 사용해라! 입니다 
"github.com/gin-gonic/gin" is not imported by your > > project, and has been temporarily added to Gopkg.lock and vendor/.
If you run "dep ensure" again before actually importing it, it will disappear from Gopkg.lock and vendor/.

이상입니다.

다시 Gopkg.toml과 .lock 파일 보면

[[constraint]]
  name = "github.com/gin-gonic/gin"
  version = "1.2.0"
[[projects]]
  name = "github.com/gin-gonic/gin"
  packages = [
    ".",
    "binding",
    "render"
  ]
  revision = "d459835d2b077e44f7c9b453505ee29881d5d12d"
  version = "v1.2"

이렇게 되면 성공입니다.

dep을 사용하면서 느낀것은 아직 의존성을 관리하는 것에는 조금 부족한 감이 있는 것 같습니다. 하지만
꾸준히 업데이트를 하는 것 같으니깐 기달려봐야 겠습니다.

Dep 공식 사이트

Link: Dep

여기까지 go에서의 의존성을 알아보았습니다!
틀린 부분이 있다면 언제든지 지적해주시면 감사하겠습니다!!!