Go 환경 설정(with go1.15.7) :: Outsider's Dev Story

Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Go 환경 설정(with go1.15.7)

3년 전에 Go 환경 설정에 대한 글을 썼다. 당시 Go 언어를 사용해야 했기에 쓴 글이었지만 사실 Go 언어를 그리 많이 쓰진 않았고 언어를 잘 배우는 편은 아니어서 그랬는지 몇 개월 뒤에 나는 Elctron 데스크톱 앱 개발로 도망쳤다. 그래서 여전히 Go 언어에 대해서는 잘 알지 못한다.

인프라 쪽을 계속하다 보니 Go를 해야겠다는 생각이 계속 들어서 다시 Go 언어를 만지게 됐다. 이전에 글을 썼을 때는 여러 의존성 관리 도구가 있던 시기에 막 go modules가 등장했을 때였던 걸로 기억하는데 지금은 go modules가 평정한 것 같아서 이전과 뭐가 달라졌나(라고 하기엔 이전에 어땠는지도 잘 모르지만...) 확인도 할 겸 앞으로도 사용해야 해서 다시 Go 언어의 개발환경을 설정했다.

나는 주로 사용하는 도구를 바이너리로 받아서 PATH에 넣어서 관리하는 편이라(버전 관리 도구를 사용하지 않고 원할 때 명시적으로 버전을 변경하려고...) 다운로드 페이지에서 pkg 대신 tar.gz 파일을 받아서 PATH 경로에 바이너리 파일을 넣었다.

$ go version
go version go1.15.7 darwin/amd64
Bash

사실 전에 사용할 때는 자꾸 환경변수 지정하라고 해서 좀 피곤했는데 이젠 환경변수를 지정하지 않고도 크게 무리 없이 사용할 수 있었다.

그사이에 뭐가 달라졌는지 잘 모르기 때문에 Tutorial: Get started with Go를 따라 해봤다.

프로젝트 디렉터리를 만들고 hello.go 파일에 다음 내용을 입력한다.

package main

import "fmt"

func main() {
  fmt.Println("Hello, World!!")
}
Go

이 코드를 다음과 같이 실행할 수 있다.

$ go run .
Hello, World!!
Bash

이제 외부 패키지 rsc.io/quote를 사용하는 예제를 이어서 따라 해 보자. hello.go 파일을 다음과 같이 수정한다.

package main

import "fmt"

import "rsc.io/quote"

func main() {
  fmt.Println(quote.Go())
}
Go

외부 모듈을 사용하고 있으므로 의존성 정보를 저장하고 있는 파일인 go.mod 파일을 생성하기 위해 go mod init [module]을 실행한다.

$ go mod init hello
go: creating new go.mod: module hello
Bash

그리고 실행하면 다음과 같이 외부 모듈을 다운로드받고 실행하는 것을 볼 수 있다.

$ go run .
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
Don't communicate by sharing memory, share memory by communicating.
Bash

go.mod 파일이 없는 상태에서 실행하면 다음과 같은 오류가 발생한다.

go run .
hello.go:5:8: cannot find package "rsc.io/quote" in any of:
  /Users/outsider/bin/lib/go/go1.15.7/src/rsc.io/quote (from $GOROOT)
  /Users/outsider/go/src/rsc.io/quote (from $GOPATH)
Bash

여기서 생성된 go.mod 파일은 다음과 같은 내용을 담고 있다.

module hello

go 1.15

require rsc.io/quote v1.5.2
Go

그리고 go run . 이후에 생긴 go.sum 파일은 다음과 같이 생겼다.

golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
Go

위에서 패키지를 다운로드 받았는데 이는 GOPATH 아래 다운로드가 되는데 별도로 GOPATH를 지정하지 않았기 때문에 ~/go가 기본 위치가 된다.(UNIX 기준) ~/go에 가보면 pkg 폴더 아래 다운로드받은 모듈이 설치된 것을 볼 수 있다.

Waypoint 환경 설정

좀 더 실전을 위해서 최근에 관심있는 HashiCorp의 Waypoint의 개발환경을 설정해 봤다. 아직 개발을 본격적으로 한 것은 아니라서 다양한 케이스나 베스트 프랙티스에 대해서는 잘 모른다.

Waypoint의 기여 문서go-bindata가 설치되어 있어야 한다고 해서 go get -u github.com/kevinburke/go-bindata/...로 설치한다.

$ go get -u github.com/kevinburke/go-bindata/...
go: downloading github.com/kevinburke/go-bindata v3.22.0+incompatible
Bash

go-bindata$GOPATH/bin에 설치되므로 이 명령어를 사용할 수 있게 하려면 PATH$GOPATH/bin을 추가해야 한다. 설치되어 있지 않거나 PATH에 제대로 설정되어 있지 않다면 /bin/sh: go-bindata: command not found 오류가 발생한다. 의존성 설치가 되었으면 make bin을 실행해서 Waypoint를 빌드할 수 있다.

$ make bin
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./internal/assets/ceb/ceb ./cmd/waypoint-entrypoint
cd internal/assets && go-bindata -pkg assets -o prod.go -tags assetsembedded ./ceb
CGO_ENABLED=0 go build -ldflags "-s -w -X "github.com/hashicorp/waypoint/internal/version".GitCommit=$(git rev-parse --short HEAD)$(test -n "`git status --porcelain`" && echo "+CHANGES" || true) -X "github.com/hashicorp/waypoint/internal/version".GitDescribe=$(git describe --tags --always --match "v*")" -tags assetsembedded -o ./waypoint ./cmd/waypoint
go: downloading github.com/hashicorp/go-getter v1.4.1
go: downloading github.com/dustin/go-humanize v1.0.0
......
go: downloading cloud.google.com/go/storage v1.6.0
Bash

빌드가 끝나면 해당 디렉터리에 빌드된 waypoint 파일이 생성된다.

$ ./waypoint version
Waypoint v0.2.0-209-g0f5e7a41 (0f5e7a41)
Bash

이 빌드된 파일이 잘 실행되는 것을 볼 수 있다.

2021/01/26 04:12 2021/01/26 04:12