패키지 경로를 잘 맞추어 설정 했음에도 불구하고 GOROOT는 해당 패키지를 찾을 수 없다는 애러를 만났다.
모듈을 설정하면 되는 것 같아서 go mod init을 하였지만 GOPATH outside 에러를 만났다.
그 이유는 go.mod를 GOPATH대신 디폴트로 사용하기 때문이고 이 값을 설정하는 환경 변수는 GO111MODULE=on 으로 확인할 수 있다.
on = 디폴트 사용, off = GOPATH 사용이다.
옵션값 설정으로 둘다 사용할 수 있지만 go.mod를 권장한다.
go.mod 파일은 go mod init하면 자동으로 생성되며
go env를 통해 go.mod의 파일 위치를 확인할 수 있는데
go env를 입력한 위치내에 go.mod 파일이 없으면 위와 같이 나온다.
있다면 파일의 절대 경로를 갖고 있는 환경변수 값이 나온다.
module testlib.com/music
go 1.17
module testlib.com/choice
go 1.17
//main.go
import (
"testlib.com/music"
)
go mod edit -replace 패키지의 도메인주소/패키지명=../패키지 상대경로
->명령어 처리 결과
//main.go의 go.mod 파일 내용
module testlib.com/choice
go 1.17
replace testlib.com/music => ../pkg/module/music
replace로 package의 실제 위치를 파악하고있다.
main.go에서 import하고있는 testlib.com/music의 위치를 식별하게 해준다.
go mod tidy
->명령어 처리 결과
module testlib.com/choice
go 1.17
replace testlib.com/music => ../pkg/module/music
require testlib.com/music v0.0.0-00010101000000-000000000000
위치를 파악했으니 go.mod에 해당 package를 사용할 것이며 그 version을 적어준다.
실행 파일 실행시키기
go run .
원하는 출력값이 나왔다.
그런데 위의 방법은 해당 패키지를 외부? 모듈로 만들어서 가져다 쓰게하는 방법이다.
지금 사진의 경우 local package는 monitoring이라는(modules 폴더내에 있는 모든 파일) 패키지 이름을 갖고있다.
사실 패키지 이름은 폴더 이름과 동일시 하면 좋다 monitoring-> modules) 이름을 갖는다고 생각하면 쉽다.
modules 내에 있는 go 파일들을 monitoring이라는 패키지라는 이름으로 두고
이 사진 처럼!
go.mod 파일에서 monitoring이라는 패키지를require하면 사용할수 있다.
다만, replace monitoring => ./modules로 위치를 알려주어야 한다.
package main
import (
"fmt"
"os"
"sync"
"main/processing"
"go.uber.org/zap"
)
main 모듈 내에 processing 모듈 import 한다.
package processing
import (
"fmt"
)
해당 패키지의 go 파일들은 package를 processing이라 정한다.
(monitoring이라는 이름이었지만 최종적으로 바꿈!)
module main
go 1.17
원래 require로 패키지를 불러왔으나, 그것은 외부 패키지를 가져올 때 사용하는 것이고,
내부 패키지 (go.mod, main.go 아래에 있는 패키지)는 main.go에서 import 할 떄 모듈 경로로 import 해주면 된다.