Go 1.16: Go 모듈에서 버전 철회
Source: Dev.to

서문
Go Modules는 Go 1.11에서 공식적으로 도입되었으며, Go 1.16부터 기본적으로 활성화됩니다. 패키지가 이미 배포된 경우 다음과 같은 상황을 마주할 수 있습니다:
- 릴리스된 버전에서 심각한 문제가 발견되어 다른 사람이 사용하지 못하도록 하고 싶을 때.
- 잘못된 버전 번호로 실수해서 배포했을 때(예: 의도한
v0.4.0대신v1.0.0을 배포).
패키지가 이미 배포된 상황에서는 모듈 버전 리트랙션을 통해 문제를 알리고 해당 버전의 향후 사용을 차단해야 합니다.
이 글에서는 Go 1.16에 추가된(아직 널리 알려지지 않은) 리트랙션 기능을 설명하고, 사용 방법을 시연합니다.
TL;DR
리트랙션이란?
리트랙션은 특정 모듈 버전을 retracted(리트랙션) 상태로 표시하여, 해당 버전이 문제를 포함하고 있으므로 사용하면 안 된다는 것을 나타냅니다.
왜 리트랙션이 필요한가?
전형적인 시나리오:
- 중대한 버그가 발견되어 이미 배포된 버전을 사용하고 있는 다른 프로젝트에 영향을 미칠 때.
- 잘못된 버전 번호가 릴리스된 경우(예:
v0.4.0을v1.0.0으로 잘못 배포) 다른 프로젝트가 이를 의존하고 있을 때.
리트랙션을 통해 모듈 작성자는 이러한 문제를 go get/go list 명령을 통해 직접 사용자에게 전달할 수 있습니다.
이전에는 리트랙션을 어떻게 처리했는가?
Go 1.16 이전에는 내장된 리트랙션 메커니즘이 없었습니다. 작성자는 README에 주석을 남길 수 있었지만, go get이 자동으로 해당 정보를 표시할 방법은 없었습니다.
Go Modules 리트랙션 사용법
다음 예시는 공식 Go Playground 데모를 기반으로 합니다.
문제 1: 릴리스된 버전에서 심각한 문제가 발견됨
모듈 gopher.live/ue0ddd4a99c02/proverb를 관리하고 있으며 이미 v0.2.0을 릴리스했다고 가정합니다. 심각한 버그를 발견했으므로 해당 버전을 리트랙션하고 싶습니다.
-
retract 지시문을
go.mod에 추가:go mod edit -retract=v0.2.0go.mod는 다음과 같이 보입니다:module gopher.live/ue0ddd4a99c02/proverb go 1.16 // Go proverb was totally wrong retract v0.2.0 -
새 버전을 커밋하고 태그 지정(예:
v0.3.0):git add -A git commit -m "Fix severe error in Go proverb" git push origin main git tag v0.3.0 git push origin v0.3.0 -
리트랙션된 버전을 가져오려 할 때 경고 확인:
go get gopher.live/ue0ddd4a99c02/proverb@v0.2.0 go: warning: gopher.live/ue0ddd4a99c02/proverb@v0.2.0: retracted by module author: Go proverb was totally wrong go: to switch to the latest unretracted version, run: go get gopher.live/ue0ddd4a99c02/proverb@latest go get: downgraded gopher.live/ue0ddd4a99c02/proverb v0.3.0 => v0.2.0이 경고는
v0.2.0을 더 이상 사용하면 안 된다는 점을 명확히 알려 주며, 사용자를 최신 리트랙션되지 않은 버전으로 안내합니다.
관련 질문
- 리트랙션 정보를 보려면
go get(또는go list)을 실행해야 하나요?
네. 리트랙션 메타데이터는go get,go list등 모듈을 조회할 때 함께 가져옵니다.