Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

환경

우분투 리눅스 17.14에서 설치했다.
# curl https://glide.sh/get | sh

go는 1.10 버전이다. 1.6 버전 부터 vendor를 지원하기 시작했으니 따로 GOPATH를 잡을 필요가 없다. 1.6 이하 버전을 사용하고 있다면 업데이트하자.

glide

Go언어는 github에서 패키지를 다운로드해서 사용 할 수 있다. 하지만 버전과 상호의존성을 관리해야 한다. 자바스크립트의 경우 npm, 파이선은 pip, 자바는 Maven등을 사용한다. Glide는 go언어를 위한 패키지관리자다.

glide를 이용해서 벤더와 패키지를 쉽게 관리할 수 있다. 배포 할 때도 의존성있는 패키지들을 함께 배포함으로써, 패키지 버전 의존성 문제를 해결 할 수 있다. 주요 기능은 아래와 같다.
  • 손쉬운 의존성 관리
  • Semantic Versioning 2.0.0을 지원한다.
  • aliasing packages지원
  • go tool들고 함께 사용 할 수 있다.
  • git, bzr, hg, svn등의 VCS 툴을 지원한다.
  • Local plugin과 global plugin을 지원.
  • 저장소 캐싱과 데이터 케싱 지원.
  • 버전을 검사하며, 버전간 종속성을 관리한다.
glide 기반 프로젝트의 일반적인 구성이다.
--- $GOPATH/src/myProject
     |
     +-- glide.yaml
     |
     +-- glide.lock
     |
     +-- main.go
     |
     +-- mySubpackage
     |     |
     |     +-- foo.go
     |
     +-- vendor
           |
           +-- github.com
                 |
                 +-- yundream
                       |
                       +-- ... etc.
Glide는 응용 프로그램과 라이브러리의 소스코드를 검색해서 종속성을 확인한다. 이들 패키지와 버전 정보들은 glide.yaml 파일에 저장되고, 이 파일을 읽어서 vendor 디렉토리를 구성한다. vendor 디렉토리에는 glide가 검색한 패키지들이 설치된다.

glide init 명령으로 새로운 프로젝트를 만들 수 있다. 종속성 검색과정이 끝나면 glide.yaml 파일이 만들어지고 glide install명령으로 vendor 디렉토리가 만들어진다. vendor에 패키지들이 설치도니 다음에는 glide.lock 파일이 만들어지고, 이 후에는 종송석을 검색하는 과정을 건너뛴다.

glide 사용

테스트 코드

go 람다코드로 테스트하기로 했다.
package main

import (
	"errors"
	"log"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

var (
	ErrNameNotProvided = errors.New("no name was provided in the HTTP body")
)

func Handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {

	// stdout and stderr are sent to AWS CloudWatch Logs
	log.Printf("Processing Lambda request %s\n", request.RequestContext.RequestID)

	// If no name is provided in the HTTP request body, throw an error
	if len(request.Body) < 1 {
		return events.APIGatewayProxyResponse{}, ErrNameNotProvided
	}

	return events.APIGatewayProxyResponse{
		Body:       "Hello " + request.Body,
		StatusCode: 200,
	}, nil

}

func main() {
	lambda.Start(Handler)
}
이 코드는 awa-lambda.go/events 와 aws-lambda-go/lambda 두 개의 패키지를 필요로 한다.

glide create

glide create(혹은 init)를 이용해서 작업공간(workspace)를 초기화 할 수 있다. 이 명령은 코드를 읽어서 필요한 패키지와 버전을 추측해서 glid.yaml 파일을 만든다.
# glide create
[INFO]  Generating a YAML configuration file and guessing the dependencies
[INFO]  Attempting to import from other package managers (use --skip-import to skip)
[INFO]  Scanning code to look for dependencies
[INFO]  --> Found reference to github.com/aws/aws-lambda-go/events
[INFO]  --> Adding sub-package lambda to github.com/aws/aws-lambda-go
[INFO]  Writing configuration file (glide.yaml)
[INFO]  Would you like Glide to help you find ways to improve your glide.yaml configuration?
[INFO]  If you want to revisit this step you can use the config-wizard command at any time.
[INFO]  Yes (Y) or No (N)?
n
[INFO]  You can now edit the glide.yaml file. Consider:
[INFO]  --> Using versions and ranges. See https://glide.sh/docs/versions/
[INFO]  --> Adding additional metadata. See https://glide.sh/docs/glide.yaml/
[INFO]  --> Running the config-wizard command to improve the versions in your configuration
glide.yaml 파일을 열어보자.
package: bitbucket.org/dream_yun/lambda
import:
- package: github.com/aws/aws-lambda-go
  subpackages:
  - events
  - lambda
aws-lambda-go/events,lambda 두개의 패키지를 찾았음을 알 수 있다.

glide install

glide install 명령을 실행하면 glide.yaml 파일을 읽어서 vendor를 구성하고 glide.lock 파일을 만든다.
# glide install
[INFO]  Lock file (glide.lock) does not exist. Performing update.
[INFO]  Downloading dependencies. Please wait...
[INFO]  --> Fetching updates for github.com/aws/aws-lambda-go
[INFO]  Resolving imports
[INFO]  Downloading dependencies. Please wait...
[INFO]  Setting references for remaining imports
[INFO]  Exporting resolved dependencies...
[INFO]  --> Exporting github.com/aws/aws-lambda-go
[INFO]  Replacing existing vendor dependencies
[INFO]  Project relies on 1 dependencies.
아래와 같은 디렉토리 구성을 확인 할 수 있을 것이다.
# tree
.
├── glide.lock
├── glide.yaml
├── main.go
└── vendor
    └── github.com
        └── aws
            └── aws-lambda-go
                ├── cmd
                │   └── build-lambda-zip
                │       └── main.go
                ├── events
                │   ├── apigw.go
                │   ├── apigw_test.go
                ......

glide list

프로젝트가 임포트하고 있는 패키지 목록을 확인할 수 있다.
# glide list
[INFO]  Package github.com/aws/aws-lambda-go/lambda/messages found in vendor/ folder
[WARN]  Version not set for package github.com/aws/aws-lambda-go/lambda/messages
[INFO]  Package github.com/aws/aws-lambda-go/lambdacontext found in vendor/ folder
[WARN]  Version not set for package github.com/aws/aws-lambda-go/lambdacontext
INSTALLED packages:
    github.com/aws/aws-lambda-go/events
    github.com/aws/aws-lambda-go/lambda
    github.com/aws/aws-lambda-go/lambda/messages
    github.com/aws/aws-lambda-go/lambdacontext

Makefile & glide

간단한 Makefile. " Makefile build golag"을 참고한건데, 좋다.
PACKAGE = mylambda
GO      = go
GLIDE   = glide
GOPATH  = $(CURDIR)/.gopath
GOFMT   = gofmt
BASE    = $(GOPATH)/src/$(PACKAGE)

Q = $(if $(filter 1,$V),,@)
M = $(shell printf "\033[34;1m▶\033[0m")

.PHONY: all
all: fmt vendor | $(BASE) ; $(info $(M) building executable…) @ ## Build program binary
	$Q cd $(BASE) && $(GO) build -o bin/$(PACKAGE)

$(BASE): ; $(info $(M) setting GOPATH…)
	@mkdir -p $(dir $@)
	@ln -sf $(CURDIR) $@

glide.lock: glide.yaml | $(BASE)
	$Q cd $(BASE) && $(GLIDE) update
	@touch $@

vendor: glide.lock | $(BASE)
	$Q cd $(BASE) && $(GLIDE) --quiet install
	@ln -sf . vendor/src
	@touch $@

.PHONY: fmt
fmt: ; $(info $(M) running gofmt…) @ ## Run gofmt on all source files
	@ret=0 && for d in $$($(GO) list -f '{{.Dir}}' ./... | grep -v /vendor/); do \
		$(GOFMT) -l -w $$d/*.go || ret=$$? ; \
	 done ; exit $$ret

.PHONY: clean
clean: ; $(info $(M) cleaning…)	@ ## Cleanup everything
	@rm -rf $(GOPATH)
	@rm -rf bin
	@rm -rf test/tests.* test/coverage.*

참고