[Go] go 모듈과 버저닝

go에서 모듈 배포는 조금 특이한 방식으로 이루어진다.
코드를 github 등의 원격 레포지토리에 올려둔 뒤에, 태그만 따면 배포가 되는 식이다.

그래서 그냥 코드 적당히 올려두고

태그만 따서 올려도

아래와 같은 식으로 버전을 지정해서 다운을 받을 수 있다.

이때 태그명은 반드시 v로 시작하는 semver여야만 한다.
혹은, 뒤에 베타버전임을 명시해서 임시 배포를 딸 수도 있다.




Go 프록시

Go에서는 모듈을 배포할때 원격 레포에서 태그만 따서 배포한다고 했다.
그럼 모듈의 지속성은 어떻게 유지할까? 레포지토리를 날리면 모듈도 다 터지고 나가리가 날까?

Go에서는 이에 대한 대책으로 중간 프록시를 둬서 삭제 방지를 위한 캐싱과 검증, godoc 문서화까지를 자동화해준다.

프록시 초기화는 go cli를 통해 go module을 처음 설치 시도할때 발생한다.

근데 이걸 가지고 무슨 이상적으로 탈중앙화된 모듈시스템이니 뭐니 하는 소리가 있던데, 결국 저쪽에서 관리하는 프록시를 통해 중앙화된거 아닌가...?
내 보기엔 그냥 웹3식 탈중앙화다.

다른 모듈시스템에서 발생하는 문제는 거의 다 똑같이 나더라.




메이저 버전 업그레이드하기

Go에는 특유의 명확하지 않으면서도 짜증나는 제약사항이 몇가지 있는데, 모듈 버저닝이 그중 하나다.

0이나 1 버전대의 버전으로 모듈을 올리고 쓸때는 아무 문제가 없지만, 메이저 버전이 2를 넘어가면 이상한 제약이 생긴다.

그냥 평범하게 태그를 따고 쓸 수가 없는 것이다.
/v2 같은 디렉터리로 접근하란다...

메이저 버전 업데이트를 최소화하고 뭐 어쩌기 위해서라고 하지만 쓰는 입장에서는 짜증날 뿐이다.
이거 귀찮다고 또 메이저 버저닝 무시하고 마이너만 올리면 뭐 어쩔건가? 이런 제약은 대체 왜 두는건지 모르겠다.




대응법 1: 모듈명을 바꾼다.

그냥 모듈명에 버전 경로만 추가해주고

다운받거나 import할때도 버전 경로를 추가해주면 된다.

근데 잘은 모르겠는데 이것도 잘 안먹히는 경우가 있다.




대응법 2: 버전 디렉터리를 추가한다.

정말 귀찮고 지저분한 방법이지만, 실제로 버전에 대응하는 디렉터리를 만들어서 거기다가 다 옮기는 방법이 있다.

이게 대체 무슨 이점이 있는지는 잘 모르겠다.

다운받고 쓸때는 똑같다.


참조
https://go.dev/doc/modules/version-numbers
https://go.dev/blog/v2-go-modules