tracで複数リポジトリ(2)

前回のエントリにmobcovさんよりコメントをいただいたので説明を追加しましょう。

<Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
</Location>
<Location /trac/cocktail>
    PythonOption TracEnv  c:/home/ishigaki/trac/cocktail/
    PythonOption TracUriRoot /trac/cocktail
</Location>
<Location /trac/perl>
    PythonOption TracEnv c:/home/ishigaki/trac/perl/
    PythonOption TracUriRoot /trac/perl
</Location>
ってすればいいような気がするのは気のせい?

まず、これは /trac にアクセスしたときに(404 Not Foundではなく) 500 Internal Server Error が出ます。PythonHandlerを指定したら trac.cgi のコピーが不要になるくらいですから当然ですね。こういう場合はおとなしく

<Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnvParentDir c:/home/ishigaki/trac/
    PythonOption TracUriRoot /trac
</Location>

としておくのが吉です。

ではどうして前回

<Location /trac/cocktail>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigaki/trac/cocktail/
    PythonOption TracUriRoot /trac/cocktail
</Location>

<Location /trac/perl>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigaki/trac/perl/
    PythonOption TracUriRoot /trac/perl
</Location>

とかするのがたぶん一番柔軟で簡単と書いたかというと、本当はこういうのを想定していたため。

<Location /ishigaki/trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigaki/trac/
    PythonOption TracUriRoot /ishigaki/trac
</Location>

<Location /mobcov/trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/mobcov/trac/
    PythonOption TracUriRoot /mobcov/trac
</Location>

同じサーバを複数人で共用している場合、親ディレクトリが一致しませんので TracEnvParentDir は使えません。あるいは、次の例もそう。

<Location /trac/perl>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigaki/trac/perl
    PythonOption TracUriRoot /trac/perl
</Location>

<Location /trac/cocktail/book>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigai/trac/cocktail/book
    PythonOption TracUriRoot /trac/cocktail/book
</Location>

<Location /trac/cocktail/recipe>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigai/trac/cocktail/recipe
    PythonOption TracUriRoot /trac/cocktail/recipe
</Location>

/trac/perlと/trac/cocktailだけならTracEnvParentDirも使えますが、この場合は /trac/cocktail_book と /trac/cocktail_recipe というディレクトリを用意するのではなく、/trac/cocktail の下に book と recipe という trac を用意したため、素直に TEParentDir を使おうとすると、/trac/cocktail の部分で 500 エラーになる。それを防ぐための処理。もちろんこの /trac/cocktail 以下を TracEnvParentDir でまとめることはできますけれどね。

もう少し実際的なところだと、こういうのもありかもしれない。

<Location /trac_local>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnvParentDir c:/home/ishigaki/trac
    PythonOption TracUriRoot /trac_local
</Location>

<Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv c:/home/ishigai/trac/perl
    PythonOption TracUriRoot /trac
</Location>

これは、ローカル環境からは /trac_local にアクセスすれば /trac_local/cocktail も /trac_local/perl も見られるんだけど、外部には /trac という名前で /trac/perl のみ公開、というパターン。本当はこうせず、バーチャルホストをたててポート分けするとか、ドメイン分けするとかした方がきれいなんですが、それはみなさんの方でお試しあれ。

ちなみに、TracEnvParentDir にはサーバを再起動しなくても trac の数を増やせるという利点があります。TracEnv の方は設定を追加したらサーバの再起動が必要です。適宜使い分けるのが吉です。