티스토리 뷰

Study Space/Go

Go 언어 크로스 컴파일

알 수 없는 사용자 2018. 3. 24. 15:06

서비스 애플리케이션을 개발하는 경우, 애플리케이션을 개발하는 환경과 해당 서비스를 제공하는 운영 환경이 서로 다른 경우가 대부분이다.

특히, 내가 웹 애플리케이션을 개발할 때는 macOS 상에서 개발하고, 소스 코드를 통째로 서버에 올린 후 별도로 컴파일하는 과정이 필요했다.


만약 내가 개발하는 애플리케이션이 상용 애플리케이션인 경우, 이 방법은 절대로 안전하지 않다.

FTP로 소스코드를 전송하고 원격 세션으로 접속하여 빌드하는 도중에 관리자가 세션을 끊어버리면 소스 코드가 유출되어 버리는 셈이다.

그렇다고해서 운영 환경과 동일한 환경을 구축하려면 비용 문제가 발생한다.

여러 고객사로부터 애플리케이션 설치를 요청받으면 각각의 환경을 모두 조사해서 구축하기란 쉽지 않은 일이다.


이를 해결할 수 있는 근본적인 방법은 타겟 환경에 맞는 바이너리를 생성하는 크로스 컴파일 기법이다.

Java나 Python은 동일한 코드를 여러 환경에서 동일하게 동작할 수 있는 인터프리터가 존재한다.

Swift는 언어를 LLVM 중간언어로 변환하여, LLVM을 이용해 바이너리를 생성한다.

Go 언어는 자체적으로 크로스 컴파일을 지원한다.


Go에서 지원되는 크로스 컴파일 환경 목록



$ go env

GOARCH="amd64"

... (중략)

GOOS="darwin"

... (생략)

 

크로스 컴파일 시 고려해야 할 사항은, CPU Archtecture와 OS 다.

Go 애플리케이션을  빌드할 때, GOPATH 환경 변수를 설정하듯이, GOARCH와 GOOS를 설정하면 된다.

기본적으로 GOARCH와 GOOS는 현재 환경에 맞춰져 있기 때문에, 크로스 컴파일이 필요한 경우, 해당 타겟 플랫폼의 환경을 선택해주면 된다.

# 환경 변수 GOOS를 확인한다.

~ $ go env GOOS

darwin

# 환경 변수 GOARCH를 확인한다.

~ $ go env GOARCH

amd64

# 환경 변수 OS를 linux로 변경한다.

~ $ export GOOS="linux"

# GO의 환경 변수 GOARCH를 386으로 변경한다.

~ $ export GOARCH="386"

# GOOS와 GOARCH에 지정된 환경을 타겟으로 빌드한다.

~ $ go build


바이너리를 빌드하게 되면 운영 환경에서 즉시 실행할 수 있는 바이너리가 생성된다.

만약, 빌드된 바이너리를 실행할 수 있는 마딴한 환경이 없는 경우, Docker를 이용해볼 수 있다.


# 최신 CentOS 도커 이미지를 받는다.

$ docker pull centos:latest

# CentOS 컨테이너를 생성하고 cent라는 이름을 붙인다.

# 그리고 로컬의 volumn 디렉터리를 컨테이너 내 /bin 디렉터리에 마운트한다.

# 마지막으로 /bin/bash를 실행한다.

$ docker run -ti --name cent -v ~/volume:/bin centos:latest /bin/bashs


다음으로 호스트의 사용자 홈 디렉터리에 생성된 volumn 디렉터리에 아래의 코드를 작성한다.


package main


import "fat"


func main() {

  fmt.Println("Hello, Go")

}


GOPATH, GOOS, GOARCH를 지정하고 빌드 후, Docker 컨테이너에서 생성된 바이너리를 실행하면 Hello, Go가 출력되는 것을 확인할 수 있다.

'Study Space > Go' 카테고리의 다른 글

Go-lang을 사용하는 Gopher가 되자!  (0) 2018.03.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함