우리 팀에는 AI 서비스 전용 종속성 스냅샷 파일이 하나 있었다.
requirements.txt 파일 하나에 미리 정의 된 디펜던시들이 모두 담겨져 있는 형태였는데, 이 파일을 참조할 때마다 좀 불편하다고 느꼈다.
패키지 개발 과정에서 공통의 버전을 사용하기 위해 이 .txt 파일을 메뉴얼하게 매번 찾아봐야 했기 때문이다.
이 과정이 은근 번거롭다보니 나 또는 팀원들은 최신 버전을 받아 쓰다가 패키지 완성 후 공통 버전에 맞추어 다시 resolving 하곤 했다.
(그러다 버전 충돌 나거나 버전 간 인터페이스가 안 맞으면 그걸 또 풀어주는게 비효율이다.)
어쨌든 이게 버전 참조가 불편해서 그런거라 생각했다.
그래서 참조 하기 수월한 형태의 공통 종속성 관리 방식을 찾아보다, Meta-Package 라는 개념을 알게 되었다.
이번 글에서는 이에 대해 정리하고자 한다.
내가 원한 종속성 관리 방식은 다음 두 가지 특성을 가져야 한다.
"종속성만 정의되어 있는 껍데기 패키지"를 사내 저장소에 배포해놓으면 쉽게 참조해서 쓸 수 있지 않을까 싶었는데 이런 형태를 meta-package라 부른다는 걸 챗지피티를 통해 알게 되었다.

근데 또 구글에 검색해보니 잘 나오진 않는다. 이게 진짜 있는 개념인가 싶어 좀 더 찾아보니

askubuntu 에 올라온 글이 있었다. 지피티가 말해준 설명과 거의 같다. 용어 자체가 리눅스 패키지 시스템에서 많이 쓰는 말인듯 하다.
conda에서도 제공하는 meta package가 있는데, anaconda라는 패키지다. conda install anaconda 커맨드를 날리면 data science를 위한 패키지들을 묶음으로 설치해준다.

현재는 팀에서 poetry를 종속성 툴로 쓰고 있기 때문에, 나는 poetry 기반으로 meta-package를 작성하고 배포했다.
배포 후에는 이 패키지를 인스톨 하는 식으로 공통 종속성을 사용하고 있다. 한번, poetry로 meta-package를 작성하는 예시를 보자.
아래와 같이 poetry 환경으로 초기화 된 프로젝트를 만든다.
project/
├── .gitignore
├── README.md
├── pyproject.toml
├── poetry.lock
└── metapackage/
└── __init__.py
메타 정보를 담는 것 외에는 기능을 갖지 않기 때문에 metapackage 디렉토리는 비워둔다.
pyproject.toml에 공통 종속성을 정의한다.
[tool.poetry]
name = "metapackage"
version = "1.0.0"
description = "Shared Dependency"
authors = ["..."]
[tool.poetry.dependencies]
python = "^3.11"
pandas = {version = "2.2.2", optional = true}
numpy = {version = "1.26.4", optional = true}
fastapi = {version = "0.109.2", optional = true}
pytest = {version = "8.3.2", optional = true}
[tool.poetry.extras]
research = ["pandas", "numpy"]
test = ["pytest"]
...
이때, optinal = true로 정의된 종속성들은 poetry install 커맨드 실행 시 설치되는 기본 패키지에 포함되지 않는다.
선택적으로 설치할 패키지들을 extras 섹션에서 그룹 별로 묶어 줄 수가 있는데, 예를 들어
poetry add metapackage --extras data
위 커맨드를 (배포 후) 실행하면 research 그룹의 패키지들만 선택적으로 설치할 수 있다.
meta-package를 참조해서 쓰다보면 외부 pyproject.toml을 깔끔하게 작성할 수 있는 장점도 있다.
하지만 쓰고자 하는 패키지 조합이 개발 프로젝트마다 다양하다보니 extras 그룹을 계속 추가 정의 해줘야 하는 경우가 많다.
개발 효율을 생각하면, 개발 과정에서는 --extras all로 설치해서 쓰다가 개발 후 최종 그룹을 한번 정의 해주는 것도 방법이다.