[Python] PyCharm에서 Poetry를 이용한 디펜던시 관리

소프트웨어 개발시 디펜던시의 관리는 이제 선택이 아닌 필수가 되었습니다. 여태까지 Python 언어를 이용해 소프트웨어 개발을 하였을 때는 requirement를 이용하여 환경별로 디펜던시 관리를 했었습니다.

 

그러나 requirements는 하나의 디펜던시를 설치할 때 하위 요소까지 설치해주지 않아 종속되는 디펜던시를 수동으로 설치해야 하는 불편함이 있습니다. 

 

 

 

 

Poetry

 

Poetry - Python dependency management and packaging made easy.

Intuitive CLI Poetry's commands are intuitive and easy to use, with sensible defaults while still being configurable. Soon extensible with a plugin system

python-poetry.org

Poetry는 Node.js의 package.json과 비슷한 모습으로 명령어 형태로 디펜던시를 설치/삭제가 가능하도록 구현되어 있어 설치하려는 디펜던시의 하위 디펜던시까지 자동으로 설치해주는 편리함을 더하여 Python 개발시 아주 유용하게 사용하고 있는 도구입니다. Python 2.7, 3.5 이상에서 사용할 수 있습니다.

$ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

Mac, Ubuntu에서는 위의 링크를 이용해 파이프 뒤에 원하는 파이썬의 버전 명령어를 넣어주면 Poetry 설치가 완료됩니다.

 

 

 

 

Using PyCharm

PyCharm에서 Poetry를 사용하려면 플러그인 설치와 몇 가지 주요 설정이 필요합니다. 

 

먼저 플러그인에서 Poetry 플러그인을 설치합니다.

 

그러면 New environment using 메뉴에 Poetry라는 메뉴가 생기게 됩니다. PyCharm에서 자동으로 Poetry 명령어의 위치를 찾기 때문에 명령어 위치는 별도로 설정하지 않고, main.py 스크립트를 생성하는 옵션에 체크를 누른 후 프로젝트 생성을 진행해봅시다.

 

그러면 위와 같이 프로젝트가 생성되면서 pyproject.toml 파일이 만들어집니다. Poetry에서는 pyproject.toml 파일을 통해 디펜던시를 관리합니다.

 

파일의 내용을 흘겨만 봐도 아시다시피 poetry에서는 기본적으로 배포 환경 없이 Node.js처럼 개발 환경만을 위한 디펜던시를 별도로 마련해줍니다. 

 

 

 

 

Management Dependencies

이제 Poetry를 설치했으니 디펜던시를 어떻게 설치하고 관리하는지 알아보겠습니다.

$ poetry add requests

기본적으로 add 명령어를 통해 디펜던시를 설치할 수 있습니다. 이는 Node.js에서 제공하는 yarn과 유사함을 알 수 있습니다.

그러면 pyproject.toml 파일에도 동일하게 적용되며 버전을 명시하지 않을 경우 최신 버전의 디펜던시를 설치하게 됩니다. 이에 맞춰 하위 디펜던시도 같이 설치해줍니다.

$ poetry remove requests

디펜던시를 제거할 경우 remove 명령어를 사용합니다. 

이 역시 하위 디펜던시에 영향을 받습니다. 만약 하위 디펜던시와 중복되는 다른 디펜던시가 있을 경우 디펜던시 지옥에 유의해야 합니다.

$ poetry add --dev pytest

개발 환경에 대한 디펜던시를 설정할 땐 --dev라는 추가 인자를 붙여줍니다.

제거할 때도 동일하게 remove 명령어를 주고 --dev 인자를 주면 dev dependeny에서 원하는 패키지가 제거됩니다.

 

 

 

 

 

Architecture

Poetry를 계속 이용하면서 이러한 의문점이 들 것입니다. 기존의 PyCharm에서 requirements를 사용할 때는 Virtualenv를 사용하여 프로젝트마다 다르게 디펜던시를 주기 위해 환경을 나누었고, 이 환경은 프로젝트 상위 폴더에 venv 폴더로 제공됩니다. 

 

그런데, Poetry로 환경 설정을 한 뒤, PyCharm 상위 프로젝트에 venv 폴더가 어디에도 보이지 않습니다. 아마 이 부분을 인지하신 분이시라면 Poetry로 디펜던시 관리할 때 로컬 환경을 사용한다고 생각하실 수도 있을 것입니다.

 

그러나 위에서 스크린샷을 자세히 보시면 External Libraries 부분에 Poetry 환경과 함께 프로젝트 이름이 적혀있는 것을 보실 수 있습니다. 그리고 그 경로에는 virtualenv 환경이 어디에 설치가 되어 있는지가 나와 있는데요. 이처럼 Poetry도 기본적으로 디펜던시 관리를 Virtualenv를 생성한 뒤 진행합니다.

 

requirements랑 다른 점은 프로젝트와 venv의 위치가 서로 다른 위치에 있다는 점입니다. 이렇게 되어 있음으로써 Git이나 SVN 등과 같은 형상 관리 프로그램으로 버전 관리시 실수로 가상 환경까지 업로드 되는 실수를 방지할 수 있으며 Poetry 플러그인을 통해 자동으로 터미널 실행시 가상 환경으로 쉘이 맞춰지기 때문에 개발자가 디펜던시 관리를 위해 쉘을 접속하는 등을 줄일 수 있습니다.

내 프로젝트 환경에 어떤 패키지가 설치 되었는지(하위 디펜던시 포함) 확인하고 싶을 경우 [File] -> [Settings]를 클릭하여 좌측 사이드바에서 Project Python Interpreter를 클릭하면 설치된 디펜던시를 확인함과 동시에 Poetry 환경을 새로 만들고 설정하는 등 고급적인 옵션을 사용할 수 있습니다.

 

 

 

 

 

How to deploy

또 다른 의문점이 있습니다. 그렇다면 배포는 어떤식으로 할 수 있을까요? 기본적으로 Virtualenv를 사용한다면 배포시 내가 수동으로 poetry 명령어를 이용하여 Virtualenv를 만들어야 하는 것일까요? PyCharm에서 플러그인을 이용하여 자동으로 생성하였지만 배포를 해야할 때 이런 과정은 번거롭겠죠?

 

그럴 땐 Poetry 명령어를 사용할 때 기본 옵션에서 virtualenv를 사용하지 않음으로 설정해주면 됩니다.

$ poetry config virtualenvs.create false

poetry config 명령어를 이용하면 가상 환경 생성 옵션을 사용하지 않음(false)로 바꾸면 모든 프로젝트에 대해서 Poetry 환경 사용시 로컬 환경의 Python에서 동작합니다. 따라서 이 옵션은 배포할 때만 사용할 것을 권장합니다. 왜냐하면 최근에는 컨테이너를 이용한 배포 환경이 권장되고, 많이 사용하기 때문입니다.

 

그러면 Docker를 예시로 애플리케이션을 배포할 때 어떤식으로 가는 것이 좋을까요?

FROM python:3
MAINTAINER N.K

WORKDIR /usr/src/app

RUN pip install poetry
RUN poetry config virtualenvs.create false

COPY . .

RUN poetry install --no-dev

COPY . .
# CMD []

poetry를 설치할 시에는 pip로도 설치할 수 있기 때문에 Python의 기본 컨테이너 환경에서 pip로 poetry를 설치하고, 가상 환경 설치 옵션을 비활성화합니다.

 

그리고 pyproject.toml에 설정된 디펜던시를 전체 설치할 경우 poetry install 명령어를 이용하면 됩니다. 따라서 개발 디펜던시를 제외하기 위해 --no-dev 인자까지 추가로 설정하면 깔끔한 배포 환경을 만들 수 있습니다.

 

 

 

 

마치며..

최근 Python을 자주 사용하면서 디펜던시 관리에 많은 불편함을 느꼈습니다. 기존에도 requirements로 잘 사용했었는데 유난히 최근들어 그런 불편함을 자주 느끼게 된 것은 스크립트 개발을 넣어 애플리케이션 레벨의 개발을 하게 됨으로써 그렇게 되었다고 생각합니다.

 

개인적으로 Poetry를 디펜던시 관리에 사용함으로써 편리했던 점은 하위 디펜던시 관리도 있었지만 무엇보다도 디펜던시가 혼동이 발생되었을 때 새로 환경을 구축하고 다시 설정하는 것이 쉬웠다는 점이었습니다. 디펜던시를 관리하다보면 다른 디펜던시와 혼선이 발생하여 제대로 실행되던 애플리케이션이 갑자기 실행되지 않는 문제가 간혹 발생하게 되는데요. requirements를 사용했을 때는 venv를 제거하고, 다시 venv까지 재 구축해야하는 불편함을 호소하고, 거기에 더불어 PyCharm에서 해당 venv 정보까지 수동으로 바꿔야한다는 점은 그야말로 지옥이었습니다.

 

그러나 Poetry는 새로운 환경을 설정하는 데도 PyCharm에 붙어 있는 플러그인들이 친절하게 원하는대로 만들어주고 프로젝트 설정도 쉽게 클릭만으로 이뤄지는 부분이 많았으며 이런 급상황을 대비할 수 있는 차선책이 저를 Poetry로 이끄는 데 주요점이 되었다고 생각합니다.

 

 

 

comments powered by Disqus

Tistory Comments 1