My Problem
간혹 go get
으로 제가 만든 도구를 설치 시 구버전(현재는 2버전대인데, 1버전대가..)이 설치되는 이슈가 있었습니다. 또한 pkg.go.dev에도 구버전이 마지막 릴리즈로 있고 변화가 없던 상태였죠.
별일 아니겠거니 하고 방치하다가 최근에 discussions 통해서 물어봤고, 의미있는 해답을 얻어서 과정을 글로 작성해봅니다. https://github.com/hahwul/dalfox/discussions/178
Semantic Import Versioning
brew 등으로 설치하는 패키지는 실제론 바이너리를 시스템에 설치하는 과정이지만, go get
을 통한 바이너리 설치는 git clone
+ go install
과 유사한 과정으로 바이너리를 시스템에 설치합니다. 이러한 방식을 사용하기 때문에 결국 릴리즈 버전이 아닌 패키지 버전을 따라가게 되어, v2,v3,v4 등 메이저 버전 업이 발생한 경우 별도로 경로를 통해 버전 분리가 필요했던 겁니다.
(그래서 이전 버전을 가져온거구요.. )
https://github.com/golang/go/wiki/Modules#semantic-import-versioning
The last sentence is especially important - if you break compatibility, you should change the import path of your package. With Go 1.11 modules, that advice is formalized into the import compatibility rule:
Bump to v2
Change go.mod
아래와 같이 go.mod에 module path를 수정해줍니다.
기존
module github.com/hahwul/dalfox
변경
module github.com/hahwul/dalfox/v2
이후에 테스트를 위해서 tag를 하나 생성해서 push 하였습니다.
git tag v2.3.0-pre.1
git push --tags
v2 버전의 해당 태그로 go pkg를 가져와보니 잘 가져와집니다.
export GO111MODULE=on go get -u github.com/hahwul/dalfox/v2@v2.3.0-pre.1
그리고 pkg.go.dev.에서 확인해보면 v2로 올라갔습니다 🎉
Change code with sd
쉬운 일괄 변경을 위해 sd를 사용합시다.
brew install sd
기존 패키지 경로를 모두 v2로 바꿔주면, 이후에 코드는 v2를 읽어와서 처리하게 됩니다.
sd 'github.com/hahwul/dalfox' 'github.com/hahwul/dalfox/v2' go.* *.go */*.go */*/*.go
sd 'github.com/hahwul/dalfox' 'github.com/hahwul/dalfox/v2' */*/*/*.go */*/*/*.go
Release!
테스트용 tag는 삭제하고, 신규 버전으로 릴리즈 태그를 작성하여 push 하였습니다. 이제부터 아래 명령으로 설치 시 v2 를 바라보아서 다수 테스트해본 결과 간헐적으로 구버전이 설치되던 이슈도 해결됬습니다.
go get -u github.com/hahwul/dalfox/v2@v2.3.0