Go Replace를 공부하게 된 계기
Fabric(v2.4.6)의 블록 구조를 수정해보기 위해 시도해보았다. 여러 파일 간 서로 import하고 있기 때문에 type ~ as ~ 에러가 발생하였고 Hyperledger Fabric 프로젝트 내 다른 레포지토리(fabric-protos-go, fabric-config,fabric-chaingode-go...)를 모두 fork하여 수정하는 것은 좋지 않은 방법이라 생각 되어 go replace 방법을 사용해보기로 하였다.
사전 지식
Go mod
A module is identified by a module path, which is declared in a go.mod file, together with information about the module’s dependencies. The module root directory is the directory that contains the go.mod file. The main module is the module containing the directory where the go command is invoked.
모듈은 go.mod파일에 선언된 것을 path형태로 import하여 사용한다.
Go vendor
vendor란
Vendoring is the act of making your own copy of the 3rd party packages your project is using. Those copies are traditionally placed inside each project and then saved in the project repository.
즉, 프로젝트에서 사용하는 외부의 서드-파티 패키지를 프로젝트 내부로 복사하는 것.
직접 프로젝트 내부에 설치된 vendor 폴더 내부의 패키지들을 수정하게 되면 다음과 같은 에러가 발생하였다.
외부 패키지를 직접 수정하려고 하면 에러가 발생하고, go mod tidy, go mod vendor를 실행하면 수정 이전 상태로 돌아가게 된다.
이는 go replace로 해결할 수 있다.
go replace
웹에서 받은 서드 파티 패키지의 dependency를 local 환경을 가르키게 할 수 있다. 또한, 버전의 변경도 가능하다.
사용 예제 1
module github.com/pselle/foo
replace github.com/pselle/bar => /Users/pselle/Projects/bar
require (
github.com/pselle/bar v1.0.0
)
위와 같은 예시로 replace 할 수 있다.
github.com/pselle/bar "패키지" => /Users/pselle/Projects/bar "로컬"
기존에 require에 선언했던 패키지를 replace를 통해 로컬 환경을 가르키도록 수정할 수 있다.
이 후, go install, go build, go mod tidy, go mod vendor 등으로 적용할 수 있다.
사용 예제 2
go mod edit -replace github.com/pselle/bar=/Users/pselle/Projects/bar
go.mod 파일을 직접 수정하기 어려운 경우, 위와 같은 방법으로 대체할 수 있다.
위와 같은 방법을 사용하면, go.mod 파일을 열어 수정하지 않고 명령어를 통해 go.mod파일을 수정할 수 있다.