여러 환경에 대한 requirements.txt를 사용자 지정하는 방법은 무엇입니까?


112

저는 개발과 생산이라는 두 가지 지점이 있습니다. 각각에는 종속성이 있으며 일부는 다릅니다. 개발은 자체적으로 개발중인 종속성을 가리 킵니다. 생산도 마찬가지입니다. 'requirements.txt'라는 단일 파일에서 각 분기의 종속성을 예상하는 Heroku에 배포해야합니다.

정리하는 가장 좋은 방법은 무엇입니까?

내가 생각한 것 :

  • 각 분기에 하나씩 별도의 요구 사항 파일을 유지합니다 (빈번한 병합에서 살아남 아야합니다!).
  • 어떤 요구 사항 파일을 사용하고 싶은지 Heroku에게 알려주세요 (환경 변수?)
  • 배포 스크립트 작성 (임시 분기 생성, 요구 사항 파일 수정, 커밋, 배포, 임시 분기 삭제)

1
더 쉬운 배포 스크립트 : 2 개의 파일을 유지합니다. 그들 사이에 심볼릭 링크를 사용하십시오.
Udy

답변:


207

요구 사항 파일을 계단식으로 배열하고 "-r"플래그를 사용하여 pip에 한 파일의 내용을 다른 파일 안에 포함하도록 지시 할 수 있습니다. 요구 사항을 다음과 같이 모듈 식 폴더 계층으로 나눌 수 있습니다.

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

파일의 내용은 다음과 같습니다.

common.txt :

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt :

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt :

# Same for prod...
-r common.txt
prod_req==1.0
...

이제 Heroku 외부에서 다음과 같은 환경을 설정할 수 있습니다.

pip install -r requirements/dev.txt

또는

pip install -r requirements/prod.txt

Heroku는 특별히 프로젝트 루트에서 "requirements.txt"를 찾기 때문에 다음과 같이 prod를 미러링해야합니다.

requirements.txt :

# Mirrors prod
-r requirements/prod.txt

2
heroku에서 서로 다른 환경에 대해 별도의 요구 사항 파일을 사용하는 방법에 대한 문제를 무시했습니다.
Ed J

29
나는 내 대답이 그것을 다루었다고 믿는다.
Christian Abbott

1
스테이징 (추가 디버그 패키지가 필요한 경우) 및 프로덕션 환경 (이러한 디버그 패키지가 필요하지 않은 경우)을 위해 Heroku에 대해 서로 다른 요구 사항을 갖는 방법을 찾고있었습니다. 불행히도 @EdJ가 말했듯 이이 답변은 이것을 다루지 않습니다.
Antoine Pinsard

1
귀하의 질문을 오해하거나 귀하의 질문이 원래 포스터와 다를 수 있습니다. 그러나 설명을 위해 스테이징 브랜치의 requirements.txt에는 "-r requirements / staging.txt"(또는 유사)가 포함될 수 있고, prod 브랜치의 브랜치에는 "-r requirements / prod.txt"가 포함될 수 있습니다 (내 답변 끝 참조). 적절한 분기를 해당 Heroku 인스턴스에 동기화합니다.
Christian Abbott

2
@SohamNavadiya 내가 요청한 것이 아닙니다. base.txt3 개의 패키지가 포함되어 dev.txt있고 1 개의 패키지가 포함되어 있다고 가정 해 보겠습니다 (및 -r base.txt). 내 가상 환경에 4 개의 패키지가 모두 설치되어 있습니다. 이제 다섯 번째 패키지를 설치하고 dev가 아닌 base에 나열하고 싶습니다. 어떻게해야합니까? 물론 설치할 수 pip freeze > base.txt있지만 문제가 해결되지는 않습니다. 그런 다음 내가 원하지 않는 4 번째 dev 종속성을 기본으로 설정합니다.
Manan Mehta

10

원래 질문과 답변이 게시되었을 때 존재하지 않았던 오늘날 실행 가능한 옵션은 종속성을 관리하기 위해 pip 대신 pipenv 를 사용 하는 것입니다.

pipenv를 사용하면 pip와 같이 두 개의 개별 요구 사항 파일을 수동으로 관리 할 필요가 없으며 대신 pipenv는 명령 줄에서 상호 작용을 통해 개발 및 프로덕션 패키지 자체를 관리합니다.

프로덕션 및 개발 모두에서 사용할 패키지를 설치하려면 다음을 수행하십시오.

pipenv install <package>

개발 환경 전용 패키지를 설치하려면 :

pipenv install <package> --dev

이러한 명령을 통해 pipenv는 환경 구성을 두 개의 파일 (Pipfile 및 Pipfile.lock)에 저장하고 관리합니다. Heroku의 현재 Python 빌드 팩은 기본적으로 pipenv를 지원하며 requirements.txt 대신 Pipfile.lock이있는 경우 자체 구성합니다.

도구에 대한 전체 문서는 pipenv 링크를 참조하십시오.


4
pipenv는 시간 낭비입니다. 잠금이 너무 오래 걸립니다.
nurettin

9
pipenv는 거의 모든 측면에서 손상되었습니다. 많은 것을 약속하지만 배송은 매우 적습니다
ospider

4
@ospider 매일 pipenv를 사용하고 있으며 귀하와 nurettin이보고하는 것과 같은 부정적인 문제가 발생하지 않습니다. pipenv 버전 2018.10.13으로 작업 따라서 모든 측면에서 깨진 것은 매우 빈 진술입니다.
Kwuite

1
@Kwuite 마지막 문장의 정서를 공유합니다. 비판적이지만 공허한 의견 일 때 참여할 대화가 거의 없습니다.
Christian Abbott

3
nurettin 및 ospider에 동의하십시오. pipenv는 끔찍합니다.
Andrew Palmer 19 년

3

요구 사항이 동일한 컴퓨터의 환경간에 전환 할 수 있어야하는 경우 전환해야하는 각 환경에 대해 서로 다른 virtualenv 폴더를 만들어야 할 수 있습니다.

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.