Golang 개발 환경 셋팅

Nov 29, 2018



MAC OS X에서 Golang 개발 환경을 셋팅해본다.

준비물

설정 방법

Step 1. goenv

pyenv를 사용하면 버전별로 Python을 손쉽게 받을 수 있듯이, Go에서도 goenv를 사용하면 좀 더 편리하게 Go를 사용할 수 있다.

$ brew install goenv

이 후 ~/.bash_profile에 다음 라인을 추가해준다.

eval "$(goenv init -)"

터미널을 재시작하거나 source ~/.bash_profile을 해준 다음, 아래와 같이 go를 받을 수 있다.

# 설치 가능한 버전 조회
$ goenv install --list
  ...
  1.10.4
  1.11.0
  1.11.1
  ...

# 특정 버전 설치
$ goenv install 1.11.1

그러면 ~/.goenv/versions/1.11.1 위치에 go가 받아진 것을 확인할 수 있다.

Step 2. Create Project

맨 바닥부터 프로젝트를 만들어보는 게 좋으나, 여기서는 어느정도 틀을 갖추어놓은 joncrlsn/go-examples을 사용해본다.

우선은 go-examples/src/github.com/joncrlsn/go-examples 위치에 소스를 clone 받는다.

$ git clone https://github.com/joncrlsn/go-examples.git go-examples/src/github.com/joncrlsn/go-examples

저 위치에 clone을 받는 의도는 다음과 같다.

$ tree go-examples -L 5
/Volumes/data/code/_example/go-examples <-- 이 위치를 $GOPATH로 잡을 예정이다.
└── src
    └── github.com
        └── joncrlsn
            └── go-examples <-- 실제 프로젝트는 여기에 위치한다.
                ├── README.md
                ├── base64.go
                └── ...

Step 3. GoLand

GoLand에서 go-examples/src/github.com/joncrlsn/go-examples 디렉토리를 Open 한다.

golang-starter_01.png

Preferences에서 GOROOTGOPATH를 설정한다.

golang-starter_02.png golang-starter_03.png

이 후, GoLand의 터미널에서 GOROOTGOPATH 환경변수를 출력해보면, 다음과 같이 출력되는 것을 볼 수 있다.

$ echo $GOROOT
/Users/inter6-line/.goenv/versions/1.11.1

$ echo $GOPATH
/Volumes/data/code/_example/go-examples

Step 4. go get

거의 모든 프로그램이 자신만의 코드로만 이루어져있지 않고 라이브러리 등을 가져와서 사용하듯이, 여기서 연습해보고있는 프로젝트도 여러 팩키지를 참조하여 사용하고 있다.

코드를 살펴보면 import "github.com/jmoiron/sqlx"와 같이 해당 git repo에 있는 팩키지를 import 하는 것을 볼 수 있다. 코드를 실행하기에 앞서, 이러한 팩키지들을 go get을 이용하여 가져올 필요가 있다.

# 현재 프로젝트의 디렉토리에서
$ cd $GOPATH/src/github.com/joncrlsn/go-examples

# 프로젝트 내에서 사용하는 모든 팩키지들을 가져온다. 그러나 오류가 발생하는데...
$ go get -d ./...
package github.com/mattes/migrate/driver/sqlite3: cannot find package "github.com/mattes/migrate/driver/sqlite3" in any of:
        /Users/inter6-line/.goenv/versions/1.11.1/src/github.com/mattes/migrate/driver/sqlite3 (from $GOROOT)
        /Volumes/data/code/_example/go-examples/src/github.com/mattes/migrate/driver/sqlite3 (from $GOPATH)
package github.com/mattes/migrate/migrate: cannot find package "github.com/mattes/migrate/migrate" in any of:
        /Users/inter6-line/.goenv/versions/1.11.1/src/github.com/mattes/migrate/migrate (from $GOROOT)
        /Volumes/data/code/_example/go-examples/src/github.com/mattes/migrate/migrate (from $GOPATH)

기본적으로 go get은 팩키지들의 git repo에서 master 브랜치의 HEAD 커밋을 clone 받는다. 오류가 발생한 이유는, 참조하고있는 github.com/mattes/migrate에서 코드를 변경했으나, 이 프로젝트는 변경된 코드로 업데이트를 하지 않아서 엉뚱한 위치를 바라보고 있다.

보통은 내 코드를 고치는 것이 바람직하나, 여기서는 참조하고있는 팩키지를 이 프로젝트에 맞는 커밋으로 checkout 한다.

$ cd $GOPATH/src/github.com/mattes/migrate

$ git checkout e92f038f409b358cfd182295c3cfa8cb6bf4c68f

이 후, 다시 go get -d ./...을 하면 오류없이 모든 팩키지를 가져온 것을 확인할 수 있다. 이렇듯 go get만으로는 팩키지들에 대한 관리가 힘들기 때문에 godep, dep, glide 등의 여러 팩키지 매니저가 존재한다.

Step 5. go run / build

이제 코드를 실행할 준비가 완료되었다. 가장 간단한 base64.gogo run으로 실행해보면 다음과 같이 출력된다.

$ cd $GOPATH/src/github.com/joncrlsn/go-examples

$ go run base64.go
String: 'Hi Mom'
Encoded:  SGkgTW9t
Decoded: 'Hi Mom'   ok:true

물론 GoLand의 Run / Debug 로도 실행할 수 있다.

golang-starter_04.png

마지막으로 go build를 하게되면 실행 가능한 바이너리 파일을 얻을 수 있다.

$ go build base64.go

$ ls -la base64
-rwxr-xr-x  1 inter6-line  admin  2046200 Nov 29 22:14 base64

$ ./base64 
String: 'Hi Mom'
Encoded:  SGkgTW9t
Decoded: 'Hi Mom'   ok:true