golang - 설치와 GoPath

아래 글은 golang을 공부할 목적으로 웹에서 본 글들을 정리한 것이다.

설치

govirtualenv


goenv

  • goenv는 rbenv과 마찬가지로 golang 버전을 관리할 때 사용하는 것.
    • https://github.com/wfarr/goenv
  • goenv를 설치한다
git clone https://github.com/wfarr/goenv.git ~/.goenv
  • 패스 설정
    Goenv 용 환경 변수와 실행 처리를 bash_profile에 추가하기
    echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.bash_profile
    echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    echo 'eval "$(goenv init -)"' >> ~/.bash_profile
    echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.bash_profile
    echo 'export GOPATH="$HOME/go"' >> ~/.bash_profile
    echo 'export PATH="$GOPATH/bin:$PATH"' >> ~/.bash_profile
    # 실행
    source ~/.bash_profile
    # 확인
    goenv --version
    
  • golang 설치
goenv install 1.4
goenv versions
  • rbenv과 마찬가지로 golang을 사용하도록 설정
goenv global 1.4
go version

혹시 Go Module이 동작하지 않으면 아래 환경 설정을 참고한다
.bash_profile

# Goenv 용 환경 설정
export GOENV_DISABLE_GOPATH=1
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
# 실행
eval "$(goenv init -)"

# GOROOT은 goenv의 default
export PATH="$GOROOT/bin:$PATH"
# GOPATH은 자신이 원하는대로 설정한다
export GOPATH="$HOME/go"
export PATH="$GOPATH/bin:$PATH"

# Go Modules 용 환경 설정
export GO111MODULE=on  


gobrew

curl -L https://raw.github.com/grobins2/gobrew/master/tools/install.sh | sh


GVM

  • ruby로 말하면 rbenv 같은 것
    • https://github.com/moovweb/gvm
  • 설치
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
- ~/.gvm에 저장소가 만들어진다. - bashrc에서 gvm 설정 읽기
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
- 이로써 source~/.bashrc를 하면 gvm을 실행할 수 있게 된다.
  • go 설치
gvm listall
gvm use go1.4.2
  • 확인한다
$ gvm list
gvm gos (installed)
   go1.4.2
   system
  • 사용
$ go version
go version go1.4.2 linux/amd64
  • 여담
gvm use go1.4.2

라고 ~/.bashrc에 추가해 두면 매번 로그인 시점에서 지정한 버전의 go를 사용할 수 있게 된다.


GoPath

  • $GOPATH는 원하는대로 지정할 수 있다
  • go 공식문서에서는 go 만드는 프로젝트를 GOPATH 아래에 두는 것을 추천한다.
  • Go 패스는 import문의 해결에 사용된다. go/build 패키지에서 구현하고 있다.
  • 환경 변수 GOPATH는 Go 코드를 찾을 장소를 뜻한다.(PATH 같은 것)
    • Unix의 경우는 콜럼으로 구별한다.
    • Windows의 경우는 세미콜롬으로 구별한다.
  • GOPATH는 표준 Go 밖에서 패키지를 빌드 하거나 설치할 때에 설정되어 있지 않으면 안된다.
  • GOPATH 에 들어가 있는 디렉토리는 각각 정해진 구조를 가지고 있어야 한다.
    예:
    GOPATH=/home/user/gocode

    /home/user/gocode/
        src/
            foo/
                bar/               (go code in package bar)
                    x.go
                quux/              (go code in package main)
                    y.go
        bin/
            quux                   (installed command)
        pkg/
            linux_amd64/
                foo/
                    bar.a          (installed package object)
  • Go는 GOPATH의 각 디렉토리에서 소스코드를 찾지만 다운로드한 파일은 보통 GOPATH 중에서 가장 최초의 디렉토리에 설치한다.


복수의 GoPath 지정

  • 가능하다. 단 첫번째 지정한 것 이외는 넘어가는 경우가 있다.
  • 예를들면 아래와 같이 GOPATH를 지정하였다.
    $ export GOPATH=$HOME/go:$HOME/golang:$HOME/workspace/go
  • 지정한 모든 GOPATH가 유효한 것은 Go 컴파일러가 외부의 패키지를 찾는 경우만이다.
  • 즉 import 문에서 지정한 패키지는 GOPATH가 통하는 곳에 있다면 컴파일러가 발견할 수 있다(컴파일러 에러가 되지 않는다).
  • $HOME/workspace/go/src 이하에 배치한 패키지는 imoort 할 수 없다.
  • 역으로 첫번째 GOPATH만 유효한 경우는 go get 에 의해 외부의 패키지를 다운로드・설치 하는 경우이다.
  • go get 명령어를 사용하면 외부의 패키지는 꼭 첫번째에 지정한 $HOME/go 에 설치된다.

  • (일어)GoPath와 작업 디렉토리
  • (일어)GOPATH 오염 문제
  • (일어)외부 모듈을 import 하기 전에 필요한 GOPATH 설정하는 것에 대해서 여러가지 조사

이 글은 2018-10-24에 작성되었습니다.