개요
go 1.19 기준에서 프로그램을 가끔 만들면 사용자 module 를 만들어야 할 때가 매우 많이 생깁니다. 그런데 항상 module 만드는 방법을 까먹습니다.
우선 첫 번째 post에서 download가능한 module을 만들어 볼것 입니다.
참고로, 모든 정보는 https://go.dev/ 에서 가져왔습니다.
알고 싶은 것
1. 나만의 module를 만드는 순서
필요한 사전 지식
- module과 package의 관계
- module 용도
- package 용도
module과 package의 관계
https://go.dev/doc/tutorial/create-module
Go 코드는 package로 그룹화되고 package는 module로 그룹화됩니다.
그래서 나만의 module을 만들때는 module을 먼저 정의 하고 module안에 package를 만들면됩니다.
module 용도
module은 Go 버전 및 필요한 다른 module 집합을 포함하여 코드를 실행하는 데 필요한 종속성을 지정합니다.
package 용도
Go 코드의 묶음이 package 입니다.
그리고 Every Go program is made up of packages. (=모든 Go 프로그램은 패키지로 구성됩니다)
아래는 go의 main program 입니다. package main으로 시작 하는것을 알수 있습니다. 즉 main도 package로 구현합니다.
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
module 만드는 순서
1. module 만들기
2. package 만들기
3. main package에서 만든 module 사용 하기
module 만들기
1. module로 만들어질 디렉토리를 생성 합니다.
#mkdir greeting
2. go mod init [module path]
#go mod init github.com/toward-the-best/go-modules/greeting
module path는 인터넷을 통해서 다운 받을 수 있는 주소 여야합니다.
* 현재 저는 제 github에 module을 올려서 사용 할 계획 임으로 실제 저의 github 주소를 사용했습니다.
물론 나만 사용할 것이면 아무거나 입려 해도 문제 없습니다.
https://go.dev/ref/mod#go-mod-init
3. go mod init 결과 파일
go module system은 go.mod를 통하여 module간의 의존성을 관리합니다.
go.mod 가 존재하는 directory가 module의 최상위 directory입니다.
file : go.mod
module github.com/toward-the-best/go-modules/greeting
go 1.19
4. go module 시스템 상세 설명
https://go.dev/ref/mod#modules-overview
package 만들기
관계상, package name은 package를 구현하는 경로의 마지막 디렉토리명을 사용합니다.
예를 들어, "math/rand" package 는 package name이 rand로 되어있습니다.
https://cs.opensource.google/go/go/+/refs/tags/go1.19.5:src/math/rand/rand.go
module 을 만들었으니 그안에서 포함하 package를 만들어 보겠습니다.
다름 사람이 사용할수 있는 package 를 만드는 것은 간단 합니다. 외부에 노출 할 함수명을 대문자로 시작해 주면 됩니다.
file path : greeting/greeting.go
package greeting
import (
"fmt"
)
func Hello(name string) string {
message := fmt.Sprintf("Hi, %v. Welcome!", name)
return message
}
* 번외
만든 패키지를 테스트 하는 방법 testing 모듈을 이용합니다.
https://johngrib.github.io/wiki/golang-mod/
main package에서 module 사용 하기
main package가 있는 곳에서 module을 사용하기 위해서 main package 존재하는 directory를 module root directory로 만들어야 합니다. 그래야 go 에서 module system을 통해서 module을 관리 할 수 있기 때문입니다.
module을 만드는 것은 위에서 module만드는 것과 동일 합니다.
다만 차이점이 있다면 module path가 인터넷에서 접근 가능 하지 않아도 된다는 점입니다.
1. main package가 존재하는 directory를 module root directory 로 만들기
#go mod init "toward-the-best.com"
2. main.go 생성
package main
import (
"fmt"
"github.com/toward-the-best/go-modules/greeting"
)
func main () {
fmt.Println("hello")
msg := greeting.Hello("jinkwon.kim")
fmt.Println(msg)
}
3. 의존성 있는 module 다운 받기
아래 명령을 실행하면 go 시스템이 필요한 모듈을 알아서 받고 go.mod에 추가 합니다.
#go mod tidy
go: finding module for package github.com/toward-the-best/go-modules/greeting
go: found github.com/toward-the-best/go-modules/greeting in github.com/toward-the-best/go-modules/greeting v0.0.0-20230119082851-c85023acbc36
#cat go.mod
module toward-the-best.com
go 1.19
require github.com/toward-the-best/go-modules/greeting v0.0.0-20230119082851-c85023acbc36
4. main.go 실행
#go run main.go
hello
Hi, jinkwon.kim. Welcome!
정리
오늘은 downloading 가능한 module을 만들어 보았습니다.
그러나 프로젝트 할 때 내부에서만 사용하는 module이 있습니다. 다음에는 내부에서만 사용하는 모듈을 어떻게 만드는지 알아 보겠습니다.
그리고 추후에 버전관리는 어떻게 하는지 까지 알아 보겠습니다.
'ProgrammingLang > Go' 카테고리의 다른 글
[go] go mod vendor 사용법 (2) | 2023.01.31 |
---|---|
[go] 내부 module 및 package 만들기 (0) | 2023.01.20 |
[go] 개발에 도움되는 오픈소스 (0) | 2023.01.18 |
[Go Lang] package xx is not in GOROOT (/snap/go/9028/src/xx) 해결 방법 (0) | 2022.03.03 |
[Go Lang] 4. 실전 - http server + swagger 만들기 (0) | 2021.04.14 |