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 한다.
Preferences
에서 GOROOT
와 GOPATH
를 설정한다.
이 후, GoLand의 터미널에서 GOROOT
와 GOPATH
환경변수를 출력해보면, 다음과 같이 출력되는 것을 볼 수 있다.
$ 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.go
를 go 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 로도 실행할 수 있다.
마지막으로 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