python 프로젝트를 할 때, poetry를 이용하는 편입니다. dependency 관리가 되기 때문입니다. dev 환경이냐, production 환경이냐에 따라 설치되어야 할 패키지와 그렇지 말아야 할 패키지들이 있는데요. 이들을 어떻게 관리하는지 간단하게 알아보겠습니다.
그리고, poetry package dev 환경에서만 설치되게 하는 명령어도 알아봅시다.
pyproject.toml 파일 읽어보기
자세한 내용은 볼 필요 없습니다. 중요한 것만 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro7.png)
위 그림은 fastapi 프로젝트에 있는 toml 파일 중 일부입니다. tool.poetry에는 갖가지 메타 정보가 들어갑니다. 그 다음 9번째 줄에 tool.poetry.dependencies가 있습니다. 유추해 보자면, 의존성이라고 말할 수 있습니다.
이 의존성에, fastapi와 alembic이 있는 것을 볼 수 있습니다.
- fastapi
- 파이썬 웹 프레임워크
- alembic
- 데이터베이스를 migration을 하기 위한 package.
이로 미루어 보았을 때, poetry 가상 환경에 설치되는 패키지들이라고 생각해 볼 수 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro8.png)
즉, poetry install을 했을 때, fastapi, alembic 등이 설치된다고 할 수 있습니다. 보통 local에서는 poetry 등으로 패키지 관리를 하고, docker에 올릴 때에는 pip와 requirements.txt를 이용해서 설치하곤 해요.
고로, 이 정보를 requirements.txt에 export를 하면 됩니다. pytest와 같이 local 에서만 쓰는 패키지는 따로 관리할 필요가 있어요. 이럴 때에는 어떻게 하면 될까요? poetry add를 할 때, –group 옵션을 주면 됩니다.
poetry add –group 옵션으로 관리하기
package1을 추가할 때, –group v를 주면, 그룹 v에만 package1을 추가하겠다는 정보를 lock 파일에 추가합니다. 이건 또 무슨 이야기인가? 실습을 한 번 해 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro1.png)
먼저, requests를 추가했어요. 그런데, –group 옵션이 들어가지 않았어요. 이러면, 전역으로 추가한다는 것을 의미합니다. 이 상황을 그림으로 그려보면 아래와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro9.png)
poetry 공식 문서에서는 main 이라고 하고 있어요. 이제 아래 명령어를 입력해 볼 거에요.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro2-1.png)
–group dev를 입력해서, poetry package dev 에만 설치되게 했습니다. 그래서 어떤 일이 일어났는가? 그림으로 그려보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro10.png)
그룹 dev에만 pytest 패키지에 대한 정보가 들어갔어요. poetry에서는 특정 그룹에 속한 패키지, 특정 그룹에 속하지 않은 패키지만 export 할 수 있는 옵션을 제공하는데요. 위의 경우, dev 그룹에 속해있는 패키지만 제외하고 export를 하면, pytest가 제외되게 됩니다.
그러면, pyproject.toml에 어떤 정보가 들어갔는지 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro3.png)
먼저 requests는 tool.~.dependencies에 들어가 있어요. 반면, pytest는 group.dev.dependencies에 들어가 있어요. 이는 무슨 말인가? 그룹 dev의 패키지로만 pytest가 들어가 있다는 것을 의미합니다.
잘 적용되었나 확인해 보기
그러면, 의도대로 잘 적용되었는지 확인해 볼까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro11.png)
먼저, poetry show는 모든 가능한 패키지 목록을 봅니다. –with dev 옵션을 붙였으므로, dev에만 선택적으로 붙어있는 패키지도 불러옵니다. pytest가 그림 5에서 보이는 것을 보면 정확히 알 수 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/12/poe_gro12.png)
반면 이 경우는 어떤가요? dev에 선택적으로 붙어있는 패키지를 제외하였습니다. 즉, toml 파일에서 봤던, dev 그룹의 의존성이 제외됩니다. pytest가 그림 6에서 안 보이는 것을 보면 알 수 있어요. 즉, export를 할 때에도 dev 그룹의 의존성을 제외하고 export를 하면 production용 정보를 export 할 수 있다는 이야기가 됩니다.
정리
정리하면 poetry add를 할 때 아래와 같이 하면 dev 에서만 의존성을 가지는 패키지 정보를 추가할 수 있습니다.
- poetry add package –group dev
그리고, 이 그룹에 대한 개념을 이해하는 것이 꽤 중요하니 알아두면 좋습니다.