回答:
私は使用pip freeze
に私は必要なパッケージを取得するにはrequirements.txt
、ファイルと私のリポジトリにそれを追加します。virtualenv全体を保存する理由を考えてみましたが、できませんでした。
pip install mysql-python
、64ビットマシンで32ビットマシンを使用しているユーザーがそれを使用しようとした場合、機能しません。多くのPythonモジュールと同様に、Cモジュールを使用してパフォーマンスを向上させます。Windows-> Linuxも機能しないと思います。
pip freeze
これを行うために再び頼ることはもうありません。問題は、強制アップグレードの再デプロイ中には誰もそれを支払う必要がなく、中間アップグレード(「ベストプラクティス」のメンテナンス)の場合もだれもそれを行わないことです。
--distribute
and --setuptools
オプションは現在何もしていません。(配布、それはsetuptoolsのフォークでしたが、ずっと前にマージされました)。 --no-site-packages
指摘したように、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
です。すでに述べたように、これにより「コミットスパム」も減少します。
--distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
--no-site-packages
15.1.0でも非推奨になりました。これがデフォルトです。
PyCryptoなどの環境に応じてコンパイル方法が異なるライブラリを使い始めるまでは、同じことをしてきました。私のPyCrypto macはCygwinでは動作しませんでした。Ubuntuでは動作しません。
リポジトリを管理することは完全な悪夢になります。
どちらの方法でも、すべてをgitに保存するよりも、pipフリーズと要件ファイルを管理する方が簡単であることがわかりました。これらのライブラリが更新されると、何千ものファイルのコミットスパムを回避できるので、それもきれいです...
発生する主な問題の1つは、virtualenvが他のユーザーによって使用できない可能性があることです。理由は、常に絶対パスを使用するためです。たとえば、virtualenvが含まれている場合、/home/lyle/myenv/
このリポジトリを使用している他のすべての人と同じであると想定します(完全に同じ絶対パスである必要があります)。自分と同じディレクトリ構造を使用している人を推測することはできません。
より良い方法は、誰もが(virtualenvの有無にかかわらず)独自の環境をセットアップし、そこにライブラリをインストールすることです。また、virtualenvがそれぞれにインストールされているため、異なるプラットフォーム(Linux / Windows / Mac)でコードをより使いやすくします。
manage.py
)使用すると、確実に問題が発生します。
基本的には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
[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }
ソースからではなくスクリプトが実行されているかどうかを検出するために、最初の行を変更する必要がありました
リポジトリを使用する際の重要な側面の1つとして、環境に依存するコンポーネントや設定をリポジトリに含めることはお勧めできません。おそらく、他の開発者と共有することです。これが、Windows PC(Win10など)で開発環境をセットアップする方法です。
Pycharmを開き、最初のページで、ソース管理システムからプロジェクトをチェックアウトすることを選択します(私の場合は、githubを使用しています)。
Pycharmで、設定に移動して「プロジェクトインタープリター」を選択し、新しい仮想環境を追加するオプションを選択します。これを「venv」と呼ぶことができます。
C:\ Users {user} \ AppData \ Local \ Programs \ Python \ Python36にあるベースPythonインタープリターを選択します(インストールした内容に基づいて、適切なバージョンのPythonを選択してください)。
Pycharmが新しい仮想環境を作成し、pythonバイナリと必要なライブラリをプロジェクトフォルダー内のvenvフォルダーの下にコピーすることに注意してください。
プロジェクトのスケルトンを再構築/更新する必要があるため、Pycharmがスキャンを完了するようにします
gitインタラクションからvenvフォルダーを除外します(プロジェクトフォルダーの.gitignoreファイルにvenv \を追加します)
おまけ:ソフトウェアに必要なすべてのライブラリを簡単に(まあ、ほぼ簡単に)インストールしたい場合は、
pip freeze > requirements.txt
次のコマンドを使用して必要なすべてのライブラリを一度にダウンロードできるように、命令をgitに配置します。
pip install -r requirements.txt
アプリケーションが実行されるオペレーティングシステムがわかっている場合は、システムごとに1つのvirtualenvを作成し、リポジトリに含めます。次に、アプリケーションで実行中のシステムを検出し、対応するvirtualenvを使用します。
システムは、たとえば、プラットフォームモジュールを使用して識別できます。
実際、これは私が作成した社内アプリケーションで行うことであり、必要な場合に新しいシステムのvirtualenvをすばやく追加できます。このようにして、アプリケーションに必要なソフトウェアをpipが正常にダウンロードできるようにする必要はありません。また、使用するpsycopg2などのコンパイルについても心配する必要はありません。
アプリケーションを実行できるオペレーティングシステムがわからない場合は、pip freeze
ここで他の回答で提案されているように使用するほうがよいでしょう。
仮想環境をリポジトリフォルダー内のパスにインストールするのが最善だと思います。環境専用のサブディレクトリを使用する方がよいでしょう(リポジトリルートに仮想環境を強制インストールすると、プロジェクト全体が誤って削除されてしまいますフォルダー、プロジェクトをGithubの最新バージョンで保存してよかった)。
自動インストーラーまたはドキュメントで、virtualenvパスを相対パスとして指定する必要があります。これにより、プロジェクトを他の人と共有するときに問題が発生しなくなります。パッケージについては、使用したパッケージをで保存してくださいpip freeze -r requirements.txt
。