{"title":"高度なチュートリアル: 再利用可能アプリの書き方","version":"1.11","locale":"ja","docname":"intro/reusable-apps","url":"/ja/1.11/intro/reusable-apps/","canonical":"https://djangodocs.dev/ja/1.11/intro/reusable-apps/","summary":"この高度なチュートリアルは、 Tutorial 7 が終わったところから始まります。Web-poll を、新しいプロジェクトで再利用でき、他の人に共有できる独立した Python のパッケージへと変えていきましょう。 直近のチュートリアル 1 - 7…","html":"<h1>高度なチュートリアル: 再利用可能アプリの書き方<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>この高度なチュートリアルは、 <a class=\"reference internal\" href=\"/ja/1.11/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a> が終わったところから始まります。Web-poll を、新しいプロジェクトで再利用でき、他の人に共有できる独立した Python のパッケージへと変えていきましょう。</p>\n<p>直近のチュートリアル 1 - 7 が終わっていないなら、一目通すことをおすすめします。例で作ったプロジェクトが以下の説明でも使われるからです。</p>\n<section id=\"reusability-matters\">\n<h2>再利用性の問題<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Web アプリケーションの設計、開発、テスト、そしてメンテナンスには多大な労力が必要です。そして多くの Python プロジェクト、 Django プロジェクトは共通の問題を抱えています。この繰り返し作業を減らせたら良いと思いませんか？</p>\n<p>再利用は、 Python ではごく当たり前のことです。 <a class=\"reference external\" href=\"https://pypi.python.org/pypi\">Python Package Index (PyPI)</a> には様々なパッケージが登録されており、それらはすべてあなたの Python プログラム上で使えます。 <a class=\"reference external\" href=\"https://www.djangopackages.com\">Django Packages</a> にもプロジェクトに組み込める再利用可能なアプリケーションがあるので見てみてください。 Django 自体も単なる Python パッケージです。つまり既存の Python パッケージまたは Django アプリケーションを使って、自分の Web プロジェクトを構成できるということです。必要なのはそのプロジェクト独自の部品を書くことだけです。</p>\n<p>例えば、投票アプリケーション（ちょうど今まで作ってきたものと似たようなもの）を必要とするプロジェクトを新しく開始したとしましょう。どうやって投票アプリケーションを再利用可能にしますか？運のいいことに、その方法はすでに会得済みです。 <a class=\"reference internal\" href=\"/ja/1.11/intro/tutorial03/\"><span class=\"doc\">チュートリアル3</span></a> では、 <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code> を使ってプロジェクトレベルの URLconf から投票アプリを分離する方法を学びました。このチュートリアルでは、アプリケーションを新規のプロジェクトで使いやすいようにし、いつでも別の場所でインストール/利用できるようにします。</p>\n<aside class=\"admonition-package-app admonition\">\n<p class=\"admonition-title\">パッケージ？アプリ？</p>\n<p>Python の <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(in Python v3.14)\"><span class=\"xref std std-term\">package</span></a> を使うと、関連する Python コードをまとめて再利用しやすいようにできます。パッケージは、 Python コードのファイル ( 通称 &quot;モジュール&quot; ) を１つ以上含みます。</p>\n<p>パッケージは <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">foo.bar</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">foo</span> <span class=\"pre\">import</span> <span class=\"pre\">bar</span></code> でインポートできます。パッケージ内のディレクトリ (例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>) は <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code> という特殊なファイルを、空のファイルでもいいので含む必要があります。</p>\n<p>Django <em>アプリケーション</em> は単なる Python パッケージで、 Django プロジェクトで使うことのみを意図したものです。アプリは一般的な Django の慣例に則っているでしょう。例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">urls</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">views</span></code> のサブモジュールがあること、などです。</p>\n<p>後に <em>パッケージング</em> という言葉を、他の人がインストールしやすいように Python パッケージを作るプロセスを表すのに用います。少し混乱するかもしれませんね。</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>プロジェクトと再利用可能アプリ<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>前のチュートリアルを終えると、プロジェクトはこのようになっているはずです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">mysite</span><span class=\"o\">/</span>\n    <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">mysite</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">wsgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">polls</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">migrations</span><span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n            <span class=\"mi\">0001</span><span class=\"n\">_initial</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">static</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">images</span><span class=\"o\">/</span>\n                    <span class=\"n\">background</span><span class=\"o\">.</span><span class=\"n\">gif</span>\n                <span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">css</span>\n        <span class=\"n\">templates</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">detail</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">index</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">results</span><span class=\"o\">.</span><span class=\"n\">html</span>\n        <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">templates</span><span class=\"o\">/</span>\n        <span class=\"n\">admin</span><span class=\"o\">/</span>\n            <span class=\"n\">base_site</span><span class=\"o\">.</span><span class=\"n\">html</span>\n</code></pre></div>\n<p>すでに <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/templates</span></code> を <a class=\"reference internal\" href=\"/ja/1.11/intro/tutorial07/\"><span class=\"doc\">チュートリアル 7</span></a> で、 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code> を <a class=\"reference internal\" href=\"/ja/1.11/intro/tutorial03/\"><span class=\"doc\">チュートリアル 3</span></a> で作成しました。今となっては、なぜテンプレートディレクトリをプロジェクトとアプリケーションに分けたかが明確にわかるかもしれませんね。投票アプリケーションに関する全ては <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> にあります。アプリケーションが自己完結していて、新規のプロジェクトにも導入しやすくなっています。</p>\n<p>今、 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリは新規の Django プロジェクトにコピーでき、すぐに再利用できる状態です。しかし公開するための準備が完璧というわけではありません。そのために、アプリをパッケージにして別の場所でインストールしやすいようにする必要があります。</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>事前に必要な物をインストールする<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python のパッケージングの現状は、複数のツールがあることで少しややこしいです。このチュートリアルでは <a class=\"reference external\" href=\"https://pypi.python.org/pypi/setuptools\">setuptools</a> をパッケージに使用します。これはおすすめのパッケージングツールです( forkされていた <code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code> はマージされました)。終わった後にアンインストールするために <a class=\"reference external\" href=\"https://pypi.python.org/pypi/pip\">pip</a> も使います。今はこの 2 つのパッケージをインストールしておいてください。分からなければ <a class=\"reference internal\" href=\"/ja/1.11/topics/install/#installing-official-release\"><span class=\"std std-ref\">Django をpip でインストールする</span></a>. を参照してください。 <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code> も同じ方法でインストールできます。</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>アプリケーションをパッケージングする<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Python において <em>パッケージング</em> とは、特定のフォーマットでアプリを作っておくことです。このフォーマットは簡単にインストールして使えます。 Django 自体もこのようにパッケージ化されています。投票アプリのような小さなものでは、このプロセスはそれほど難しいものではありません。</p>\n<ol class=\"arabic\">\n<li><p>はじめに、 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> の親ディレクトリを、 Django プロジェクトの外に作りましょう。 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> というディレクトリにします。</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\">\n<p class=\"admonition-title\">アプリケーションの名前を決める</p>\n<p>パッケージの名前を決めるときは、 PyPI のようなリソースをチェックして、すでにあるパッケージとの名前の衝突を避ける必要があります。 Django アプリケーションのパッケージを作って配布する際には、モジュール名の先頭に <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> を付けるのがよいでしょう。こうすると、 Django アプリを探している人にとって、あなたのアプリが Django 特化のものであると判別しやすくなります。</p>\n<p>アプリケーションラベル (すなわち、アプリケーションパッケージへのパス（ドット区切り）の最後の部分) は <a class=\"reference internal\" href=\"/ja/1.11/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> の中で <em>必ず</em> ユニークでなければなりません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code> のようなDjango <a class=\"reference internal\" href=\"/ja/1.11/ref/contrib/\"><span class=\"doc\">contrib packages</span></a> と同じラベルを使うことは避けてください。</p>\n</aside>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリを <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> ディレクトリに移動する</p></li>\n<li><p>以下の内容の <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code> という名前のファイルを作成します:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/README.rst</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"django-polls/README.rst\"><code>=====\nPolls\n=====\n\nPolls is a simple Django app to conduct Web-based polls. For each\nquestion, visitors can choose between a fixed number of answers.\n\nDetailed documentation is in the &quot;docs&quot; directory.\n\nQuick start\n-----------\n\n1. Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n        ...\n        &#39;polls&#39;,\n    ]\n\n2. Include the polls URLconf in your project urls.py like this::\n\n    url(r&#39;^polls/&#39;, include(&#39;polls.urls&#39;)),\n\n3. Run `python manage.py migrate` to create the polls models.\n\n4. Start the development server and visit http://127.0.0.1:8000/admin/\n   to create a poll (you&#39;ll need the Admin app enabled).\n\n5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/LICENSE</span></code> ファイルを作成します。ライセンスの選択はこのチュートリアルの範疇を超えていますが、ライセンスなしで公にリリースされたコードは <em>役立たず</em> であると言えば十分です。 Django と多くの Django 互換アプリケーションはBSDライセンスの元に配布されます。でもどのライセンスを選択するかは自由です。ライセンスの選択は、誰がコードを使え得るかに影響すると注意してください。</p></li>\n<li><p>次に <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code> ファイルを作りましょう。これはアプリケーションがどのようにビルド、インストールされるかを提供するものです。このファイルの網羅的な説明はこのチュートリアルの範疇を超えていますが、 <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools docs</a> には役立つ説明があります。以下のように <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code> ファイルを作ってみましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/setup.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"django-polls/setup.py\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">setuptools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">find_packages</span><span class=\"p\">,</span> <span class=\"n\">setup</span>\n\n<span class=\"k\">with</span> <span class=\"nb\">open</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=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"s1\">&#39;README.rst&#39;</span><span class=\"p\">))</span> <span class=\"k\">as</span> <span class=\"n\">readme</span><span class=\"p\">:</span>\n    <span class=\"n\">README</span> <span class=\"o\">=</span> <span class=\"n\">readme</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># allow setup.py to be run from any path</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">chdir</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\">normpath</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=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">abspath</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">pardir</span><span class=\"p\">)))</span>\n\n<span class=\"n\">setup</span><span class=\"p\">(</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;django-polls&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"s1\">&#39;0.1&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">packages</span><span class=\"o\">=</span><span class=\"n\">find_packages</span><span class=\"p\">(),</span>\n    <span class=\"n\">include_package_data</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"n\">license</span><span class=\"o\">=</span><span class=\"s1\">&#39;BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s1\">&#39;A simple Django app to conduct Web-based polls.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">long_description</span><span class=\"o\">=</span><span class=\"n\">README</span><span class=\"p\">,</span>\n    <span class=\"n\">url</span><span class=\"o\">=</span><span class=\"s1\">&#39;https://www.example.com/&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">author</span><span class=\"o\">=</span><span class=\"s1\">&#39;Your Name&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">author_email</span><span class=\"o\">=</span><span class=\"s1\">&#39;yourname@example.com&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">classifiers</span><span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"s1\">&#39;Environment :: Web Environment&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django :: X.Y&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># replace &quot;X.Y&quot; as appropriate</span>\n        <span class=\"s1\">&#39;Intended Audience :: Developers&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;License :: OSI Approved :: BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n        <span class=\"s1\">&#39;Operating System :: OS Independent&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python&#39;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># Replace these appropriately if you are stuck on Python 2.</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.4&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.5&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP :: Dynamic Content&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></figure>\n</li>\n<li><p>デフォルトでは、パッケージには Python のモジュールとパッケージだけがまとめられます。追加のファイルを含めるには、<code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> というファイルを作成する必要があります。前のステップで挙げた setuptools のドキュメントには、このファイルについて詳しい説明があります。テンプレート、<code class=\"docutils literal notranslate\"><span class=\"pre\">README.rst</span></code>、および <code class=\"docutils literal notranslate\"><span class=\"pre\">LICENSE</span></code> をパッケージに含めるには、<code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> というファイルを作成し、その中に次のように書きます。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/MANIFEST.in</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"django-polls/MANIFEST.in\"><code><span class=\"n\">include</span> <span class=\"n\">LICENSE</span>\n<span class=\"n\">include</span> <span class=\"n\">README</span><span class=\"o\">.</span><span class=\"n\">rst</span>\n<span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">static</span> <span class=\"o\">*</span>\n<span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">templates</span> <span class=\"o\">*</span>\n</code></pre></figure>\n</li>\n<li><p>アプリケーションの詳細なドキュメントを含めるのは、任意ですが推奨されます。空のディレクトリ <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> を将来のドキュメンテーションのために作っておきましょう。 <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANAFEST.in</span></code> に行を追加しておいてください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">docs</span> <span class=\"o\">*</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code> に対象のファイルを追加しないと <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code> ディレクトリがパッケージに含まれないことに注意してください。多くの Django アプリではドキュメントを <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a> のようなサイトを通して提供しています。</p>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">setup.py</span> <span class=\"pre\">sdist</span></code> でパッケージをビルドしてみましょう (<code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> 内で実行してください) 。これによって <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> というディレクトリと、新しいパッケージである <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls-0.1.tar.gz</span></code> が作られます。</p></li>\n</ol>\n<p>For more information on packaging, see Python's <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutorial on Packaging and\nDistributing Projects</a>.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>自分のパッケージを使ってみる<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> ディレクトリはプロジェクト外に移動したので、これはもう動きません。代わりにできたての <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> パッケージを使ってみましょう。</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\">\n<p class=\"admonition-title\">ユーザーライブラリとしてインストールする</p>\n<p>以下のステップは <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> をユーザーライブラリとしてインストールするものです。ユーザー単位でのインストールはシステム全体でのインストールよりも多くの利点があります。管理者アクセス権を持っていないシステム上で使用可能というだけでなく、パッケージがシステムサービスやマシン上の他ユーザーに影響を与えるのを防げます。</p>\n<p>ユーザー単位でのインストールは依然、そのユーザーのシステムツールの振る舞いに影響をあたえます。なので <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code> はより確実な解決になります (下記を参照してください) 。</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>パッケージをインストールするためには、pip を利用してください (すでに  <span class=\"xref std std-ref\">インストール</span> していますよね?):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">pip</span> <span class=\"n\">install</span> <span class=\"o\">--</span><span class=\"n\">user</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">dist</span><span class=\"o\">/</span><span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">-</span><span class=\"mf\">0.1</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n</code></pre></div>\n</li>\n<li><p>運が良ければ Django プロジェクトは再度、正常に動作します。確認するために再びサーバーを起動します。</p></li>\n<li><p>パッケージをアンインストールするには pip を使います:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">pip</span> <span class=\"n\">uninstall</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span>\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>アプリを公開する<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> のパッケージを作り、テストしました。世界に共有するときです！これが単なる例でなければこうします:</p>\n<ul class=\"simple\">\n<li><p>パッケージを友人にメールで送る</p></li>\n<li><p>自身の Web サイトにアップロードする</p></li>\n<li><p>Post the package on a public repository, such as <a class=\"reference internal\" href=\"#the-python-package-index-pypi\">the Python Package Index\n(PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> has <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">a good\ntutorial</a>\nfor doing this.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-virtualenv\">\n<h2>virtualenv に Python パッケージをインストールする<a class=\"heading-anchor\" href=\"#installing-python-packages-with-virtualenv\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>これまでは投票アプリをユーザーライブラリにインストールしてきました。これにはいくつか欠点があります:</p>\n<ul class=\"simple\">\n<li><p>ユーザーライブラリの変更はシステム上の他の Python ソフトウェアに影響を与えるおそれがあります</p></li>\n<li><p>このパッケージの複数バージョン (もしくは同じ名前の別のもの) を実行できません</p></li>\n</ul>\n<p>通常このような問題が起こるのは、複数の Django プロジェクトを管理している場合だけです。一番の解決方法は、 <a class=\"reference external\" href=\"https://virtualenv.pypa.io/\">virtualenv</a> を利用することです。このツールを使えば、複数の独立した Python 環境を持つことができます。各 Python 環境はそれぞれに、ライブラリのコピーやパッケージの名前空間を持ちます。</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"再利用性の問題","anchor":"reusability-matters","children":[]},{"title":"プロジェクトと再利用可能アプリ","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"事前に必要な物をインストールする","anchor":"installing-some-prerequisites","children":[]},{"title":"アプリケーションをパッケージングする","anchor":"packaging-your-app","children":[]},{"title":"自分のパッケージを使ってみる","anchor":"using-your-own-package","children":[]},{"title":"アプリを公開する","anchor":"publishing-your-app","children":[]},{"title":"virtualenv に Python パッケージをインストールする","anchor":"installing-python-packages-with-virtualenv","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"さぁ始めましょう。","url":"/ja/1.11/intro/"}],"prev":{"docname":"intro/tutorial07","title":"はじめての Django アプリ作成、その 7","url":"/ja/1.11/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"次のステップへ","url":"/ja/1.11/intro/whatsnext/"},"formats":{"html":"/ja/1.11/intro/reusable-apps/","markdown":"/ja/1.11/intro/reusable-apps.md","json":"/ja/1.11/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/ja/1.11/intro/reusable-apps/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}