python 패키지 관리 방법 중 기본적인 방법은 pip로 패키지를 설치하고 pip freezerequirement.txt 생성하여 패키지 목록을 관리하는 것입니다.

그러나 pip 패키지 설치시 패키지 간 의존성 관계를 무시하고 강제 설치하는 일이 발생 할 수 있습니다. 또한 requirement.txt를 작성 할 때 cryptography = "^2.6.1" 와 같이 캐럿방식으로 작성할 경우 범위 내의 최신버전이 설치되기에 의존성에 문제 되는 경우 설치 문제가 발생 할 수 있습니다.

얼마전 오랜시간 관리되지 않은 프로젝트를 정비해야 할 때 시간을 많이 소비하였습니다. pip install -r requirement.txt 로 설치를 시도 할 때 의존성 문제로 설치에 실패하였습니다. 설치 성공한 패키지의 버전별 배포 날짜를 확인하고 의존성 관계있는 패키지는 비슷한 시기에 어떤 버전을 배포햇는지 하나한 확인하여 requirement.txt를 수정해야 했습니다.

결국 python 패키지 관리를 poetry로 변환 하였으며 과정을 정리합니다.

초기 설정

해당 프로젝트에서 poetry init 을 실행하여 poetry 초기 설정을 진행합니다

초기 설정 후 pyproject.toml 파일이 아래와 같이 생성됩니다.

pyenv 와 같은 가상환경 관리 도구를 사용하고 있다면 아래 명령어를 사용하여 poetry 가상환경 설정을 변경하는것이 좋습니다.

poetry config virtualenvs.in-project true

패키지 추가

패키지 추가시 poetry.lock 파일이 없는 상태라면 pyproject.tomldependencies 영역에 설치할 패키지를 수기로 작성해도 됩니다.

의존성을 문제 없이 패키지를 추가 하고자 한다면 poetry add 명령어로 사용할 패키지를 추가합니다. 명령어 실행시 관련된 패키지를 아래와 같이 설치합니다.

패키지를 업데이트 할때도 add 명령어를 사용하여 poetry add "package==2.3.1" 과 같이 버전 제한을 전달 하면 됩니다.

설치 완료 후 poetry.lock 파일이 생성되며 패키지 정보가 기록됩니다.

패키지 업데이트가 필요하다면 poetry update alembic과 같이 입력하여 특정 패키지만 업데이트 가능합니다.

패키지 설치

패키지를 모두 추가한 후 poetry.lock 파일을 소스코드와 같이 배포하고 pip install -r requirement.txt 대신 poetry install 을 사용하여 패키지를 설치하면 됩니다.

private 저장소 적용

private 패키지 저장소를 사용해야 한다면 저장소 설정이 필요합니다. 아래 명령어를 사용하여 private 저장소를 설정합니다. 아래는 gemfury 저장소 사용 예시입니다.

poetry config repositories.spoqa-fury https://pypi.fury.io/your_project/
poetry config http-basic.spoqa-fury "GEMFURY_TOKEN" ""

설정 확인

현재 poetry 설정을 확인 할때 아래 명령어를 사용합니다.

poetry config --list 

공식문서를 참고하여 작성하였습니다