From pip to poetry - Python ways of packaging and publishing
발표자: Vinícius Gubiani Ferreira
- QA Senior Analyst at Azion (Security | Cells Squads)
- Python Backend Engineer로 오래 일했다고 함
Package Managers
Package Manager: Configuration Management을 위한 tool.
- Configuration Management: System Engineering process for establishing consistence of our products attributes through its lifetime.
Consistence: Same ingredients & Same process -> Same Result.
- 어느 머신에서든 동일한 실행환경을 구성할 수 있도록 하는 것.
Python Package Manager 종류는 정말 많다.
- pip / pipenv / poetry 외에도 이것저것 많음.
- conda - package manager for Data Community
- OS package manager로도 python pkg를 설치할 수 있다.
pip
예컨대 A 패키지에서 쓰는 특정 dependency인 a가 버전이 올라갔는데, 내 런타임 환경에서는 그 dependency를 쓸 수 없는 환경이라고 해보자.
- 디버깅이 쉽지 않다. A 패키지의 a라는 dependency에 문제가 있다는 것을 확인하기 쉽지 않음
- a라는 dependency를 내 런타임에서 실행할 수 있는 버전으로 내린다고 가정하자.
- requirements.txt에 a의 특정 버전을 명시할 때, A 패키지보다 반드시 먼저 명시해야 함. 즉 requirements.txt에 파일의 dependency 서순이 중요할 때가 있다
- 패키지가 커질수록 requirements.txt 파일의 크기가 커지고 지저분해진다.
pipenv
composer, cargo, yarn 등 다른 package manager의 영향을 받아 만들어진 python package manager.
- virutalenv라는 독립된 가상환경을 설정해서 os의 package와 분리. -> sudo 등 시스템 명령어를 사용하지 않으므로 보안 면에서 훨씬 진보함
- requirements.txt 대신 Pipfile 형식을 사용함
- pipfile: keep tracks of the top level packages
- pipfile.lock: keep tracks of lower dependencies
poetry
- pipfile과 같은 기능을 하는 pyproject.toml와 poetry.lock을 사용함
- pip / pipenv처럼 코드를 관리하는 것보다는 project를 관리하는 개념. publishing / packaging 가능
- Python 2.7 지원하지 않음
각 패키지 매니저를 사용해서 packaging하기
별다른 기능 없는, 간단한 웹페이지를 생성한다고 가정
프로젝트 디렉토리 구조는 위와 같다.
- 라이센스, readme
- pyproject.toml
- setup.cfg
- src / test
pip으로 packaging
requirements.txt를 생성한다
pyproject.toml에서 setuptools 설정하고, setup.cfg에서 설정값을 지정한다
- options 필드에서 package_dir 지정
- client에서 해당 pkg 호출하기 위한 entry_point 설정한다 (options.entry_points)
빌드 명령을 수행하면 패키지가 생성된다.
- dist 디렉토리가 생성되고, 디렉토리 안에는 .whl 파일과 tar.gz 파일이 생성됨
- binary distribution: 패키징을 수행한 os 환경에 최적화된 binary. 패키지를 설치할 환경이 패키징한 os환경과 동일하다면 더 빨리 설치할 수 있다.
- source distribution: tar.gz 파일. binary distribution을 쓸 수 없는 환경일 때 사용함.
pypi repository에 업로드하기 위해서는 token이 필요하다. 강연에서는 test.pypi라는 stage 환경을 사용함.
- .pypirc 파일에 토큰값 추가한뒤, pypi에 업로드하는 명령어를 실행하면 된다
pipenv로 packaging
pipenv를 설치하고 dependency를 추가하면, pipfile이 생성된다.
- pipfile.lock의 경우 lower dependency를 관리하기 위한 hash값이 있는 mess 파일. 삭제하지만 않으면 된다
pip 대비 pipenv의 장점
- 어떤 패키지에 어떤 dependency가 연결되어 있는지 그래프로 볼 수 있다는 것
- 보안취약점 확인 가능
- dev environment용으로 지정된 dependency만 설치해서 실행
- 등등...
단, pypi에 패키지 업로드하는 로직은 pip과 거의 비슷하며, 좀더 복잡한 부분도 있음.
- pipenv 사용법 설명하는 강연은 아니므로 poetry로 skip
poetry로 packaging
프로젝트 디렉토리 구조가 pip / pipenv와 약간 다름.
- 필요한 dependency는
poetry add
명령어로 추가하면 된다. poetry.lock과 pyproject.toml 에 dependency가 추가됨
pyproject.toml에서 'entrypoint script'를 지정할 수 있다.
- 예시의 경우 deploy_today_poetry 패키지의 main.main 함수를 사용한다는 뜻
poetry build 수행하면 source distribution / binary distribution을 생성함.
- pypi 토큰도 poetry config command로 추가할 수 있다.
repo에 publish / install도 poetry command로 할 수 있다.
'학습일지 > Language' 카테고리의 다른 글
GopherCon 2023 - the Secret life of Goroutine (0) | 2024.11.30 |
---|---|
Writing Beautiful Package in Go (0) | 2022.05.29 |
Go - Context 정리 (0) | 2022.05.26 |
JIT Compiler (0) | 2021.03.11 |
[Design Pattern] Facade (0) | 2020.12.28 |