Kubernetes 는 GoLang 으로 만들어진 대표적인 s/w 입니다. Kubernetes 구조와 비슷하게 GoLang 으로 프로젝트를 만들 때 사용되는 일반적인 디렉토리 구조를 설명하겠습니다.
제일 먼저 GOPATH 를 지정하고, bin 디렉토리를 PATH에 추가로 지정합니다.
$ GOPATH=/Users/ahnsk/Documents/go_workspace $ PATH=/Users/ahnsk/Documents/go_workspace/bin:$PATH
다음은 go get 으로 govendor 를 설치합니다. govendor 는 dependency module 을 쉽게 다운받고 관리할 수 있습니다.
$ go get -u github.com/kardianos/govendor $ govendor -version v1.0.9
이제 본인이 생성할 프로젝트를 만들어 보겠습니다. github.com 에 있는 go 프로젝트를 다운로드 받습니다.
$ mkdir -p /Users/ahnsk/Documents/go_workspace/cookiemonster2 $ GOPATH=/Users/ahnsk/Documents/go_workspace/cookiemonster2 $ go get -u github.com/seungkyua/cookiemonster2
GOPATH 는 각 프로젝트마다 자신만의 용도로 사용하기 위해 각각 지정하는 것이 편리합니다.
cookiemonster2 라는 프로젝트는 GOPATH 아래의 src 디렉토리에 패키지 경로(github.com/seungkyua/cookiemonster2)로 다운로드 됩니다.
/Users/ahnsk/Documents/go_workspace/cookiemonster2/src/ github.com/seungkyua/cookiemonster2
프로젝트 디렉토리로 이동해서 보면 다음과 같습니다.
$ tree -L 2 . . ├── Dockerfile.cookiemonster ├── LICENSE ├── Makefile ├── README.md ├── cmd │ ├── cluster_client.go │ ├── cluster_client2.go │ └── server.go ├── config │ └── config.yaml ├── manifest │ ├── cookiemonster-cm-config.yaml │ ├── cookiemonster-deployment.yaml │ ├── cookiemonster-rbac.yaml │ └── cookiemonster-service.yaml ├── pkg │ ├── domain │ └── handler └── vendor └── ...
일반적으로 entrypoint 가 되는 go 파일은 cmd 디렉토리 아래에 위치하고 나머지 go 파일들은 pkg 디렉토리에 패키지 구조로 위치합니다.
vendor 디렉토리는 dependency module 을 다운받은 곳이므로 이 디렉토리는 삭제를 하고, 처음부터 새롭게 구성해 보겠습니다.
$ rm -rf vendor
govendor init 으로 vendor 디렉토리를 생성합니다. 새롭게 생성된 vendor 디렉토리에 vendor.json 파일이 보이는데 이것은 향후 dependency module 을 다운 받을 때 활용됩니다.
$ govendor init $ tree -L 2 . . ├── Dockerfile.cookiemonster ├── LICENSE ├── Makefile ├── README.md ├── cmd │ ├── cluster_client.go │ ├── cluster_client2.go │ └── server.go ├── config │ └── config.yaml ├── manifest │ ├── cookiemonster-cm-config.yaml │ ├── cookiemonster-deployment.yaml │ ├── cookiemonster-rbac.yaml │ └── cookiemonster-service.yaml ├── pkg │ ├── domain │ └── handler └── vendor └── vendor.json
vendor 디렉토리 밑으로 디펜던시 module 을 다운로드 받습니다.
$ govendor get github.com/seungkyua/cookiemonster2 $ tree -L 2 . . ├── Dockerfile.cookiemonster ├── LICENSE ├── Makefile ├── README.md ├── cmd │ ├── cluster_client.go │ ├── cluster_client2.go │ └── server.go ├── config │ └── config.yaml ├── manifest │ ├── cookiemonster-cm-config.yaml │ ├── cookiemonster-deployment.yaml │ ├── cookiemonster-rbac.yaml │ └── cookiemonster-service.yaml ├── pkg │ ├── domain │ └── handler └── vendor ├── appengine ├── appengine_internal ├── github.com ├── golang.org ├── google.golang.org ├── gopkg.in ├── k8s.io ├── sigs.k8s.io └── vendor.json
vendor 디렉토리에 dependency module 의 특정버전까지 다운 받을 수 있으니 관리가 편리해 집니다.
현재 버전에서 labstack 의 echo v4 모듈에 버그가 있어 v3 로 다시 다운받기 위해 해당 디렉토리를 지우고 다시 다운 받을 수 있습니다. @v3 는 v3 이상의 최신 버전에 해당하는 git 브랜치나 태그를 다운받으라는 의미입니다.
$ rm -rf vendor/github.com/labstack/echo $ govendor get github.com/labstack/echo@v3
여기서 govendor 의 버그로 echo 는 다운받았지만 하위 디렉토리인 echo/middleware 는 다운이 안되었으므로 추가로 vendor.json 을 수정하여 다운로드 받습니다.
$ vi vendor/vendor.json { "checksumSHA1": "ynPXfBgVKquHSKkdFWk3oqSYf+g=", "path": "github.com/labstack/echo", "revision": "38772c686c76b501f94bd6cd5b77f5842e93b559", "revisionTime": "2019-01-28T14:12:53Z", "version": "v3.3.10", "versionExact": "v3.3.10" }, { "checksumSHA1": "Rp/k+BJKpaeB9vyjEPFBW4LeFP8=", "path": "github.com/labstack/echo/middleware", "revision": "38772c686c76b501f94bd6cd5b77f5842e93b559", "revisionTime": "2019-01-28T14:12:53Z", "version": "v3.3.10", "versionExact": "v3.3.10" } $ govendor fetch github.com/labstack/echo/middleware