File: plugins.html

package info (click to toggle)
virtualenvwrapper 3.4-2
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,140 kB
  • sloc: sh: 3,801; python: 991; makefile: 27
file content (363 lines) | stat: -rw-r--r-- 34,457 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>virtualenvwrapper を拡張する &mdash; virtualenvwrapper v3.4 documentation</title>
    <link rel="stylesheet" href="_static/nature.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '3.4',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <link rel="top" title="virtualenvwrapper v3.4 documentation" href="index.html" />
    <link rel="up" title="virtualenvwrapper をカスタマイズする" href="hooks.html" />
    <link rel="next" title="プロジェクト管理" href="projects.html" />
    <link rel="prev" title="ユーザカスタマイズ" href="scripts.html" /> 
  </head>
  <body>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="projects.html" title="プロジェクト管理"
             accesskey="N">next</a></li>
        <li class="right" >
          <a href="scripts.html" title="ユーザカスタマイズ"
             accesskey="P">previous</a> |</li>
        <li><a href="index.html">virtualenvwrapper v3.4 documentation</a> &raquo;</li>
          <li><a href="hooks.html" accesskey="U">virtualenvwrapper をカスタマイズする</a> &raquo;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="virtualenvwrapper">
<span id="plugins"></span><h1>virtualenvwrapper を拡張する<a class="headerlink" href="#virtualenvwrapper" title="Permalink to this headline">¶</a></h1>
<p>開発環境をカスタマイズするために自作で解決してきた長い経験から、共通タスクを自動化して、何度も繰り返す苛々するような作業を取り除く機能がどれほどの価値をもつか分かりました。大工は治具を組み立て、ソフトウェア開発者はシェルスクリプトを書きます。virtualenvwrapper は逆になりますが、求める方法で動作するようにツールを修正する職人を励ます伝統を受け継いでいます。</p>
<p>繰り返し行う手動の操作を取り除いたり開発ワークフローを効率化するために提供されるフックを使用してください。例えば、最後に編集されたセッションからファイルを再読み込みするために IDE にプロジェクトファイルを読む込ませる、時間追跡記録を管理する、もしくはアプリケーションサーバの開発バージョンを起動・停止するために <a class="reference internal" href="#plugins-pre-activate"><em>pre_activate</em></a> や <a class="reference internal" href="#plugins-post-activate"><em>post_activate</em></a> フックを設定してください。 <a class="reference internal" href="#plugins-initialize"><em>initialize</em></a> は virtualenvwrapper に対するフックや完全に新しいコマンドを追加するためのフックです。そして <a class="reference internal" href="#plugins-pre-mkvirtualenv"><em>pre_mkvirtualenv</em></a> や <a class="reference internal" href="#plugins-post-mkvirtualenv"><em>post_mkvirtualenv</em></a> といったフックはそれぞれの新しい開発環境へ基本的な必需品をインストールする、ソースコードリポジトリの初期化、その他の新たなプロジェクトの設定を行うといった機会を与えます。</p>
<p>virtualenvwrapper がそういったことを実行できるようにあなたのコードをアタッチする方法が2つあります。エンドユーザはシェルスクリプトか、個人的なカスタマイズを施したプログラムを使用できます(<a class="reference internal" href="scripts.html#scripts"><em>ユーザカスタマイズ</em></a> を参照)。さらに拡張機能は、システムと開発者間で共通の振る舞いを共有できるようにする <a class="reference external" href="http://packages.python.org/distribute/">Distribute</a> <em>エントリポイント</em> を使用して Python で実装することもできます。</p>
<div class="section" id="id1">
<h2>拡張機能を定義する<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">virtualenvwrapper はユーザのカスタムスクリプトを作成して実行することをプラグインで実現します(<a class="reference internal" href="extensions.html#extensions-user-scripts"><em>user_scripts</em></a>)。次のサンプルはそういったプラグインの実装を紹介します。</p>
</div>
<div class="section" id="id2">
<h3>コードの構成<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper</span></tt> の Python パッケージは <em>名前空間パッケージ</em> です。複数のライブラリが一緒に配布されていなかったり同じディレクトリ内にインストールされていなかったとしても、そのパッケージ内へインストールできます。拡張機能は次のようにソースツリーを設定することで <tt class="docutils literal"><span class="pre">virtualenvwrapper</span></tt> の名前空間を(オプションで)使用することが出来ます。</p>
<ul class="simple">
<li>virtualenvwrapper/<ul>
<li>__init__.py</li>
<li>user_scripts.py</li>
</ul>
</li>
</ul>
<p>そして <tt class="docutils literal"><span class="pre">__init__.py</span></tt> に次のコードを含めます。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="sd">&quot;&quot;&quot;virtualenvwrapper module</span>
<span class="sd">&quot;&quot;&quot;</span>

<span class="nb">__import__</span><span class="p">(</span><span class="s">&#39;pkg_resources&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">declare_namespace</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
</pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">拡張機能はどんなパッケージからも読み込まれるので <tt class="docutils literal"><span class="pre">virtualenvwrapper</span></tt> の名前空間を使用する必要はありません。</p>
</div>
</div>
<div class="section" id="api">
<h3>拡張 API<a class="headerlink" href="#api" title="Permalink to this headline">¶</a></h3>
<p>パッケージを作成した後の次のステップとして、拡張コードを保持するモジュールを作成します。例えば <tt class="docutils literal"><span class="pre">virtualenvwrapper/user_scripts.py</span></tt> です。そのモジュールは実際の拡張機能のエントリポイントを含みます。サポートするコードが含められるか、標準の Python コードの構成テクニックを利用してインポートされます。</p>
<p>API は全ての拡張ポイントで同じです。それぞれは1つの引数、つまりコマンドライン上でフックローダへ渡される文字列のリストを受け取る Python 関数を使用します。</p>
<div class="highlight-python"><pre>def function_name(args):
    # args is a list of strings passed to the hook loader</pre>
</div>
<p>引数リストのコンテンツは次の拡張ポイント毎に定義されます(<a class="reference internal" href="#plugins-extension-points"><em>拡張ポイント</em></a> を参照)。</p>
</div>
<div class="section" id="id3">
<h3>拡張機能の起動<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h3>
<div class="section" id="id4">
<h4>ダイレクトアクション<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h4>
<p>プラグインは2つの方法でそれぞれのフックをアタッチできます。デフォルトは直接的に何らかの処理を実行する関数を持ちます。例えば、ユーザスクリプトプラグインの <tt class="docutils literal"><span class="pre">initialize()</span></tt> 関数は <tt class="docutils literal"><span class="pre">virtualenvwrapper.sh</span></tt> が読み込まれるときにデフォルトユーザスクリプトを作成します。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">filename</span><span class="p">,</span> <span class="n">comment</span> <span class="ow">in</span> <span class="n">GLOBAL_HOOKS</span><span class="p">:</span>
        <span class="n">make_hook</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s">&#39;$WORKON_HOME&#39;</span><span class="p">,</span> <span class="n">filename</span><span class="p">),</span> <span class="n">comment</span><span class="p">)</span>
    <span class="k">return</span>
</pre></div>
</div>
</div>
<div class="section" id="plugins-user-env">
<span id="id5"></span><h4>ユーザ環境を変更する<a class="headerlink" href="#plugins-user-env" title="Permalink to this headline">¶</a></h4>
<p>拡張機能がユーザ環境のアップデートを必要とするケースがあります(例えば、カレントワークディレクトリを変更したり、環境変数を設定する等)。ユーザ環境に対する変更はユーザのカレントシェル内で行われなければならず、独立したプロセスで実行できません。ユーザのシェルプロセスで実行するコードを持つために、拡張機能は実行されるシェル構文のテキストを返すフック関数を定義できます。これらの <em>source</em> フックは同じ名前を持つ通常のフックの後で実行されます。そして、そのフック内部で処理を行ってはいけません。</p>
<p>ユーザスクリプトプラグインの <tt class="docutils literal"><span class="pre">initialize_source()</span></tt> フックは、グローバルな初期化スクリプトを調べてカレントのシェルプロセスでそのスクリプトを実行させます。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">initialize_source</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
    <span class="k">return</span> <span class="s">&quot;&quot;&quot;</span>
<span class="s">#</span>
<span class="s"># Run user-provided scripts</span>
<span class="s">#</span>
<span class="s">[ -f &quot;$WORKON_HOME/initialize&quot; ] &amp;&amp; source &quot;$WORKON_HOME/initialize&quot;</span>
<span class="s">&quot;&quot;&quot;</span>
</pre></div>
</div>
<div class="admonition warning">
<p class="first admonition-title">Warning</p>
<p class="last">拡張機能はユーザのワークシェルを変更しているので、予期しない既存変数の上書きにより環境が汚染されないように注意しなければなりません。できるだけ一時的な変数を作成せずに、必要なところで一意な名前を使用してください。接頭辞として拡張名が付く変数は名前空間を管理するのに良い方法です。例えば、 <tt class="docutils literal"><span class="pre">temp_file</span></tt> ではなく <tt class="docutils literal"><span class="pre">user_scripts_temp_file</span></tt> を使用してください。一時的な変数は必要なくなったときに <tt class="docutils literal"><span class="pre">unset</span></tt> で解放してください。</p>
</div>
<div class="admonition warning">
<p class="first admonition-title">Warning</p>
<p class="last">virtualenvwrapper は構文が少し違う複数のシェル(bash, sh, zsh, ksh)で動作します。ソースフックを定義するときにアカウント内にこの移植性を考慮してください。最も簡単な構文のみを使用することで普通は問題ありませんが、求める結果を得るためには唯一の方法しかないケースにおいて、違う構文を生成する <tt class="docutils literal"><span class="pre">SHELL</span></tt> 環境変数を調べる可能性があります。</p>
</div>
</div>
</div>
<div class="section" id="id6">
<h3>エントリポイントを登録する<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h3>
<p>プラグインで定義された関数は virtualenvwrapper のフックローダが見つけられるために <em>エントリポイント</em> として登録する必要があります。 <a class="reference external" href="http://packages.python.org/distribute/">Distribute</a> エントリポイントは関数を実装するパッケージでその関数に対するエントリポイントの名前をマッピングすることにより、そのパッケージの <tt class="docutils literal"><span class="pre">setup.py</span></tt> で設定されます。</p>
<p>この virtualenvwrapper の <tt class="docutils literal"><span class="pre">setup.py</span></tt> の一部は <tt class="docutils literal"><span class="pre">initialize()</span></tt> や <tt class="docutils literal"><span class="pre">initialize_source()</span></tt> エントリポイントの設定方法を説明します。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># Bootstrap installation of Distribute</span>
<span class="kn">import</span> <span class="nn">distribute_setup</span>
<span class="n">distribute_setup</span><span class="o">.</span><span class="n">use_setuptools</span><span class="p">()</span>

<span class="kn">from</span> <span class="nn">setuptools</span> <span class="kn">import</span> <span class="n">setup</span>

<span class="n">setup</span><span class="p">(</span>
    <span class="n">name</span> <span class="o">=</span> <span class="s">&#39;virtualenvwrapper&#39;</span><span class="p">,</span>
    <span class="n">version</span> <span class="o">=</span> <span class="s">&#39;2.0&#39;</span><span class="p">,</span>

    <span class="n">description</span> <span class="o">=</span> <span class="s">&#39;Enhancements to virtualenv&#39;</span><span class="p">,</span>

    <span class="c"># ... details omitted ...</span>

    <span class="n">namespace_packages</span> <span class="o">=</span> <span class="p">[</span> <span class="s">&#39;virtualenvwrapper&#39;</span> <span class="p">],</span>

    <span class="n">entry_points</span> <span class="o">=</span> <span class="p">{</span>
        <span class="s">&#39;virtualenvwrapper.initialize&#39;</span><span class="p">:</span> <span class="p">[</span>
            <span class="s">&#39;user_scripts = virtualenvwrapper.user_scripts:initialize&#39;</span><span class="p">,</span>
            <span class="p">],</span>
        <span class="s">&#39;virtualenvwrapper.initialize_source&#39;</span><span class="p">:</span> <span class="p">[</span>
            <span class="s">&#39;user_scripts = virtualenvwrapper.user_scripts:initialize_source&#39;</span><span class="p">,</span>
            <span class="p">],</span>

        <span class="c"># ... details omitted ...</span>
        <span class="p">},</span>
    <span class="p">)</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">setup()</span></tt> への <tt class="docutils literal"><span class="pre">entry_points</span></tt> 引数はエントリポイントの指定子を表示するエントリポイント <em>グループ名</em> をマッピングするディクショナリです。違うグループ名はそれぞれの拡張ポイントのために virtualenvwrapper により定義されます(<a class="reference internal" href="#plugins-extension-points"><em>拡張ポイント</em></a> を参照)。</p>
<p>エントリポイント指定子は <tt class="docutils literal"><span class="pre">name</span> <span class="pre">=</span> <span class="pre">package.module:function</span></tt> という構文の文字列です。慣例からエントリポイントの <em>名前</em> はプラグインの名前を付けますが、必須だというわけではありません (その名前を使わなくても構いません) 。</p>
<div class="admonition-see-also admonition seealso">
<p class="first admonition-title">See also</p>
<ul class="last simple">
<li><a class="reference external" href="http://packages.python.org/distribute/setuptools.html#namespace-packages">名前空間パッケージ</a></li>
<li><a class="reference external" href="http://packages.python.org/distribute/setuptools.html#extensible-applications-and-frameworks">拡張可能なアプリケーションとフレームワーク</a></li>
</ul>
</div>
</div>
<div class="section" id="id7">
<h3>フックローダ<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h3>
<p>拡張機能は <tt class="docutils literal"><span class="pre">virtualenvwrapper.hook_loader</span></tt> で実装されたコマンドラインアプリケーションを通して実行されます。 <tt class="docutils literal"><span class="pre">virtualenvwrapper.sh</span></tt> がプライマリの呼び出しであり、ユーザはそのアプリケーションを直接的に実行する必要はないので、分割されたスクリプトはインストールされません。その代わり、そのアプリケーションを実行するにはインタープリタに <tt class="docutils literal"><span class="pre">-m</span></tt> オプションを指定してください。</p>
<div class="highlight-python"><pre>$ python -m virtualenvwrapper.hook_loader -h
Usage: virtualenvwrapper.hook_loader [options] &lt;hook&gt; [&lt;arguments&gt;]

Manage hooks for virtualenvwrapper

Options:
  -h, --help            show this help message and exit
  -s, --source          Print the shell commands to be run in the current
                        shell
  -l, --list            Print a list of the plugins available for the given
                        hook
  -v, --verbose         Show more information on the console
  -q, --quiet           Show less information on the console
  -n NAMES, --name=NAMES
                        Only run the hook from the named plugin</pre>
</div>
<p>initialize フックのためにその拡張機能を実行するには次のようにします。</p>
<div class="highlight-python"><pre>$ python -m virtualenvwrapper.hook_loader -v initialize</pre>
</div>
<p>initialize フックのためにシェルコマンドを読み込むには次のようにします。</p>
<div class="highlight-python"><pre>$ python -m virtualenvwrapper.hook_loader --source initialize</pre>
</div>
<p>実際は、フックローダが直接フックを実行するよりも両方のモードでフックを実行するシェル関数 <tt class="docutils literal"><span class="pre">virtualenvwrapper_run_hook</span></tt> を使用する方がもっと便利です。</p>
<div class="highlight-python"><pre>$ virtualenvwrapper_run_hook initialize</pre>
</div>
<p>シェル関数に与えられた全ての引数はフックローダへ直接渡されます。</p>
</div>
<div class="section" id="id8">
<h3>ロギング<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h3>
<p>フックローダはログメッセージを <tt class="docutils literal"><span class="pre">$WORKON_HOME/hook.log</span></tt> に書き込むように設定します。またログメッセージは冗長フラグにより標準エラーにも出力されます。デフォルトでは、ログメッセージは <em>info</em> かそれ以上のレベルが標準エラーへ出力され、 <em>debug</em> かそれ以上がログファイルへ書き込まれます。この方法でロギングを使用することでユーザに拡張機能の冗長性を制御する便利な仕組みを提供します。</p>
<p>拡張機能からロギングを使用するには、単純にロガーをインスタンス化して、ログメッセージと共にその <tt class="docutils literal"><span class="pre">info()</span></tt>, <tt class="docutils literal"><span class="pre">debug()</span></tt> やその他のメソッドを呼び出してください。</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">logging</span>
<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">pre_mkvirtualenv</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>
    <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&#39;pre_mkvirtualenv </span><span class="si">%s</span><span class="s">&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">args</span><span class="p">))</span>
    <span class="c"># ...</span>
</pre></div>
</div>
<div class="admonition-see-also admonition seealso">
<p class="first admonition-title">See also</p>
<ul class="last simple">
<li><a class="reference external" href="http://docs.python.org/library/logging.html">logging の標準ライブラリドキュメント</a></li>
<li><a class="reference external" href="http://www.doughellmann.com/PyMOTW/logging/">logging の PyMOTW</a></li>
</ul>
</div>
</div>
</div>
<div class="section" id="plugins-extension-points">
<span id="id9"></span><h2>拡張ポイント<a class="headerlink" href="#plugins-extension-points" title="Permalink to this headline">¶</a></h2>
<p>ネイティブプラグインの拡張ポイントの名前は複数のパートを持つ命名規則 <tt class="docutils literal"><span class="pre">virtualenvwrapper.(pre|post)_&lt;event&gt;[_source]</span></tt> に従います。 <em>&lt;event&gt;</em> は拡張機能が引き起こす virtualenvwrapper またはユーザによるアクションです。 <tt class="docutils literal"><span class="pre">(pre|post)</span></tt> はその拡張機能の呼び出しがイベントの前か後かのどちらかを指します。接尾辞 <tt class="docutils literal"><span class="pre">_source</span></tt> は直接アクションを受け取らずにシェルスクリプトのコードを返す拡張機能に追加されます(<a class="reference internal" href="#plugins-user-env"><em>ユーザ環境を変更する</em></a> を参照)。</p>
</div>
<div class="section" id="get-env-details">
<span id="plugins-get-env-details"></span><h2>get_env_details<a class="headerlink" href="#get-env-details" title="Permalink to this headline">¶</a></h2>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.get_env_details</span></tt> フックは <tt class="docutils literal"><span class="pre">workon</span></tt> が引数無しで実行されるときに実行されます。そして、仮想環境のリストを表示します。仮想環境の名前が表示された後で、そのフックは環境毎に一度実行されて、その環境に関する追加情報を表示します。</p>
<div class="section" id="initialize">
<span id="plugins-initialize"></span><h3>initialize<a class="headerlink" href="#initialize" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.initialize</span></tt> フックは <tt class="docutils literal"><span class="pre">virtualenvwrapper.sh</span></tt> が環境に読み込まれる毎に実行されます。initialize フックは設定ファイルのテンプレートをインストールしたり、適切なプラグイン操作のためにシステムを整備するために使用されます。</p>
</div>
<div class="section" id="pre-mkvirtualenv">
<span id="plugins-pre-mkvirtualenv"></span><h3>pre_mkvirtualenv<a class="headerlink" href="#pre-mkvirtualenv" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.pre_mkvirtualenv</span></tt> フックは仮想環境が作成された後で実行されますが、新しい環境がアクティブ化される前に実行されます。そのフックが実行されるときのためにカレントワークディレクトリは <tt class="docutils literal"><span class="pre">$WORKON_HOME</span></tt> で、1つの引数として新しい環境の名前が渡されます。</p>
</div>
<div class="section" id="post-mkvirtualenv">
<span id="plugins-post-mkvirtualenv"></span><h3>post_mkvirtualenv<a class="headerlink" href="#post-mkvirtualenv" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.post_mkvirtualenv</span></tt> フックは新しい仮想仮想が作成されて、アクティブ化された後で実行されます。 <tt class="docutils literal"><span class="pre">$VIRTUAL_ENV</span></tt> は新しい環境を指すようにセットされます。</p>
</div>
<div class="section" id="pre-activate">
<span id="plugins-pre-activate"></span><h3>pre_activate<a class="headerlink" href="#pre-activate" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.pre_activate</span></tt> フックは仮想環境が有効になる前に実行されます。環境の名前は1番目の引数として渡されます。</p>
</div>
<div class="section" id="post-activate">
<span id="plugins-post-activate"></span><h3>post_activate<a class="headerlink" href="#post-activate" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.post_activate</span></tt> フックは仮想環境が有効になった後で実行されます。 <tt class="docutils literal"><span class="pre">$VIRTUAL_ENV</span></tt> はカレント環境を指すようにセットされます。</p>
</div>
<div class="section" id="pre-deactivate">
<span id="plugins-pre-deactivate"></span><h3>pre_deactivate<a class="headerlink" href="#pre-deactivate" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.pre_deactivate</span></tt> フックは仮想環境が無効になる前に実行されます。 <tt class="docutils literal"><span class="pre">$VIRTUAL_ENV</span></tt> はカレント環境を指すようにセットされます。</p>
</div>
<div class="section" id="post-deactivate">
<span id="plugins-post-deactivate"></span><h3>post_deactivate<a class="headerlink" href="#post-deactivate" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.post_deactivate</span></tt> フックは仮想環境が無効になった後で実行されます。非アクティブ化される環境の名前は1番目の引数として渡されます。</p>
</div>
<div class="section" id="pre-rmvirtualenv">
<span id="plugins-pre-rmvirtualenv"></span><h3>pre_rmvirtualenv<a class="headerlink" href="#pre-rmvirtualenv" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.pre_rmvirtualenv</span></tt> フックは仮想環境が削除される前に実行されます。削除される環境の名前は1番目の引数として渡されます。</p>
</div>
<div class="section" id="post-rmvirtualenv">
<span id="plugins-post-rmvirtualenv"></span><h3>post_rmvirtualenv<a class="headerlink" href="#post-rmvirtualenv" title="Permalink to this headline">¶</a></h3>
<p><tt class="docutils literal"><span class="pre">virtualenvwrapper.post_rmvirtualenv</span></tt> フックは仮想環境が削除された後で実行されます。削除される環境の名前は1番目の引数として渡されます。</p>
</div>
</div>
<div class="section" id="id10">
<h2>新しい拡張ポイントを追加する<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h2>
<p>さらに新しい操作を定義するプラグインは新しい拡張ポイントも定義できます。フックローダが拡張機能を見つけるために行う設定は必要ありません。名前を記述して <tt class="docutils literal"><span class="pre">virtualenvwrapper_run_hook</span></tt> の呼び出しを追加することで、追加した拡張機能が実行されるようになります。</p>
<p>フックローダは全ての拡張ポイントの名前が <tt class="docutils literal"><span class="pre">virtualenvwrapper.</span></tt> で始まることを前提としています。そして、新しいプラグインは独自の名前空間の修飾語句をその接頭辞に追加したくなるでしょう。例えば <a class="reference external" href="http://www.doughellmann.com/projects/virtualenvwrapper.project/">project</a> 拡張はプロジェクトのディレクトリ作成(前後)に関連して新たなイベントを定義します。そこで <tt class="docutils literal"><span class="pre">virtualenvwrapper.project.pre_mkproject</span></tt> と <tt class="docutils literal"><span class="pre">virtualenvwrapper.project.post_mkproject</span></tt> が呼び出されます。それは次のように1つずつ実行されます。</p>
<div class="highlight-python"><pre>virtualenvwrapper_run_hook project.pre_mkproject $project_name</pre>
</div>
<p>と</p>
<div class="highlight-python"><pre>virtualenvwrapper_run_hook project.post_mkproject</pre>
</div>
<p>です。</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
  <h3><a href="index.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">virtualenvwrapper を拡張する</a><ul>
<li><a class="reference internal" href="#id1">拡張機能を定義する</a><ul>
<li><a class="reference internal" href="#id2">コードの構成</a></li>
<li><a class="reference internal" href="#api">拡張 API</a></li>
<li><a class="reference internal" href="#id3">拡張機能の起動</a><ul>
<li><a class="reference internal" href="#id4">ダイレクトアクション</a></li>
<li><a class="reference internal" href="#plugins-user-env">ユーザ環境を変更する</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id6">エントリポイントを登録する</a></li>
<li><a class="reference internal" href="#id7">フックローダ</a></li>
<li><a class="reference internal" href="#id8">ロギング</a></li>
</ul>
</li>
<li><a class="reference internal" href="#plugins-extension-points">拡張ポイント</a></li>
<li><a class="reference internal" href="#get-env-details">get_env_details</a><ul>
<li><a class="reference internal" href="#initialize">initialize</a></li>
<li><a class="reference internal" href="#pre-mkvirtualenv">pre_mkvirtualenv</a></li>
<li><a class="reference internal" href="#post-mkvirtualenv">post_mkvirtualenv</a></li>
<li><a class="reference internal" href="#pre-activate">pre_activate</a></li>
<li><a class="reference internal" href="#post-activate">post_activate</a></li>
<li><a class="reference internal" href="#pre-deactivate">pre_deactivate</a></li>
<li><a class="reference internal" href="#post-deactivate">post_deactivate</a></li>
<li><a class="reference internal" href="#pre-rmvirtualenv">pre_rmvirtualenv</a></li>
<li><a class="reference internal" href="#post-rmvirtualenv">post_rmvirtualenv</a></li>
</ul>
</li>
<li><a class="reference internal" href="#id10">新しい拡張ポイントを追加する</a></li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="scripts.html"
                        title="previous chapter">ユーザカスタマイズ</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="projects.html"
                        title="next chapter">プロジェクト管理</a></p>
  <h3>This Page</h3>
  <ul class="this-page-menu">
    <li><a href="_sources/plugins.txt"
           rel="nofollow">Show Source</a></li>
  </ul>
<div id="searchbox" style="display: none">
  <h3>Quick search</h3>
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" size="18" />
      <input type="submit" value="Go" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    <p class="searchtip" style="font-size: 90%">
    Enter search terms or a module, class or function name.
    </p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="projects.html" title="プロジェクト管理"
             >next</a></li>
        <li class="right" >
          <a href="scripts.html" title="ユーザカスタマイズ"
             >previous</a> |</li>
        <li><a href="index.html">virtualenvwrapper v3.4 documentation</a> &raquo;</li>
          <li><a href="hooks.html" >virtualenvwrapper をカスタマイズする</a> &raquo;</li> 
      </ul>
    </div>
    <div class="footer">
        &copy; Copyright 2009-2011, Doug Hellmann.
      Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.5.
    </div>
  </body>
</html>