plone 3 用のプロダクトを paster から作る
(第0回)Zope/Plone開発勉強会が無事終了 しました。
その中で自分の開発としては、 paster を使ってスケルトンコード作って、そこから plone 3 のプロダクトを作るという手順にチャレンジしてました。
変なところでハマってしまい時間切れとなりましたが、一応動くものはできたのでそこまでの手順をとりあえずまとめてみたいと思います。
プロダクトを作って公開する手順までをまとめると、おそらくこんな感じになるのではと思われます。
- paster でスケルトンコードを生成
- buildout.cfg 書く→ buildout
- コード書く
- サーバ立ち上げて確認
- きちんとできたら egg にする
- サーバに egg をアップする
- buildout.cfg 書く→ buildout
- サーバ立ち上げて確認
- リリース
で、今回は4のところまでいって egg を作るところで失敗して終わりました。いろいろまだまだ勉強するところがあるようです。
さて、以下は細かい手順をコードも含めて書きます。
その前に今後の予定や感想はこんな感じです。
- plone 2.5 でもテスト→five対応が必要らしい
- jQuery があるかどうかでの振り分けが必要なので考える
- egg* にちゃんとする
- Windows 上だとやっぱコマンドラインめんどう、Mac いいなぁ
1.paster でスケルトンコードを生成
paster create -t テンプレート という形でコマンドを実行すると、スケルトンコードが出力されます。
ここで使いそうなテンプレートは paster create --list-templates で見られるんですが、 plone 用のプロダクトとして使いそうなのはこのあたり。
- archetype Archetypes を使ったプロジェクト
- plone plone のプロジェクト
- plone3_portlet plone 3 のポートレット
- plone3_theme plone 3 のテーマ
今回は plone を選んだんですが、これが後々あだに。
開発中のコードは開発用の plone インスタンスの src ディレクトリの下というのが定番のようです。
以下はコードを生成しているところです。コードを生成するときに色んなことをいきなり聞いてくるので、心の準備をしていないとちょっと引いちゃいます。
まぁ、プロダクトの説明とかはあとで書けばいいかなといった感じ。
見ての通りこのプロジェクトは Plone Slimbox を plone 3 対応にするためのものです。
% cd /var/lib/plone3 % cd src % paster create -t plone Products.PloneSlimbox Selected and implied templates: ZopeSkel#basic_namespace A project with a namespace package ZopeSkel#plone A Plone project Variables: egg: Products.PloneSlimbox package: productsploneslimbox project: Products.PloneSlimbox Enter namespace_package (Namespace package (like plone)) ['plone']: Products Enter package (The package contained namespace package (like example)) ['example']: PloneSlimbox Enter zope2product (Are you creating a Zope 2 Product?) [False]: False Enter version (Version) ['1.0']: 0.5 Enter description (One-line description of the package) ['']: Slimbox(Lightweight Lightbox clone) for atct album view and COREBlog2 attachment image view. Enter long_description (Multi-line description (in reST)) ['']: Slimbox(Lightweight Lightbox clone) for atct album view and COREBlog2 attachment image view. Enter author (Author name) ['Plone Foundation']: takanori Enter author_email (Author email) ['plone-developers@lists.sourceforge.net']: takanori@example.com Enter keywords (Space-separated keywords/tags) ['']: Enter url (URL of homepage) ['http://svn.plone.org/svn/plone/plone.example']: http://plone.org/products/plone-slimbox/ Enter license_name (License name) ['GPL']: MIT License Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: Creating template basic_namespace : ------------------------------------------------------------------------------ The project you just created has local commands. These can be used from within the product. usage: paster COMMAND Commands: addcontent Adds plone content types to your project For more information: paster help COMMAND ------------------------------------------------------------------------------ Running /usr/bin/python setup.py egg_info
最後のコメントは、「このプロジェクトの中で paster addcontent コマンドが使えるようになっているよ」ということのようです。
ためしにヘルプをみてみるとこんな感じでした。スケルトンコードの中でさらに addcontent を実行することによって、スケルトンを生成できるようです。 (まだ試していません)
% paster help addcontent
usage: /usr/bin/paster addcontent [options] [template name]
Adds plone content types to your project
options:
-h, --help show this help message and exit
-v, --verbose
-l, --list List available templates for the current project
-a, --list-all List all templates regardless of the current project
-q, --no-interactive
% paster addcontent --list
Available templates:
form: A form skeleton
formfield: Schema field for a form
i18nlocale: An i18n locale directory structure
portlet: A Plone 3 portlet
view: A browser view skeleton
zcmlmeta: A ZCML meta directive skeleton
生成されたスケルトンコードの構成を見てみると、こんな感じでした。
% cd Products.PloneSlimbox % tree Products.PloneSlimbox/ Products.PloneSlimbox/ |-- Products | |-- PloneSlimbox | | |-- __init__.py | | |-- configure.zcml | | `-- tests.py | `-- __init__.py |-- Products.PloneSlimbox.egg-info | |-- PKG-INFO | |-- SOURCES.txt | |-- dependency_links.txt | |-- entry_points.txt | |-- namespace_packages.txt | |-- not-zip-safe | |-- paster_plugins.txt | |-- requires.txt | `-- top_level.txt |-- README.txt |-- docs | |-- HISTORY.txt | |-- INSTALL.txt | |-- LICENSE.GPL | `-- LICENSE.txt |-- setup.cfg `-- setup.py 4 directories, 20 files
2.buildout.cfg 書く
次に、このコードを plone サイトが読み込むように buildout.cfg に書きます。 eggs と develop に以下のように書きます。 ただ、プロジェクト名が Products から始まらない場合は zcml も書かないといけないっぽいです。
[buildout]
:
eggs =
Products.PloneSlimbox
develop =
src/Products.PloneSlimbox
buildout コマンドを実行します。コマンド実行時に Develop: と出るのがポイントっぽいです。
% bin/buildout Develop: '/var/lib/plone3/src/Products.PloneSlimbox' Uninstalling instance. Updating zope2. Updating fake eggs Updating productdistros. Installing instance. % cat develop-eggs/Products.PloneSlimbox.egg-link /var/lib/plone3/src/Products.PloneSlimbox
4.サーバ立ち上げる
サーバを立ち上げて動作確認します。 テストなので zopectl> fg でフォアグラウンドかつデバッグモードで実行します。
% sudo bin/instance program: /var/lib/plone3/parts/instance/bin/runzope daemon manager not running zopectl> fg /var/lib/plone3/parts/instance/bin/runzope -X debug-mode=on
ここで paster でコード生成していた全員が zope の*``Control_Panel/Products`` 画面にはプロダクトが表示されるのに、 plone のアドオンプロダクトには表示されないということで長時間ハマる事態に。
正解は、 configure.zcml を編集して、 GenericSetup 系の設定を追加しないといけないということらしいです。 今になって考えてみると、 GenericSetup の設定をするか Extensions/Install.py が存在しないと portal_quickinstaller が plone のプロダクトとして認識されないのは当たり前かなと。
編集前:
<configure xmlns="http://namespaces.zope.org/zope" xmlns:five="http://namespaces.zope.org/five" i18n_domain="Products.PloneSlimbox">
編集後:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
i18n_domain="Products.PloneSlimbox">
<genericsetup:registerProfile
name="default"
title="PloneSlimbox"
directory="profiles/default"
description="PloneSlimbox"
provides="Products.GenericSetup.interfaces.EXTENSION"
/>
</configure>
3.コードを書く
順番が前後しますが、ここで PloneSlimbox として動作するために最新のコードをチェックアウトして利用する。
skins と i18n はそのままコピー。 __init__.py と config.py もコピー。
そして profiles/default の下に GenericSetup 用の xml ファイルを作成する。
コードは CMFPlone についているコードを参考にしました。
skins.xml:
<?xml version="1.0"?>
<object name="portal_skins">
<object name="plone_slimbox" meta_type="Filesystem Directory View"
directory="Products.PloneSlimbox:skins/plone_slimbox"/>
<skin-path name="*">
<layer name="plone_slimbox" insert-after="custom" />
</skin-path>
</object>
cssregistry.xml:
<?xml version="1.0"?>
<object name="portal_css" meta_type="Stylesheets Registry">
<stylesheet title="" cacheable="True" compression="safe" cookable="True"
enabled="1" expression=""
id="slimbox2.css" media="screen" rel="stylesheet" rendering="import"/>
</object>
jsregistry.xml:
<?xml version="1.0"?>
<object name="portal_javascripts" meta_type="JavaScripts Registry">
<javascript cacheable="True" compression="safe" cookable="True"
enabled="True" expression="" id="slimbox2.js" inline="False"/>
</object>
ここまででサーバを再起動してプロダクトをインストールすると、きちんと思ったとおりに動作しました。(わーい)
5.eggにする
ここで、 egg をダウンロードしてインストールテストをしようと思い、とりあえず egg を見よう見まねで作ってみました。
% cd src/Products.PloneSlimbox % python setup.py bdist_egg % ls -l dist Products.PloneSlimbox-0.5dev-py2.4.egg
出来上がったファイルを展開してみると、あれ、ファイルが足りない? どうやら txt とか xml ファイルとかが無視されているようです。 なにやら egg 用の設定を書かないといけないようですが、ここで時間切れ。
とりあえず http://plone3.takanory.net/photo で、今回作ったコードはちゃんと動いているようです。
-
- ¦
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://takanory.net/takalog/1101/tbping
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。
zope/plone関係の技術的な内容については