항상 가상환경은 conda만 써왔었는데, 새롭게 알게된 pipenv! 블로깅을 해보장 🌈
🔍 python을 사용하면서 당연하게도 사용하게 되는 두가지.
- 첫번째는 pip이다. python을 이용하며 사용하게 되는 패키지 관리 툴이다. 프로그램을 만들 때, 의도하지 않는 이상, 다양한 패키지를 사용하게 된다. 이때 pip를 활용하여 여러가지 패키지들을 설치할 수 있다.
- 두번째는 virtualenv이다. python으로 개발을 하게 되면 거의 항상 복수의 패키지를 설치하여 사용하게 된다. 하지만 각각의 프로젝트가 요구하는 패키지들의 상세 내용이 다를 수 있다.
A라는 프로젝트는 특정 패키지의 1.0 버전을 사용하고 있었지만, B라는 프로젝트는 특정 패키지의 2.0버전을 사용하는 경우가 발생한다. 그렇기 때문에 각각의 프로젝트 내 개발 환경을 구축하는 것이 제일 이상적이다. 이를 지원하는 것이 virtualenv이다. virtualenv는 프로젝트별로 고립된 개발환경을 구축하게 해주기 때문에 A 프로젝트와 B 프로젝트를 따로 의식하면서 패키지를 특정 환경에 맞게 설치했다 지웠다 하지 않으며 개발할 수 있게 된다.
하지만 여기서 문제가 발생!!. 첫번째는 pip는 패키지들을 설치하는데 쫌 귀찮음. pip를 하나씩 설치를 하자니 시간이 많이 든당. 그래서 requirements.txt라는 파일을 통해 통으로 패키지들을 관리할 수 있도록 지원하고 있다. 하지만 문제는 requirements.txt를 버전을 명시하지 않고 작성하였을때, 오늘과 내일의 설치가 똑같다는 보장이 없으며 정확히 버전을 모두 기재를 하자니 또한 귀찮아진다. 결론은 pip도 virtualenv도 매번 환경 설정을 의식해야 하는것들이 많기 때문에 여러모로 귀찮아...🙈
이런 이유들로 인해 등장한 것이 pipenv!! 🥳
pip와 virtualenv가 합쳐진 것! 🥳
$ brew install pipenv
$ pipenv shell
# pipenv 가상환경 활성화
$ pipenv update
# Pipfile.lock 빌드
$ pipenv install --system
# 의존성 패키지 설치 !
# Pipfile.lock 생성됐는지 확인!
필요한 패키지들을 다 깔고 실제로 pipfile에 들어가보면 요렇게-
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
asgiref = "==3.4.1"
bcrypt = "==3.2.0"
certifi = "==2021.10.8"
cffi = "==1.15.0"
cryptography = "==35.0.0"
django-cors-headers = "==3.10.0"
pycparser = "==2.20"
pytz = "==2021.3"
six = "==1.16.0"
sqlparse = "==0.4.2"
Django = "==3.2.8"
PyJWT = "==2.3.0"
[dev-packages]
[requires]
python_version = "3.9"
많은 것들이 다- 깔려있다.
$ pipenv shell
Launching subshell in virtual environment…
. /Users/dale/.local/share/virtualenvs/learn-python-XBV2stdv/bin/activate
(learn-python) $ which python
/Users/dale/.local/share/virtualenvs/learn-python-XBV2stdv/bin/python
EX) requests라는 패키지를 설치.
$ pipenv install requests
Installing requests…
Adding requests to Pipfile's [packages]…
✔ Installation Succeeded
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✔ Success!
Updated Pipfile.lock (444a6d)!
Installing dependencies from Pipfile.lock (444a6d)…
🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
패키지가 설치가 완료되면 Pipfile 파일의 [packages] 항목에 설치된 패키지가 나옴.
pipfile
[packages]
requests = "*"
📌 Pipfile.lock 파일도 함께 생성이 되는데!
pipfile.lock은 pipenv가 설치된 패키지의 버전과 그 패키지가 의존하는 다른 패키지들의 정확한 버전을 기억하기 위해서 자체적으로 사용하는 파일. 따라서 우리가 직접 수정할 일은 없으며, 수정해서도 안됨. 이렇게 pipenv는 Pipfile.lock이라는 패키지 잠금 파일을 사용해서 Pipfile 파일에 정확한 버전이 명시되어 있지않더라도 항상 동일한 버전의 패키지를 설치할 수 있도록 해줌.... 고마왕...🥰
pipenv는 협업 프로젝트에서 여러 개발자들이 함께 일할 때 더 죠음. 이번 프리온보딩때도 pipenv로 했는데 짱 편했다. 왜냐면, Pipfile 파일과 Pipfile.lock 파일만 있으면 누구나 동일한 가상 환경을 구성하고 동일한 버전의 패키지를 설치할 수 있어서. 프로젝트 내 모든 개발자들은 Git 저장소에 올려둔 Pipfile 파일과 Pipfile.lock 파일은 내려받은 후에 pipenv install 커맨드 하나로 모든 패키지를 한 방에 설치할 수 있음!
자주 사용해야지! 익숙해지기! 🌈