ProgrammingLang/Go

[go] downloading 가능한 module 및 package 만들기

jinkwon.kim 2023. 1. 19. 10:13
728x90
반응형

개요

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이 있습니다. 다음에는 내부에서만 사용하는 모듈을 어떻게 만드는지 알아 보겠습니다.

 

그리고 추후에 버전관리는 어떻게 하는지 까지 알아 보겠습니다. 

728x90
반응형