개요
go mod vendor의 사용법을 알아보겠습니다.
go mod vendor 필요 성
go에서는 1.13부터 module이라는 기능을 이용하여 package의 의존성을 자동으로 관리를 해줍니다.
그러나 여기서 하나의 문제점이 발생을 합니다.
그것은 go module을 사용하기 위해서는 항상 internet에 연결이 되어있어야 한다는 것입니다.
하지만 일반적으로 제품 개발 시는 보안을 위해서 폐쇠망에서 build를 합니다.
그러면 go module을 통해서 package를 다운로드할 수가 없습니다.
그래서 필요한 기능이 다운로드한 package에서 compile시 필요한 파일만 보관하는 기능인 go module의 vendor 기능입니다.
우선 간단한 테스트를 위해서 logrus를 사용하는 package를 go module을 이용하여 만들어 보겠습니다.
간단한 module 만들기
간단히 예를 들어 아래 모듈을 만드는 명령어를 차례대로 수행하면 package관리용 파일인 go.mod go.sum이라는 것이 만들어집니다. 참고로, internet망이라면 go.mod와 go.sum을 통해 package의 버전이 관리돼 때문에 pcakge 의존성 관련하여 특별히 할 것이 없습니다.
module 만들기
상세 설명 : [go] downloading 가능한 module 및 package 만들기
#mkdir go-module
#cd go-module
#go mod init "towardthebest.com"이라고 하면
#vi hello.go
package main
import(
"fmt"
"github.com/sirupsen/logrus"
)
func main() {
fmt.Println("Hello")
logrus.Info("hello")
}
#go mod tidy
go: finding module for package github.com/sirupsen/logrus
go: downloading github.com/sirupsen/logrus v1.9.0
go: found github.com/sirupsen/logrus in github.com/sirupsen/logrus v1.9.0
go: downloading golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8
go: downloading github.com/stretchr/testify v1.7.0
go: downloading gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
#go build
#./towardthebest.com
go.mod
go.mod는 모듈을 정의하고 종속성 정보를 저장하고 있는 파일입니다.
이 파일을 통해 package들을 관리하게 됩니다.
module towardthebest.com
go 1.19
require github.com/sirupsen/logrus v1.9.0
go.sum
go.sum 파일은 go.mod에 종속성 정보가 추가될 때 생성됩니다.
이 파일은 종속성 관리를 위한 암호화된 체크섬 정보를 저장하고 있고 각각의 체크섬을 확인하여 수정된 항목이 있는지 확인하는 데 사용됩니다.
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
go mod vendor를 이용한 package 보관
우리는 위에서 go module을 만들면서 package를 다운로드하였습니다.
go.sum에 존재하는 package들이 다운로드한 package 목록입니다.
참고로, go module 통해서 받는 package는 ~/go/pkg/mod에 저장이 됩니다.
go module로 다운로드한 package 확인
tree -d -L 2 ~/go/pkg/mod/
/home/jinkwon/go/pkg/mod/
├── cache
│ └── download
├── github.com
│ ├── davecgh
│ ├── pmezard
│ ├── sirupsen
│ └── stretchr
├── golang.org
│ └── x
└── gopkg.in
└── yaml.v3@v3.0.0-20200313102051-9f266ea9e77c
go mod vendor로 다운 받은 package를 vendor에 저장
이제 다운 받은 package를 폐쇠망에서도 compile가능하게 go mod vendor를 이용하여 현재 directory에 저장하겠습니다.
go mod vendor
package를 compile 하는데 필요한 파일이 vendor directory가 생기면서 복사가 됩니다.
#go mod vendor
#ls
#tree
go mod vendor를 이용한 폐쇠망 compile
현재까지 go mod vendor를 이용하여 package compile에 필요한 파일은 vendor directory에 옮겼습니다.
이 상태가 되면 ~/go/pkg/mod에 우리가 다운로드하여 놓은 package는 필요가 없게 됩니다.
과감하게 ~/go/pkg/mod를 날려 보겠습니다.
다운로드한 package 삭제
#go clean -modcache
#go clean -cache
#go clean -testcache
삭제 상태 확인
#ls -al ~/go/pkg/mod
vendor를 사용한 build
build시 옵션
-mod vendor : vendor에 존재하는 package를 사용하여 build 하겠다는 의미입니다.
-o : 생성될 output 파일 지정
build
#go build -mod vendor -o vendor_build
#ls -alh ~/go/pkg/mod
run
#./vendor_build
정리
go에서는 package관리를 위하여 module이란 기능이 존재하는데 이는 internet이 있는 환경에서만 유용하기 때문에 폐쇠망에서 도 pacakge관리를 위해서 vendor라는 기능을 제공합니다.
'ProgrammingLang > Go' 카테고리의 다른 글
[go] vscode Error 및 Warning (0) | 2023.02.02 |
---|---|
[go] 내부 module 및 package 만들기 (0) | 2023.01.20 |
[go] downloading 가능한 module 및 package 만들기 (0) | 2023.01.19 |
[go] 개발에 도움되는 오픈소스 (0) | 2023.01.18 |
[Go Lang] package xx is not in GOROOT (/snap/go/9028/src/xx) 해결 방법 (0) | 2022.03.03 |