Modules 사용하기
모듈 사용방법을 알아보도록 하겠습니다.
사전 작업
$GOPATH/src
의 바깥쪽에서 빈 디렉터리를 하나 생성합니다.
$mkdir hello
hello.go
파일을 생성합니다.
package main
import (
"fmt"
)
func main() {
fmt.Println("hello, world")
}
module 생성하기
go mod init [module]
명령을 사용하여 새로운 모듈을 생성합니다.
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
go mod init
명령을 수행하면 현재 패키지의 종속성 정보를 담고 있는 go.mod
파일이 생성됩니다.
$ cat go.mod
module example.com/hello
go 1.15
종속성(dependency) 추가
rsc.io/quote
패키지에 있는 Hello()
함수를 호출하도록 hello.go
파일 내용을 변경하겠습니다.
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Hello())
}
빌드를 수행합니다.
$ go build
go: finding module for package rsc.io/quote
go: found rsc.io/quote in rsc.io/quote v1.5.2
빌드시, 추가된 rsc.io/quote
패키지를 찾습니다.
패키지가 있다면 바로 go.mod
파일에 패키지 내용을 추가하고 없다면 자동으로 패키지를 다운로드한 뒤 go.mod
파일에 추가합니다.
go.mod
파일을 확인합니다.
$ cat go.mod
module example.com/hello
go 1.15
require rsc.io/quote v1.5.2
rsc.io/quote
에 종속성 정보가 추가된 것을 확인할 수 있습니다.
옆에 v1.5.2
는 해당 패키지의 버전정보 입니다.
종속성 정보가 추가되면 추가로 go.sum
파일이 생성됩니다.
$ cat go.sum
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZO...
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:Nq...
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3...
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPX...
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/Q...
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9...
종속성(dependency) 정보 출력
go list -m all
명령은 현재 모듈의 종속성 정보를 출력해 줍니다.
$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0
종속성(dependency) 업그레이드
rsc.io/quote
패키지 대신 업그레이드된 rsc.io/quote/v3
패키지를 사용해 보겠습니다.
major 버전 변경(v1.5.2 → v3.1.0)으로 인해 일부 API가 변경되었을 수 있습니다. 아래 문서를 보면 Hello
가 HelloV3
로 변경되었습니다.
$ go doc rsc.io/quote/v3
package quote // import "rsc.io/quote"
Package quote collects pithy sayings.
func Concurrency() string
func GlassV3() string
func GoV3() string
func HelloV3() string
func OptV3() string
hello.go
소스코드에서 HelloV3()
함수를 사용하도록 변경합니다.
package main
import (
"fmt"
quoteV3 "rsc.io/quote/v3"
)
func main() {
fmt.Println(quoteV3.HelloV3())
}
빌드를 하고 종속성 정보를 출력해 봅니다.
$ go build
$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
rsc.io/sampler v1.3.0
$ cat go.mod
module example.com/hello
go 1.15
require (
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
)
rsc.io/quote/v3 v3.1.0
정보가 추가된 것을 확인할 수 있습니다.
사용하지 않는 종속성 제거
hello.go에서 더 이상 rsc.io/quote 패키지를 사용하지 않지만 여전히 go list -m all
및 go.mod
파일에 표시됩니다.
$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
rsc.io/sampler v1.3.0
$ cat go.mod
module example.com/hello
go 1.15
require (
rsc.io/quote v1.5.2
rsc.io/quote/v3 v3.1.0
)
go mod tidy
명령은 사용하지 않는 종속성을 제거해 줍니다.
$ go mod tidy
$ go list -m all
example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote/v3 v3.1.0
rsc.io/sampler v1.3.0
$ cat go.mod
module example.com/hello
go 1.15
require rsc.io/quote/v3 v3.1.0
사용하지 않는 rsc.io/quote v1.5.2
가 삭제된 것을 확인할 수 있습니다.