모듈 소스 관리하기
모듈 소스 관리하기
다른 개발자들이 쓸 수 있게 모듈을 개발한다면, 이 글에서 설명하는 저장소 관례를 따르는 게 좋습니다. 그렇게 하면 다른 개발자들이 내 모듈을 쓰기 훨씬 쉬워져요. 관례 중에는 모듈에서 필수인 것도 있고, 단순히 모범 사례인 것도 있습니다. 이 글은 기본적인 모듈 사용법('Managing dependencies'에서 설명)을 안다고 가정합니다. 모듈 게시를 지원하는 저장소는 Git, Subversion, Mercurial, Bazaar, Fossil이에요.
출처: Go 공식 문서
Go 도구가 게시된 모듈을 찾는 방법
Go의 모듈 게시·코드 검색 시스템은 탈중앙화되어 있습니다. 코드를 저장소에 그대로 둔 채 모듈을 게시할 수 있죠. Go 도구는 저장소 경로와 저장소 태그에 모듈 이름과 버전 번호를 표시하는 이름 규칙에 의존합니다. 내 저장소가 이 요구 사항을 따른다면 go get 같은 Go 도구가 내 저장소에서 모듈 코드를 내려받을 수 있어요.
개발자가 자신의 코드가 import하는 패키지의 소스를 얻기 위해 go get을 실행하면, 그 명령은 다음을 수행합니다.
- Go 소스의 import 문에서 패키지 경로 안의 모듈 경로를 식별합니다.
- 모듈 경로에서 파생한 URL을 사용해, 모듈 프록시 서버나 저장소에서 직접 모듈 소스의 위치를 찾습니다.
- 모듈 버전 번호를 저장소 태그와 대조해 내려받을 모듈 버전의 소스를 찾습니다. 아직 사용할 버전 번호가 정해지지 않았다면
go get은 최신 릴리스 버전을 찾습니다. - 모듈 소스를 가져와 개발자의 로컬 모듈 캐시에 내려받습니다.
저장소에서 코드 구성하기
여기서 설명하는 관례를 따르면 유지보수가 단순해지고 모듈을 쓰는 개발자들의 경험이 좋아집니다. 모듈 코드를 저장소에 넣는 일은 다른 코드와 마찬가지로 간단합니다. 초기 커밋에는 다음 표에 나온 파일들이 포함되어야 합니다.
| 파일 | 설명 |
|---|---|
LICENSE |
모듈의 라이선스 |
go.mod |
모듈을 설명하는 파일. 모듈 경로(사실상 이름)와 의존성을 담고 있습니다. go.mod 참조 문서를 보세요. 모듈 경로는 아래처럼 module 지시문에 주어집니다. |
module example.com/mymodule
모듈 경로 선택에 대해선 'Managing dependencies'를 참고하세요. go.mod 파일을 직접 편집할 수도 있지만, go 명령으로 변경하는 편이 더 안정적입니다.
$ git init
$ git add --all
$ git commit -m "mycode: initial commit"
$ git push
| go.sum | 모듈 의존성의 예상 체크섬을 담는 파일 |
저장소 범위 선택하기 (Choosing repository scope)
코드가 다른 모듈과 독립적으로 버전이 매겨져야 할 때는 그 코드를 모듈로 게시합니다. 저장소 루트 디렉터리에 단일 모듈 하나를 두도록 설계하면 유지보수가 더 단순해지는데, 특히 시간이 지나며 새 minor·patch 버전을 내고 새 메이저 버전으로 분기할 때 그렇습니다. 다만 필요하다면 하나의 저장소에 모듈 여러 개를 유지하는 방법도 쓸 수 있어요.
저장소 하나에 모듈 하나 두기
모듈 하나의 소스만 담는 저장소를 운영할 수 있습니다. 이 모델에서는 go.mod 파일을 저장소 루트에 두고, 그 아래 패키지 서브디렉터리에 Go 소스를 배치해요. 이게 가장 단순한 방식이라 시간이 지나도 관리하기 쉽습니다. 또한 모듈 버전 번호 앞에 디렉터리 경로를 붙일 필요도 없어지죠.
하나의 저장소에 모듈 여러 개 두기
하나의 저장소에서 모듈을 여러 개 게시할 수도 있습니다. 예를 들어 한 저장소에 여러 모듈을 이루는 코드가 있지만, 그 모듈들을 별도로 버전 매기고 싶은 경우가 있겠죠. 이때 모듈 루트 디렉터리가 되는 각 서브디렉터리는 자체 go.mod 파일을 가져야 합니다.
모듈 코드를 서브디렉터리에 두면 모듈 게시에 쓰는 버전 태그의 형태가 바뀝니다. 모듈 루트인 서브디렉터리 이름을 버전 번호 부분 앞에 붙여야 해요. 버전 번호에 대한 자세한 내용은 "Module version numbering"을 참고하세요. 예를 들어 아래의 example.com/mymodules/module1 모듈을 버전 v1.2.3으로 게시한다면 이렇게 됩니다.
- 모듈 경로:
example.com/mymodules/module1 - 버전 태그:
module1/v1.2.3 - 사용자가 import하는 패키지 경로:
example.com/mymodules/module1/package1 - 사용자의
require지시문에 명시되는 모듈 경로와 버전:example.com/mymodules/module1 v1.2.3
더 알아보기 (Learn more)
- 모듈 소스를 저장소에 올리는 더 자세한 흐름은 "Module release and versioning workflow"를 보세요.
- 버전 번호의 의미와 태그 작성법은 "Module version numbering"을 참고하세요.
- 모듈 게시의 단계별 절차는 "Publishing a module"을 확인하세요.