読者です 読者をやめる 読者になる 読者になる

dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

follow us in feedly

[GAE]zc.buildoutでGoogleAppEngineの外部ライブラリを管理する

Python Google App Engine zc.buildout

前回の記事でpythonのライブラリ管理ツールであるzc.buildoutを一通り触ってみましたが、

今回はこのzc.buildoutを使ってGoogle App Engineの外部ライブラリを管理する仕組みを構成してみます。

やるべきこと

前回の記事ではとりあえず外部ライブラリを.egg形式でダウンロードしてくることに成功しました。
ここからGoogle App Engineの外部ライブラリ管理までにやらなければならないこととして、ざっと以下のようなことが考えられます。

  1. .eggに圧縮しない状態でインストールしたい
    • 外部ライブラリはimport xxx形式で使うと思われるので、圧縮せず.py形式でインストールしたいです
  2. インストール先を指定したい
    • eggsディレクトリでなく、libsとかこちらで指定したディレクトリにインストールできるようになると便利です
  3. インストールした外部ライブラリをGoogle App Engineで使えるように設定する
    • せっかくインストールしてきても、配置してデプロイしただけでは使えなさそうですよね...
      パスを通すとかする必要がありそうです

やってみる

さて、上で挙げたことを1つ解決しながら、Google App Engineの外部ライブラリ管理のためのセットアップを行います。

.eggに圧縮しない状態でインストール & インストールディレクトリ指定

上記1と2を両方満たしてくれるrecipe(*1)がありました。
appfy.recipe.gaeというライブラリです。(ソースコードこちら

このrecipeはeggsに指定したライブラリを圧縮しないでインストールするほか、
lib-directoryというオプションに指定したディレクトリにインストールすることができます。

というわけで、buildout.cfgには次のように記述します。

[buildout]
parts =
  packages


[packages]
recipe = appfy.recipe.gae:app_lib
lib-directory = libs
use-zipimport = false
eggs =
  [インストールしたいライブラリ]

# Don't copy files that match these glob patterns.
ignore-globs =
  *.c
  *.pyc
  *.pyo
  */test
  */tests
  */testsuite
  */django
  */sqlalchemy
  *.so

# Don't install these packages or modules.
ignore-packages =
  distribute
  setuptools
  easy_install
  site
  pkg_resources

lib-directorylibsと書いたので、libsディレクトリにeggファイルが解凍された状態でインストールされます。

(*1) recipeとは、eggsに記述したeggをどのように処理するかを定義したもので、その実体はPyPIにあるパッケージです。
参考:Buildoutを使う 設定ファイル編 - はこもあいして!

Google App Engine側の設定ファイル

先ほどのlibsディレクトリをGAEで読み込むように設定しましょう。

appengine_config.pyに次のように記述します。

appengine_config.py

import os
import sys


ROOTPATH = os.path.dirname(__file__)
LIBPATH = os.path.join(ROOTPATH, 'libs')
sys.path.append(LIBPATH)

これだけ。
インストール先をlibs以外にした場合は、'libs'を変更します。

また、djangoを使っている場合、settings.pyINSTALLED_APPSにインストールしたライブラリ名を記述します。
(これは必須ではないかもしれません)

settings.py(django)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    ...
    [インストールしたライブラリ(のディレクトリ名?)]
)

これで完了です!

リファレンス

Google App Engine (GAE/py) の開発環境をつくる - 清水川Web

"site-packages に悩まされず"に buildout で GoogleAppEngine の環境を作る - TIM Labs

http://gae-p.blogspot.jp/2013/02/gaepy.html