내 git 저장소에 virtualenv 디렉토리를 두는 것이 좋지 않습니까?


285

Django 웹 응용 프로그램의 virtualenv를 응용 프로그램의 git 저장소 안에 넣는 것에 대해 생각하고 있습니다. 배포를 간단하고 쉽게 유지하는 쉬운 방법 인 것 같습니다. 내가 이것을해서는 안되는 이유가 있습니까?

답변:


302

내가 사용하는 pip freeze난에 필요한 패키지를 얻기 위해 requirements.txt파일을 내 저장소에 저를 추가 할 수 있습니다. 전체 virtualenv를 저장하려는 이유를 생각했지만 시도 할 수 없었습니다.


81
repo에 불필요한 공간을 절약하고 virtualenv --no-site-packages --distribute .env && source .env / bin / activate && pip install -r requirements.txt 단일 명령으로 새 서버에 배포 할 수 있습니다.
— RyanBrady

2
이 질문에 대한 답변을 드리겠습니다. 아마도 "모범 사례"일 것입니다. 나는 모두가 언급 한 문제 중 일부를 분명히 만났습니다. 나는 너희들이 모두 함께 제안한 것을하고 pip와 요구 사항 파일을 사용하기 전에 다른 날을 엉망으로 만드는 것으로 추정하고있다. 당신의 도움을 주셔서 감사합니다!
— 라일 프랫

11
예 pip install mysql-python를 들어 64 비트 시스템에서 32 비트 시스템을 가진 사람이이를 사용하려고하면 작동하지 않습니다. 많은 Python 모듈과 마찬가지로 C 모듈을 사용하여 성능을 향상시킵니다. Windows-> Linux도 작동하지 않는다고 생각합니다.
— 매트 윌리엄슨

7
단지 비고 : 과거에는 라이브러리가 pip (버전이 너무 오래된 버전)에서 사용할 수 없어 사이트가 다운 된 상태에서 업그레이드를 수행했기 때문에 약간의 시간이 걸렸습니다. 그래서 ... 이제는 pip freeze다시는이 작업 에 의존 하지 않습니다. 문제는 강제 업그레이드 재배포 중에 아무도 비용을 지불하지 않으며 중간 업그레이드 ( "모범 사례"유지 관리)에 대해서는 아무도 지불하지 않는다는 것입니다.
— 계약이 맞습니다 I 'm right

5
@RayanBrady 주석에 대한 참고 사항 : --distribute및 --setuptools옵션은 이제 작동하지 않습니다. (배포, 그것은 setuptools의 포크였으며 오래 전에 병합되었습니다). --no-site-packages더 이상 사용되지 않습니다. 이제 기본 동작입니다
— JackNova

49

git에 virtualenv 디렉토리를 저장하면 git clone (Apache / mod_wsgi 설치 및 구성)을 수행하여 전체 앱을 배포 할 수 있습니다. 이 접근 방식에서 잠재적으로 중요한 문제 중 하나는 Linux에서 전체 경로가 venv의 activate, django-admin.py, easy_install 및 pip 스크립트에 하드 코딩된다는 것입니다. 이는 다른 경로를 사용하려는 경우 (예 : 동일한 서버에서 여러 가상 호스트를 실행하려는 경우) virtualenv가 완전히 작동하지 않음을 의미합니다. 웹 사이트가 실제로 해당 파일에서 잘못된 경로로 작동 할 수 있다고 생각하지만 다음에 pip를 실행하려고하면 문제가 발생합니다.

이미 제공된 해결책은 배포하는 동안 virtualenv를 만들고 필요한 pip 설치를 수행 할 수 있도록 충분한 정보를 git에 저장하는 것입니다. 일반적으로 사람들 pip freeze은 목록을 가져 와서 requirements.txt라는 파일에 저장합니다. 로로드 할 수 있습니다 pip install -r requirements.txt. RyanBrady는 이미 deploy 문을 한 줄로 묶는 방법을 보여주었습니다.

# before 15.1.0
virtualenv --no-site-packages --distribute .env &&\
    source .env/bin/activate &&\
    pip install -r requirements.txt

# after deprecation of some arguments in 15.1.0
virtualenv .env && source .env/bin/activate && pip install -r requirements.txt

개인적으로, 나는 이것을 git clone 또는 git pull 후 셸 스크립트에 넣습니다.

virtualenv 디렉토리를 저장하면 업그레이드로 인한 파일을 수동으로 추가 / 제거 및 커밋해야하므로 pip 업그레이드를 처리하기가 약간 까다로워집니다. requirements.txt 파일을 사용하면 requirements.txt에서 해당 줄을 변경하고 다시 실행하면 pip install -r requirements.txt됩니다. 이미 언급했듯이 "커밋 스팸"도 줄입니다.


4
--distribute는 이제 더 이상 사용되지 않습니다 (최소 15.1.0 이상) : --distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
— AnthonyC

1
--no-site-packages15.1.0에서는 더 이상 사용되지 않으며 이제는 기본값입니다.
— cjs

35

PyCrypto와 같은 환경에 따라 다르게 컴파일 된 라이브러리를 사용하기 시작할 때까지 동일한 작업을 수행했습니다. Cygwin에서는 PyCrypto mac이 작동하지 않으며 Ubuntu에서는 작동하지 않습니다.

저장소를 관리하는 것은 완전히 악몽이됩니다.

어느 쪽이든 pip 동결 및 요구 사항 파일을 모두 git에 넣는 것보다 관리하기가 더 쉽다는 것을 알았습니다. 라이브러리가 업데이트 될 때 수천 개의 파일에 대한 커밋 스팸을 피할 수 있기 때문에 더 깨끗합니다 ...


흠. 나는 다른 환경에서 다르게 컴파일되는 것들에 문제가 없을 것입니다. 커밋 스팸을 피하기 위해 그렇게하지 않는 것이 좋습니다.
— Lyle Pratt

@LylePratt : 반대 생각 : PyCrypto 또는 PIL과 같은 훌륭한 도구가있는 문제를 피하기 위해 저장소에 전체 virtualenv를 포함하지 않는 것이 좋습니다.
— Tadeck

17

가장 큰 문제는 다른 사람들이 virtualenv를 사용할 수 없다는 것입니다. 이유는 항상 절대 경로를 사용하기 때문입니다. 따라서 예를 들어 virtualenv 인 /home/lyle/myenv/경우이 저장소를 사용하는 다른 모든 사람들에게 동일하다고 가정합니다 (정확히 동일한 절대 경로 여야 함). 당신과 같은 디렉토리 구조를 사용하는 사람들을 추정 할 수 없습니다.

더 좋은 방법은 모든 사람이 자신의 환경을 설정하고 (virtuenv가 있거나없는 환경) 라이브러리를 설치하는 것입니다. 또한 virtualenv가 플랫폼마다 다르게 설치되어 있기 때문에 다른 플랫폼 (Linux / Windows / Mac)에서 코드를 더 유용하게 사용할 수 있습니다.


이것은 SCM에 virtualenv를 유지하는 것이 좋지 않은 이유에 대해서는 맞지 만, @RJBrady의 제안이나 이벤트 bootstrap.py 스크립트 와 같은 것을 고려해 볼 가치 가 있습니다. 다른 사람들과 일할 때 심각한 필요가 있습니다.
— ig0774

나는 당신이 언급 한 문제가 내 상황에서 정확히 문제가 될 것이라고 확신하지 않습니다. 내 Django 앱에는 virtualenv가 위치와 관련된 위치를 정의하는 .wsgi 파일이 있습니다 (2 개의 디렉토리 위로 '../../env'). 따라서 내 시나리오에서 절대 경로 문제는 나에게 부정적인 영향을 미치지 않아야합니다 ... 맞습니까?
— 라일 프랫

항상 WSGI를 사용하여 앱을 실행하면 앱에서 벗어날 수 있습니다. 를 통해 개발 서버를 사용하면 manage.py확실히 문제가 발생합니다.
— Torsten Engelbrecht

3

나는 기본적으로 David Sickmiller의 대답 을 약간 더 자동화하여 사용합니다. activate다음 내용으로 이름이 지정된 프로젝트의 최상위 레벨에 (실행 파일이 아닌) 파일을 만듭니다 .

[ -n "$BASH_SOURCE" ] \
    || { echo 1>&2 "source (.) this with Bash."; exit 2; }
(
    cd "$(dirname "$BASH_SOURCE")"
    [ -d .build/virtualenv ] || {
        virtualenv .build/virtualenv
        . .build/virtualenv/bin/activate
        pip install -r requirements.txt
    }
)
. "$(dirname "$BASH_SOURCE")/.build/virtualenv/bin/activate"

(David의 답변에 따르면 pip freeze > requirements.txt요구 사항 목록을 최신 상태로 유지하기 위해 노력 하고 있다고 가정합니다 .)

위의 일반적인 아이디어를 제공합니다; 실제 활성화 스크립트 ( 문서 내가 일반적으로 사용이 제공하는 좀 더 복잡한 것을) -q사용 (자동) 옵션을 python때 python3등을 사용할 수 없습니다

그러면 현재 작업중인 디렉토리에서 소스를 얻을 수 있으며 필요한 경우 먼저 가상 환경을 설정하여 올바르게 활성화됩니다. 내 최상위 테스트 스크립트에는 일반적으로 개발자가 먼저 활성화하지 않고도 실행할 수 있도록 다음 줄에 코드가 있습니다.

cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . ./activate

소싱 은 여기서 중요 ./activate하지 않습니다 activate. 후자는 activate현재 디렉토리에서 경로를 찾기 전에 경로에서 다른 것을 찾을 수 있기 때문 입니다.


이 접근법을 사랑합니다! 매우 합리적으로 들리므로 공유해 주셔서 감사합니다.
— Esolitos 2019

[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }원본과 달리 스크립트가 실행되고 있는지 감지 하기 위해 첫 번째 줄을 변경해야했습니다.
— Chris Snow

3

리포지토리를 사용하는 주요 측면 중 하나로 레포지토리에 환경 종속적 구성 요소 나 설정을 포함시키는 것은 좋은 생각이 아닙니다. 아마도 다른 개발자와 공유하는 것입니다. 다음은 Windows PC (예 : Win10)에서 개발 환경을 설정하는 방법입니다.

  1. Pycharm을 열고 첫 페이지에서 소스 제어 시스템에서 프로젝트를 체크 아웃하도록 선택하십시오 (제 경우에는 github을 사용하고 있습니다)

  2. Pycharm에서 설정으로 이동하여 "프로젝트 통역사"를 선택하고 새 가상 환경을 추가하는 옵션을 선택하면 "venv"라고 할 수 있습니다.

  3. C : \ Users {user} \ AppData \ Local \ Programs \ Python \ Python36에있는 기본 Python 인터프리터를 선택하십시오 (설치 한 내용에 따라 적절한 Python 버전을 선택하십시오)

  4. Pycharm은 새로운 가상 환경을 생성하고 프로젝트 폴더 내의 venv 폴더 아래에 파이썬 바이너리 및 필요한 라이브러리를 복사합니다.

  5. Pycharm이 프로젝트 스켈레톤을 다시 빌드 / 갱신해야하므로 스캔을 완료하게하십시오.

  6. git 상호 작용에서 venv 폴더를 제외 하십시오 (프로젝트 폴더의 .gitignore 파일에 venv \ 추가 )

보너스 : 사람들이 소프트웨어에 필요한 모든 라이브러리를 쉽게 (잘, 거의 쉽게) 설치하기를 원한다면

pip freeze > requirements.txt

사람들이 다음 명령을 사용하여 필요한 모든 라이브러리를 한 번에 다운로드 할 수 있도록 명령을 git에 넣으십시오.

pip install -r requirements.txt 

2

응용 프로그램이 실행될 운영 체제를 알고 있다면 각 시스템마다 하나의 virtualenv를 만들어 내 저장소에 포함시킵니다. 그런 다음 응용 프로그램에서 실행중인 시스템을 감지하고 해당 virtualenv를 사용합니다.

시스템은 예를 들어 플랫폼 모듈을 사용하여 식별 될 수 있습니다 .

실제로 이것은 내가 작성한 사내 응용 프로그램으로 수행하는 작업이며 필요한 경우 새 시스템의 virtualenv를 신속하게 추가 할 수 있습니다. 이렇게하면 응용 프로그램에 필요한 소프트웨어를 pip에서 성공적으로 다운로드 할 수 있습니다. 또한 사용하는 psycopg2의 컴파일에 대해 걱정할 필요가 없습니다 .

응용 프로그램이 실행될 운영 체제를 모르는 경우 pip freeze다른 답변에서 제안한대로 사용 하는 것이 좋습니다.


0

저장소 폴더 내부의 경로에 가상 환경을 설치하는 것이 가장 좋습니다. 아마도 환경 전용 하위 디렉토리를 사용하는 것이 좋습니다 (저장소 루트에 가상 환경을 강제 설치할 때 실수로 전체 프로젝트를 삭제했습니다) 폴더, 프로젝트를 Github의 최신 버전으로 저장 한 것이 좋습니다).

자동화 된 설치 프로그램 또는 설명서에서 virtualenv 경로를 상대 경로로 표시해야합니다. 이렇게하면 다른 사람과 프로젝트를 공유 할 때 문제가 발생하지 않습니다. 패키지에 대해 사용 된 패키지는로 저장해야합니다 pip freeze -r requirements.txt.


-1

개발 환경을 설정 한 경우 pip freeze 파일 인 caz를 사용하여 git repo를 깨끗하게하십시오.

그런 다음 프로덕션 배포를 수행하는 경우 전체 venv 폴더를 체크인하십시오. 그러면 배포를보다 재현 가능하게하고 libxxx-dev 패키지가 필요하지 않으며 인터넷 문제를 피할 수 있습니다.

따라서 두 개의 저장소가 있습니다. requirements.txt가 포함 된 기본 소스 코드 용 코드입니다. 그리고 전체 venv 폴더를 포함하는 env repo.

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