[Go] 사용자 정의 패키지 생성시 발생한 문제

윤동환·2023년 7월 3일
0

Go

목록 보기
3/18
post-thumbnail
  1. 패키지 경로를 잘 맞추어 설정 했음에도 불구하고 GOROOT는 해당 패키지를 찾을 수 없다는 애러를 만났다.

  2. 모듈을 설정하면 되는 것 같아서 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 파일이 없으면 위와 같이 나온다.
    있다면 파일의 절대 경로를 갖고 있는 환경변수 값이 나온다.

해결 방법

  1. 모듈화 시킬 파일 위치에서 go mod init /원하는 도메인/pakagename으로 module을 등록한다.
module testlib.com/music

go 1.17
  1. 모듈을 사용할 main go 파일에서도 마찬가지로 go mod init /원하는 도메인/pakagename으로 module을 등록한다.
module testlib.com/choice

go 1.17
  1. 해당 패키지를 inport 한다.
//main.go
import (
    "testlib.com/music"
)
  1. 아래의 명령어로 go.mod에 종속성을 추가해준다.
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의 위치를 식별하게 해준다.

  1. 모듈의 종속성 동기화 후 코드에 필요하지만 모듈에서 아직 추적되지 않는 종속성 추가
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 .

원하는 출력값이 나왔다.

그런데 위의 방법은 해당 패키지를 외부? 모듈로 만들어서 가져다 쓰게하는 방법이다.

로컬 모듈 사용 방법

만약 파일 구조를 아래처럼 main 내부에서 local 패키지를 사용하고 싶다면

지금 사진의 경우 local package는 monitoring이라는(modules 폴더내에 있는 모든 파일) 패키지 이름을 갖고있다.
사실 패키지 이름은 폴더 이름과 동일시 하면 좋다 monitoring-> modules) 이름을 갖는다고 생각하면 쉽다.

modules 내에 있는 go 파일들을 monitoring이라는 패키지라는 이름으로 두고

이 사진 처럼!

go.mod 파일에서 monitoring이라는 패키지를require하면 사용할수 있다.
다만, replace monitoring => ./modules로 위치를 알려주어야 한다.

최종코드 및 핵심!

main.go

package main

import (
    "fmt"
    "os"	
	"sync"		
	"main/processing"
	"go.uber.org/zap"
)

main 모듈 내에 processing 모듈 import 한다.

processing/xxx.go

package processing

import (
	"fmt"
)

해당 패키지의 go 파일들은 package를 processing이라 정한다.
(monitoring이라는 이름이었지만 최종적으로 바꿈!)

go.mod

module main

go 1.17

원래 require로 패키지를 불러왔으나, 그것은 외부 패키지를 가져올 때 사용하는 것이고,
내부 패키지 (go.mod, main.go 아래에 있는 패키지)는 main.go에서 import 할 떄 모듈 경로로 import 해주면 된다.

profile
모르면 공부하고 알게되면 공유하는 개발자

0개의 댓글