golang 모듈을 만들고 타 모듈에서 사용하는 것을 한번 정리해보았다.
내가 만들려고 하는 모듈이 github.com/jeremyko/my_mod 이며,
모듈 폴더는 ~/mydev/my_mod 라고 가정한다.
작업중인 모듈 폴더에서 go mod init 을 수행한다.
cd ~/mydev/my_mod
go mod init github.com/jeremyko/my_mod
수행하면, 내가 만드는 모듈에서 사용되는 모든 외부 코드들의 의존성(dependency)을 추적하기 위한 용도의 go.mod 이 생성된다.
내용은 다음과 같다.
module github.com/jeremyko/my_mod
go 1.15
지금은 내가 만드는 모듈에 대한 정보만 존재하지만, 다른 개발자의 모듈을 import 하는 경우에는 그 의존성 정보들도 추가될것이다.
모듈 코드를 작성한다
my_mod.go 파일을 생성하고 다음 내용을 추가한다.
package my_mod
func MyModTest() string {
return "This is from MyModTest in my_mod"
}
모듈을 사용하는 코드 (모듈)작성
이제, 내가 작성한 my_mod 를 다른 모듈에서 사용하는 측면에서 살펴본다.
이것은 개발중인 모듈을 로컬에서 테스트 하는 용도로도 활용 될 것이다.
main package를 사용하기 위한 용도로 테스트 모듈을 새로 만드는것이다.
이 모듈은 github.com/jeremyko/sample 로 하기로 한다.
이를 위해 sample 디렉토리를 생성하고 이동.
cd ~/mydev
mkdir sample
cd sample
sample 폴더 안에서 다음을 수행한다.
go mod init github.com/jeremyko/sample
sample.go 를 새로 만든다.
package main
import (
"fmt"
"github.com/jeremyko/my_mod" //테스트 해 볼 모듈을 import
)
func main() {
message := my_mod.MyModTest()
fmt.Println(message)
}
현재 디렉토리 구조는 다음과 같다.
jeremyko:~/mydev$ tree
.
├── my_mod
│ ├── go.mod
│ └── my_mod.go
└── sample
├── go.mod
└── sample.go
이제, my_mod 이 배포되어 공개된 모듈이라면 이 상태에서 바로 sample.go 를 실행하면 되겠지만,
지금은 my_mod 모듈이 아직 발행(publish) 되기 전이므로, go 를 사용하여 정식 다운로드를 할수 없다.
즉 github.com/jeremyko/my_mod
와 같은 경로를 현재 사용할수 없다.
그러므로 개발 단계에서는 sample.go 를 실행하기 위해서, 로컬 위치에서 my_mod 모듈을 찾을수 있게 임시로 조정을 해줘야 한다.
이를 위해서는 go mod edit -replace 명령을 사용한다.
sample 디렉토리 안에서 다음을 실행
go mod edit -replace github.com/jeremyko/my_mod=../my_mod
이 명령을 실행하면, go.mod 파일은 다음처럼 변경된다.
module github.com/jeremyko/sample
go 1.15
replace github.com/jeremyko/my_mod => ../my_mod
누락된 모듈을 연결
sample 모듈이 my_mod 모듈을 사용한다는것을 설정하기 위해 다음을 sample 폴더에서 수행한다.
즉 의존성을 정리하기 위한 명령을 수행하는 것이다.
go mod tidy
명령을 실행하면 로컬에서 my_mod 코드를 찾아서 go.mod 파일에 다음처럼 마지막에 require 지시자가 추가된다.
require 지시자는 현재 모듈이 필요로 하는 모듈을 선언하는 용도이다.
module github.com/jeremyko/sample
go 1.15
replace github.com/jeremyko/my_mod => ../my_mod
require github.com/jeremyko/my_mod v0.0.0-00010101000000-000000000000
모듈 경로 다음에 나오는 숫자(v0.0.0-00010101000000-000000000000)는 유사 버전 넘버라고 불리며, 현재 배포되지 않은 모듈을 사용하기 때문에 임시로 생성된 버전 넘버라고 보면 된다.
실제 모듈이 배포가 되는 시점에는 공식 버전 관리 지침대로 버전 넘버를 설정해주면 된다. 물론 이 경우에는 replace 지시자 부분은 제거해 줘야 한다.
실행
sample 폴더에서 다음을 수행하여 결과를 확인한다.
jeremyko:~/mydev/sample$ go run sample.go
This is from MyModTest in my_mod
배포
이제 테스트가 완료된 모듈은 github.com/jeremyko/my_mod 리포지토리에 push 한다.
참고
https://golang.org/doc/tutorial/create-module
https://golang.org/doc/modules/version-numbers
2022-03-24 update
go 1.18부터 도입된 workspace 기능을 사용하면 mod replace 를 대체 가능하다