gitリポジトリ内にvirtualenvディレクトリがあるのは悪いことですか?


284

私が作成しているDjango Webアプリのvirtualenvを、アプリのgitリポジトリ内に配置することを考えています。デプロイをシンプルかつ簡単に保つための簡単な方法のようです。これをしてはいけない理由はありますか?

回答:


301

私は使用pip freezeに私は必要なパッケージを取得するにはrequirements.txt、ファイルと私のリポジトリにそれを追加します。virtualenv全体を保存する理由を考えてみましたが、できませんでした。


81
リポジトリの不要なスペースを節約しながら、単一のコマンドで新しいサーバーにデプロイできます:virtualenv --no-site-packages --distribute .env && source .env / bin / activate && pip install -r requirements.txt
RyanBrady

2
これはおそらく「ベストプラクティス」であり、最初に提供したので、この質問への回答を示します。私は誰もが言及した問題のいくつかに間違いなく遭遇しました。みなさんがずっと提案してきたことをやって、pipと要件ファイルを使用する前に、もう1日いじってみます。ご協力いただきありがとうございます!
Lyle Pratt

11
たとえばpip install mysql-python、64ビットマシンで32ビットマシンを使用しているユーザーがそれを使用しようとした場合、機能しません。多くのPythonモジュールと同様に、Cモジュールを使用してパフォーマンスを向上させます。Windows-> Linuxも機能しないと思います。
マットウィリアムソン

7
ただの注釈:どういうわけか、ライブラリがpip(バージョンが古すぎる)から利用できなくなり、サイトがダウンしている間にアップグレードを強制するため、少し時間がかかりました。そう... pip freezeこれを行うために再び頼ることはもうありません。問題は、強制アップグレードの再デプロイ中には誰もそれを支払う必要がなく、中間アップグレード(「ベストプラクティス」のメンテナンス)の場合もだれもそれを行わないことです。
契約によると、私は正しいと

5
@RayanBradyコメントに注意してください:--distributeand --setuptoolsオプションは現在何もしていません。(配布、それはsetuptoolsのフォークでしたが、ずっと前にマージされました)。 --no-site-packages
廃止予定

48

指摘したように、virtualenvディレクトリをgit内に保存すると、gitクローン(およびApache / mod_wsgiのインストールと構成)を実行するだけでアプリ全体をデプロイできます。このアプローチの1つの潜在的に重要な問題は、Linuxでは、フルパスがvenvのactivate、django-admin.py、easy_install、およびpipスクリプトにハードコードされていることです。これは、おそらく同じサーバー上で複数の仮想ホストを実行するために別のパスを使用したい場合、virtualenvが完全には機能しないことを意味します。私はウェブサイトが実際にそれらのファイルの間違ったパスで動作するかもしれないと思いますが、次にpipを実行しようとしたときに問題が発生するでしょう。

すでに与えられている解決策は、デプロイ中にvirtualenvを作成して必要なpipインストールを実行できるように、十分な情報をgitに保存することです。通常、人々pip freezeはリストを取得するために実行し、それをrequirements.txtという名前のファイルに保存します。でロードできますpip install -r requirements.txt。RyanBradyは、デプロイ文を1行で並べる方法をすでに示しています。

# 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 2018年

35

PyCryptoなどの環境に応じてコンパイル方法が異なるライブラリを使い始めるまでは、同じことをしてきました。私のPyCrypto macはCygwinでは動作しませんでした。Ubuntuでは動作しません。

リポジトリを管理することは完全な悪夢になります。

どちらの方法でも、すべてをgitに保存するよりも、pipフリーズと要件ファイルを管理する方が簡単であることがわかりました。これらのライブラリが更新されると、何千ものファイルのコミットスパムを回避できるので、それもきれいです...


うーん。異なる環境で異なる方法でコンパイルされたもので問題が発生することは絶対にありません。おそらく、コミットスパムを回避するためだけにそれを実行しない価値があると思います。
Lyle Pratt、

@LylePratt:私は反対だと思います:PyCryptoやPILなどの優れたツールの問題を回避するために、リポジトリにvirtualenv全体を含めない方がよいでしょう。
Tadeck

17

発生する主な問題の1つは、virtualenvが他のユーザーによって使用できない可能性があることです。理由は、常に絶対パスを使用するためです。たとえば、virtualenvが含まれている場合、/home/lyle/myenv/このリポジトリを使用している他のすべての人と同じであると想定します(完全に同じ絶対パスである必要があります)。自分と同じディレクトリ構造を使用している人を推測することはできません。

より良い方法は、誰もが(virtualenvの有無にかかわらず)独自の環境をセットアップし、そこにライブラリをインストールすることです。また、virtualenvがそれぞれにインストールされているため、異なるプラットフォーム(Linux / Windows / Mac)でコードをより使いやすくします。


これは、virtualenvをSCMに維持するのは悪い考えですが、@ RJBradyの提案またはイベントbootstrap.pyスクリプトのようなものを検討する価値があるのは正しいことです。他の人と仕事をするときの深刻な必要性。
ig0774 2011

あなたが言及した問題が私の状況の問題であるかどうかは本当にわかりません。私のDjangoアプリには、virtualenvがその場所に相対的な場所を定義する.wsgiファイルが含まれています( '../../env'の2つのディレクトリ)。したがって、私のシナリオでは、絶対パスの問題が私に悪影響を与えるべきではありません...
Lyle Pratt

常にWSGIを使用してアプリを実行すると、それでうまくいく場合があります。開発サーバーを(経由でmanage.py)使用すると、確実に問題が発生します。
Torsten Engelbrecht、2011

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ありません。activateactivate


このアプローチを愛する!非常に合理的に聞こえます、共有していただきありがとうございます。
Esolitos

[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }ソースからではなくスクリプトが実行されているかどうかを検出するために、最初の行を変更する必要がありました
Chris Snow

3

リポジトリを使用する際の重要な側面の1つとして、環境に依存するコンポーネントや設定をリポジトリに含めることはお勧めできません。おそらく、他の開発者と共有することです。これが、Windows PC(Win10など)で開発環境をセットアップする方法です。

  1. Pycharmを開き、最初のページで、ソース管理システムからプロジェクトをチェックアウトすることを選択します(私の場合は、githubを使用しています)。

  2. Pycharmで、設定に移動して「プロジェクトインタープリター」を選択し、新しい仮想環境を追加するオプションを選択します。これを「venv」と呼ぶことができます。

  3. C:\ Users {user} \ AppData \ Local \ Programs \ Python \ Python36にあるベースPythonインタープリターを選択します(インストールした内容に基づいて、適切なバージョンのPythonを選択してください)。

  4. Pycharmが新しい仮想環境を作成し、pythonバイナリと必要なライブラリをプロジェクトフォルダー内のvenvフォルダーの下にコピーすることに注意してください。

  5. プロジェクトのスケルトンを再構築/更新する必要があるため、Pycharmがスキャンを完了するようにします

  6. gitインタラクションからvenvフォルダーを除外します(プロジェクトフォルダーの.gitignoreファイルにvenv \を追加します)

おまけ:ソフトウェアに必要なすべてのライブラリを簡単に(まあ、ほぼ簡単に)インストールしたい場合は、

pip freeze > requirements.txt

次のコマンドを使用して必要なすべてのライブラリを一度にダウンロードできるように、命令をgitに配置します。

pip install -r requirements.txt 

2

アプリケーションが実行されるオペレーティングシステムがわかっている場合は、システムごとに1つのvirtualenvを作成し、リポジトリに含めます。次に、アプリケーションで実行中のシステムを検出し、対応するvirtualenvを使用します。

システムは、たとえば、プラットフォームモジュールを使用して識別できます。

実際、これは私が作成した社内アプリケーションで行うことであり、必要な場合に新しいシステムのvirtualenvをすばやく追加できます。このようにして、アプリケーションに必要なソフトウェアをpipが正常にダウンロードできるようにする必要はありません。また、使用するpsycopg2などのコンパイルについても心配する必要はありません。

アプリケーションを実行できるオペレーティングシステムがわからない場合は、pip freezeここで他の回答で提案されているように使用するほうがよいでしょう。


0

仮想環境をリポジトリフォルダー内のパスにインストールするのが最善だと思います。環境専用のサブディレクトリを使用する方がよいでしょう(リポジトリルートに仮想環境を強制インストールすると、プロジェクト全体が誤って削除されてしまいますフォルダー、プロジェクトをGithubの最新バージョンで保存してよかった)。

自動インストーラーまたはドキュメントで、virtualenvパスを相対パスとして指定する必要があります。これにより、プロジェクトを他の人と共有するときに問題が発生しなくなります。パッケージについては、使用したパッケージをで保存してくださいpip freeze -r requirements.txt


-1

開発環境を設定するだけの場合は、git repoをクリーンにするpipフリーズファイルcazを使用します。

次に、本番デプロイメントを行う場合は、envフォルダー全体をチェックインします。これにより、デプロイメントがより再現可能になり、libxxx-devパッケージが不要になり、インターネットの問題が回避されます。

したがって、2つのリポジトリがあります。1つはメインのソースコード用で、requirements.txtが含まれています。そして、envリポジトリ全体が含まれています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.