개발/Python

[파이썬] git 저장소 안에 virtualenv 디렉터리가 있는 것이 나쁜가요?

MinorMan 2023. 1. 20. 12:52
반응형

<질문>

나는 Django 웹 앱용 virtualenv를 앱용 내 git 저장소에 넣을 생각입니다. 배포를 간단하고 쉽게 유지하는 쉬운 방법인 것 같습니다. 제가 이러면 안 될 이유가 있나요?


<답변1>

나는 사용한다pip freeze내가 필요한 패키지를requirements.txt파일을 만들고 내 저장소에 추가합니다. 전체 virtualenv를 저장하려는 이유를 생각하려고 했지만 그럴 수 없었습니다.


<답변2>

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

이미 제공된 솔루션은 배포 중에 virtualenv를 생성하고 필요한 pip 설치를 수행할 수 있도록 git에 충분한 정보를 저장하는 것입니다. 일반적으로 사람들은 실행pip freeze목록을 가져온 다음 requirements.txt라는 파일에 저장합니다. 다음과 같이 로드할 수 있습니다.pip install -r requirements.txt. RyanBrady는 이미 배포 문을 한 줄로 문자열로 만드는 방법을 보여주었습니다.

# 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. 이미 언급했듯이 이것은 "스팸 커밋"도 줄입니다.


<답변3>

PyCrypto와 같이 환경에 따라 다르게 컴파일되는 라이브러리를 사용하기 전까지는 동일하게 수행했습니다. 내 PyCrypto Mac은 Cygwin에서 작동하지 않고 Ubuntu에서는 작동하지 않습니다.

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

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


<답변4>

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

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


<답변5>

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

  1. Pycharm을 열고 첫 번째 페이지에서 소스 제어 시스템에서 프로젝트를 확인하도록 선택합니다(제 경우에는 github를 사용하고 있습니다).

  2. Pycharm에서 설정으로 이동하여 "Project Interpreter"를 선택하고 새 가상 환경을 추가하는 옵션을 선택하면 "venv"라고 부를 수 있습니다.

  3. C:\Users{user}\AppData\Local\Programs\Python\Python36에 있는 기본 Python 인터프리터를 선택합니다(설치한 항목에 따라 적절한 Python 버전을 선택해야 함).

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

  5. 프로젝트 스켈레톤을 다시 빌드/새로 고칠 필요가 있으므로 Pycharm이 스캔을 완료하도록 합니다.

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

보너스: 소프트웨어에 필요한 모든 라이브러리를 사람들이 쉽게(거의 쉽게) 설치할 수 있도록 하려면 다음을 사용할 수 있습니다.

pip freeze > requirements.txt

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

pip install -r requirements.txt 

<답변6>

나는 기본적으로 무엇을 사용David Sickmiller's answer조금 더 많은 자동화로. 내 프로젝트의 최상위 수준에 (실행 불가능) 파일을 만듭니다.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"

(데이비드의 대답에 따라 이것은 당신이pip freeze > requirements.txt요구 사항 목록을 최신 상태로 유지합니다.)

위의 내용은 일반적인 아이디어를 제공합니다. 실제activate스크립트(documentation)는 내가 일반적으로 사용하는 좀 더 정교한-q(조용) 옵션, 사용python언제python3등에서 사용할 수 없습니다.

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

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

소싱./activate, 아니다activate, 후자가 다른 모든 것을 찾을 것이기 때문에 여기에서 중요합니다.activate현재 디렉토리에서 하나를 찾기 전에 경로에서.


<답변7>

개발 환경만 설정했다면 git repo를 깨끗하게 만드는 caz인 pip freeze 파일을 사용하세요.

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

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


<답변8>

가장 좋은 방법은 리포지토리 폴더 내의 경로에 가상 환경을 설치하는 것이라고 생각합니다. 환경 전용 하위 디렉토리를 사용하는 것이 더 좋을 수도 있습니다(리포지토리 루트에 가상 환경을 강제로 설치할 때 실수로 전체 프로젝트를 삭제했습니다. 폴더, 프로젝트를 Github의 최신 버전으로 저장한 것이 좋습니다).

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

반응형