Google App EngineでサードパーティのPythonライブラリを管理するための最良の戦略は何ですか?
WebappフレームワークであるFlaskを使用したいとします。 ブログエントリ はこれを行うように指示しますが、正しくないようです:
$ cd /tmp/
$ wget http://pypi.python.org/packages/source/F/Flask/Flask-0.6.1.tar.gz
$ tar zxf Flask-0.6.1.tar.gz
$ cp -r Flask-0.6.1/flask ~/path/to/project/
(... repeat for other packages ...)
特にバージョンの追跡、アップグレードのテスト、または2つのライブラリがサブディレクトリを共有する場合は、サードパーティのコードを管理するためのより良い方法が必要です。 Python zipfilesからモジュールをインポートできること、およびpipが素晴らしいREQUIREMENTSファイルで機能することを知っています。 pipには、GAEで使用するZip
コマンドがあることがわかりました。
(注:少数の類似した質問があります— 1 、 2 、、 4 、 5 —しかし、それらはケース固有であり、本当に私の質問に答えません。)
単純にどうですか:
$ pip install -r requirements.txt -t <your_app_directory/lib>
<your_app_directory>/appengine_config.py
の作成/編集:
"""This file is loaded when starting a new application instance."""
import sys
import os.path
# add `lib` subdirectory to `sys.path`, so our `main` module can load
# third-party libraries.
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))
Googleはサンプルを appengine_config.py
に更新しました。
from google.appengine.ext import vendor
vendor.add('lib')
注:例に .gitignore
がありますが、lib/
ディレクトリーを無視しますが、git-Push
デプロイメント方式を使用する場合は、そのディレクトリーをソース管理下に置く必要があります。
以下にその方法を示します。
project
ディレクトリは、virtualenvが存在する最上位ディレクトリです。次のコマンドを使用してvirtualenvを取得します。
cd project
virtualenv -p /usr/bin/python2.5 --no-site-packages --distribute .
src
ディレクトリは、すべてのコードが置かれる場所です。コードをGAEにデプロイするとき、*only* srcディレクトリにコードをデプロイします。 appcfg.py
はシンボリックリンクを解決し、ライブラリファイルをGAEにコピーします。
ライブラリをZipファイルとしてインストールするのは、主にソースコードを読む必要がある場合に便利なためです。これは、たまたま好奇心からやっています。ただし、ライブラリを本当に圧縮したい場合は、次のコードスニペットをmain.pyに入れてください
import sys
for p in ['librarie.Zip', 'package.Egg'...]:
sys.path.insert(0, p)
この後、zipパッケージを通常どおりインポートできます。
注意すべきことの1つは、setuptoolsのpkg_resources.py
です。それをsrc
ディレクトリに直接コピーして、他のシンボリックリンクパッケージで使用できるようにしました。 entry_point
sを使用するものには注意してください。私の場合、Toscawidgets2を使用しているため、ソースコードを掘り下げて手動でピースを接続する必要がありました。 entry_point
に依存するライブラリがたくさんあると、面倒になります。
buildout を好みます。
プロジェクトまたはbuildout.cfgのsetup.pyで依存関係を設定し、buildout.cfgでバージョンを固定し、GAEで使用できないパッケージを指定し、packages.Zipに含める必要があります。 rod.recipe.appengineは必要なパッケージをpackages.Zipにコピーし、packages.Zipをsys.pathに挿入する限り、どこにでもインポートできます。
必要なパッケージがpypiにない場合は、githubからフォークを使用することもできます
find-links =
https://github.com/tesdal/pusher_client_python/tarball/rewrite#Egg=pusher-2.0dev2
[versions]
pusher = 2.0dev2
これらの設定と依存関係はすべてgitでバージョン管理されています。
Flask=のどのコピーが現在ソースツリーに含まれており、おそらくバージョン管理にコピーされているか(または新しい開発者が手動でアンパックしてアップグレードする必要がある)) cfg。新しいバージョンが必要な場合は、buildout.cfgを変更してbuildoutを再実行します。
また、staging.cfgなどを使用してステージングサーバーがある場合にapp.yamlでappspot idおよびversionを設定するなど、構成ファイルテンプレートに変数を挿入するために使用することもできます。
最近、gaenvというツールを作成しました。 requirements.txt形式に従いますが、インストールはしません。pipinstall -r requirements.txtでインストールしてから、コマンドラインツールgaenvを実行できます。
$ pip install -r requirements.txt
$ gaenv
これにより、シンボリックリンクが自動的に作成されます。gaenvをvirtualenvにインストールし、そこからバイナリを実行できます。これについてのブログ記事は次のとおりです。
http://blog.altlimit.com/2013/06/google-app-engine-virtualenv-tool-that.html
githubでも
Wernightのソリューション は official Flask=アプリ例 の現在のプラクティスに最も近い。これは、sys.path.insert()
( 名前空間パッケージ を許可するためにsite.addsitedir()
を呼び出す)は、付随する.pth
ファイル(Pyramidのようなフレームワークにとって重要)を処理します。
これまでのところは良いですが、そのがディレクトリをパスに追加し、そのため、含まれるライブラリ(WebObやリクエストなど)を新しいものでオーバーライドする機会を失いますバージョン。
appengine_config.py
で必要なのは(そして、この変更を公式リポジトリにも受け入れようとしているのです)次のとおりです。
"""This file is loaded when starting a new application instance."""
import os.path
import site.addsitedir
import sys.path
dirname = 'lib'
dirpath = os.path.join(os.path.dirname(__file__), dirname)
# split path after 1st element ('.') so local modules are always found first
sys.path, remainder = sys.path[:1], sys.path[1:]
# add `lib` subdirectory as a site directory, so our `main` module can load
# third-party libraries.
site.addsitedir(dirpath)
# append the rest of the path
sys.path.extend(remainder)
このコードの最終バージョンは、vendor.py
モジュールに隠され、insertsitedir(index, path)
または他のバリエーションのように呼び出されることがあります。これは、 このプルリクエストに関するディスカッションで =、しかし、ロジックは多かれ少なかれどのように動作するか、名前空間のものを含むすべてのパッケージでシンプルなpip install -r requirements.txt -t lib/
が動作できるようにし、含まれているライブラリを新しいバージョンで上書きできるようにしますbeen より簡単な代替を見つけることができません 。
注:この回答は、Google App EngineのFlaskに固有のものです。
App Engineで動作するためのFlask拡張機能を取得する方法の例については、flask-appengine-templateプロジェクトを参照してください。 https://github.com/kamalgill/flask-appengine-テンプレート
Src/packages/flaskextの名前空間パッケージフォルダーに拡張機能をドロップすると、設定は完了です。 https://github.com/kamalgill/flask-appengine-template/tree/master/src/lib/flaskext
プロジェクトテンプレートには上記のsys.path.insert()スニペットが含まれているため、Flask以外のパッケージはZipファイル、eggs、または解凍されたパッケージとしてsrc/packagesフォルダーにドロップできます。