내 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사용 (자동) 옵션을 pythonpython3등을 사용할 수 없습니다

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

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.