티스토리 뷰

조각글

golang 모듈

빅또리 2023. 4. 5. 20:07

챗지피티한테 물어봤던 golang 모듈에 관한 내용을 정리해두기.

 

Go 모듈 시스템

- Go 1.11 버전에서 실험적인 기능으로 도입되었고, Go 1.13 버전에서는 공식적인 기능으로 채택

 

(모듈 시스템 이전)

- $GOPATH 환경변수로 go 패키지를 관리하던 방식. 
  (프로젝트 마다 다른 버전을 사용하기 어렵고, 버전 관리가 어렵다)

- go get 명령어로 패키지 설치하고 $GOPATH/src 에 저장됨

 

(go 모듈 시스템)

- 프로젝트 마다 go.mod 파일로 관리하는 방식

- go mod tidy 하면 프로젝트에서 사용중인 모듈만 $GOPATH/pkg/mod 디렉토리에 저장됨

 

 

환경변수

GO111MODULE => 모듈 시스템 사용 설정

on : 모듈 시스템 강제 활성화

off : 모듈 시스템 강제 비활성화 

auto(default) : 현재 디렉토리에서 모듈 사용 가능 여부에 따라 자동으로 활성화, 비활성화

 

 

go get [패키지 경로] 가 $GOPATH/src 디렉토리로 설치 안될 때

export GO111MODULE=off 

이렇게 하고 설치했던 적이 있었다..

 

 

💡 golang 기본 패키지 저장소

https://pkg.go.dev

 

 

 

go version => 버전 확인

현재 go1.20.2

go env => 경로, 환경변수, 컴파일러, 빌드 등을 포함하는 go 환경에 관한 정보 출력

GOPATH

- 일반적으로 $HOME/go 로 설정되어 있다.

- 다운로드 한 go 패키지, 사용자가 작성한 go 코드가 위치함.

GOROOT

- go 언어 (자체), 표준 라이브러리의 설치 위치.

 

참고 GOCACHE

- 모듈 캐시 디렉토리

 

 

 

 

 

 

주요 명령어

 

go install => 실행 파일 생성/설치

- 그냥 go install

go.mod 가 위치한 프로젝트 디렉토리에서 패키지명 적지 않고 go install 이렇게 하면 이 프로젝트 패키지가 $GOPATH/bin에 executable로 저장됨. (소스코드를 컴파일 하고 실행파일을 생성)

- go install [패키지명] 

$GOPATH/bin에 설치함. 명령어 설치하는 것.

 

 

go get [패키지 경로] => 패키지 소스 코드 다운로드 (옛날 방식)

- 모듈 시스템 도입 이후부터는 잘 안쓰임. 아직 유효하긴 함.

- $GOPATH/src 디렉토리에 저장.

(=> go 모듈 시스템 이전에 사용하던 디렉토리. 내가 개발하는 패키지도 이 디렉토리에 저장하는 경우 일반적인 import 구문 방식으로 패키지를 가져올 수 있음)

 

 

 

go mod tidy => 패키지 소스 코드 다운로드 (요즘 방식)

- 현재 작업 중인 모듈의 go.mod 파일에 명시된 의존성 모듈 1) 다운로드, go.sum 파일에 체크섬 추가해서 2) 모듈 버전 고정.

- 불필요한 모듈 자동으로 삭제하고 의존성 그래프를 최적화 하는 일도 함.

- $GOPATH/pkg/mod 디렉토리 아니면 $GOCACHE 디렉토리에 설치됨. (1.13 버전부터 빌드시 사용하는 모듈 캐시 디렉토리)

- go 모듈 시스템에서 import 구문을 사용하면 이 디렉토리에서 패키지 가져옴.

 

 

 

 

 

 

헷갈리는 부분..

$GOPATH/bin => 컴파일한 실행파일 (executable)

$GOPATH/src(이전), $GOPATH/pkg/mod(모듈 시스템) => 패키지 .go 소스코드

   

 

go install vs go build

둘다 컴파일해서 실행 파일을 생성. 파일만 보면 동일.

go build -> 현재 디렉토리에 생성됨. 개발자가 원하는 경로에 수동으로 복사하거나 이동시켜서 사용해야 함.

go install -> $GOPATH/bin 디렉토리에 위치. $PATH (운영체제가 executable 찾는 path) 에 등록되어 있기 때문에 어디서든 그냥 실행 가능.

 

 

go mod tidy vs go mod downlaod

go mod tidy -> 필요한 모듈만 유지. 불필요한 파일 제거하여 디스크 공간 확보하면서 다운로드.

go mod downlaod -> 모듈의 종속성 다운로드. 저장 디렉토리는 똑같음.

ㄴ 그럼 go mod download는 딱히 쓸일 없는거 아닌가?

 

 

 

 

정리_진짜_최종

GOROOT => golang 언어가 저장되는 위치

GOPATH => 실행파일, .go 패키지 소스코드가 저장되는 위치

 

 

go 모듈 시스템 등장 전에는..

- go get [패키지 경로] 명령으로

- $GOPATH/src 디렉토리에 패키지 저장.

 

 

go 모듈 시스템에서 프로젝트 시작하려면?

- go mod init 

- go mod tidy -> 최적화 해서 필요한 모듈만 $GOPATH/pkg/mod 에 다운로드

// 작성한 내부 패키지 import 방법

// my_project
// ㄴ go.mod
// ㄴ go.sum
// ㄴ pkgs/
//     ㄴ pkg1/
//         ㄴ anyname.go
// ㄴ main.go

// go.mod 파일
module my_project

// anyname.go 파일
package pkg1

// main.go 파일
import (
	pb "my_project/pkgs/pkg1"
)

 

다 만들고 빌드하기

go build -> 실행 파일을 원하는 위치로 복사, 이동해야 한다.

go install -> $GOPATH/bin 디렉토리에 실행파일이 생성됨. (PATH 변수에 등록되어 있는 경우 어느 위치에서나 실행 가능)

 

 

--

go 관련 명령어 설치

go install [패키지명]

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

~/.zshrc 에 등록하자..
export PATH="$PATH:$(go env GOPATH)/bin"

이렇게 protoc 컴파일러 실행파일을 설치하고 어디서든 .proto 파일의 컴파일 명령을 실행하려고 할 때.

protoc -I ../proto --go_out=./protos --go_opt=paths=source_relative \
    --go-grpc_out=./protos --go-grpc_opt=paths=source_relative \
    anycable.proto

 

'조각글' 카테고리의 다른 글

Gradle  (1) 2023.10.08
SDKMAN  (0) 2023.10.08
devops 따라하기 시리즈  (0) 2022.03.22
영역함수  (0) 2021.11.05
git 빠르게 시작하기 2 (내부 구조)  (0) 2021.02.26
댓글
공지사항
최근에 올라온 글