티스토리 뷰
챗지피티한테 물어봤던 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 기본 패키지 저장소
go version => 버전 확인
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 |