1. 程式人生 > >發布你的django項目

發布你的django項目

like .tar.gz Language static upload TP dem ngs 去重

轉載: http://www.codingsoho.com/zh/blog/pypi-your-app/

重用性對於我們的app非常重要,能夠避免重復工作。本課程將教你如何去重用你的app

參考文檔為https://docs.djangoproject.com/en/1.11/intro/reusable-apps/,結合項目實際在一步步演示。

創建你的重用項目

我們從頭開始創建一個應用codingsohodemo用於演示

首先創建一個項目mydemo

django-admin.py startproject demo

接著創建我們打算重用的應用codingsohodemo

python manage.py startapp codingsohodemo

在這個app實現你的功能,此處省略。

最終我們可以看到如下的結構

├─codingsohodemo
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ urls.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ __init__.py
│ │
│ ├─static
│ │ ├─codingsohodemo
│ │ │ ├─css
│ │ │ │ pgwslideshow.min.css
│ │ │ │
│ │ │ └─js
│ │ │ pgwslideshow.min.js
│ │ │
│ │ └─js
│ │ jquery.min.js
│ │
│ └─templates
│ │ base_site.html
│ │
│ └─codingsohodemo
│ pgwshow.html

上面的項目中,我們給app創建了獨立的template和static目錄,這樣它比較容易發布,加入新項目時安裝會比較容易,避免過多的邏輯交織。

codingsohodemo目錄可以直接拷貝到新的項目中立即重用。如果想讓別人也能夠安裝的話,我們需要發布它。

安裝前置條件

我們會用setuptools去編譯我們的包,這是目前推薦的打包工具。後面我們可以通過pip來安裝或卸載這個包。

打包應用

流程並不復雜,一步一步按照下面的步驟做就可以了

1.在你的項目外創建父目錄。這個目錄名後面會成為包的名字,要先檢查一下這個名字是否已存在,避免和現有包沖突。通常我們可以在前面加個django-,這樣便於別人搜索django項目。

2.把codingsohodemo這個目錄拷貝到django-codingsohodemo

3.創建django-codingsohodemo/README.rst, 內容如下,可以根據實際情況修改

=====
django-codingsohodemo
=====

django-codingsohodmeo project is demo application for codingsoho

Detailed documentation is in the "docs" directory.

Quick start
-----------

1. Add "codingsohodemo" to your INSTALLED_APPS setting like this::

    INSTALLED_APPS = [
        ...
        ‘codingsohodemo‘,
    ]

2. Include the polls URLconf in your project urls.py like this::

    url(r‘^codingsohodemo/‘, include(‘codingsohodemo.urls‘)),

3. Run `python manage.py migrate` to create the codingsohodemo models.

4. Start the development server and visit http://127.0.0.1:8000/admin/
   to create a models if needed (you‘ll need the Admin app enabled).

5. Visit http://127.0.0.1:8000/codingsohodemo/ to participate in the poll.

4.創建django-codingsohodemo/LICENSE,這個不是本文的範圍。你根據你的實際情況完成你的license,很多django項目用的是BSD License。我只是參考某個項目寫了MIT License

The MIT License (MIT)

Copyright (c) 2018 CodingSoho

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

5.創建django-codingsohodemo/setup.py, 詳情可參考setuptools docs ,下面是我的例子

import os
from setuptools import find_packages, setup

with open(os.path.join(os.path.dirname(__file__), ‘README.rst‘)) as readme:
    README = readme.read()

# allow setup.py to be run from any path
os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))

setup(
    name=‘django-codingsohodemo‘,
    version=‘1.1‘,
    packages=find_packages(),
    include_package_data=True,
    license=‘BSD License‘, # example license
    description=‘django-codingsohodmeo project is demo application for codingsoho‘,
    long_description=README,
    url=‘http://www.codingsoho.com/‘,
    author=‘Horde Chief‘,
    author_email=[email protected],
    classifiers=[
        ‘Environment :: Web Environment‘,
        ‘Framework :: Django‘,
        ‘Framework :: Django :: 1.11‘, # replace "X.Y" as appropriate
        ‘Intended Audience :: Developers‘,
        ‘License :: OSI Approved :: BSD License‘, # example license
        ‘Operating System :: OS Independent‘,
        ‘Programming Language :: Python‘,
        # Replace these appropriately if you are stuck on Python 2.
        ‘Programming Language :: Python :: 2‘,
        ‘Programming Language :: Python :: 2.7‘,
        ‘Topic :: Internet :: WWW/HTTP‘,
        ‘Topic :: Internet :: WWW/HTTP :: Dynamic Content‘,
    ],
)

根據你的情況修改name,versiondescription,url,author,author_email.

在classifiers裏面,更新Django的版本和需要的python版本。

6.默認情況下,只有python文件和包會被打包。如果想添加額外的文件,需要新建另外的文件django-codingsohodemo/MANIFEST.in

include LICENSE
include README.rst
recursive-include codingsohodemo/static *
recursive-include codingsohodemo/templates *

7.可選步驟,如果你想額外的創建文檔的話,也可以在這兒加進去。註意,裏面必須放一些文件,否則空文件夾不會被打包。

recursive-include docs *

8.最後,我們可以用下面命令進行打包。在django-codingsohodemo目錄下執行。這樣它會創建一個dist目錄,並且在裏面生成包文件django-codingsohodemo-1.0.tar.gz。

python setup.py sdist

發布新的版本時記得修改版本號,這樣它會創建新的打包文件,例如,如果我們修改版本為1.1,新的文件為 django-codingsohodemo-1.1.tar.gz

從你自己的包安裝

前面我們把codingsohodemo目錄移出去了,現在我們可以pip安裝讓它繼續工作。

執行pip install dist\django-codingsohodemo-1.0.tar.gz即可完成安裝。

你可以通過pip uninstall django-codingsohodemo卸載

發布應用

應用的發出參考python官網資料 https://packaging.python.org/tutorials/packaging-projects/#uploading-your-project-to-pypi

首先你要有一個pypi賬號,登陸https://test.pypi.org/account/register/註冊

註冊成功後,你就可以上傳發布包了。

安裝twine

pip install twine

執行下面命令完成上傳

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

中間會提示你輸入用戶名和密碼驗證

上傳成功後訪問https://test.pypi.org/project/django-codingsohodemo/檢查是否成功

至此,我們可以執行pip install djagno-codingsohodemo來進行安裝了。

註意,以上的步驟是讓你發布到Test Pypi,這個只是暫時的。你需要把你的項目真正發布到Pypi。

首先註冊地址不同,為https://pypi.org

其實上傳命令不一樣

twine upload dist/*

Uploading distributions to https://upload.pypi.org/legacy/

完成之後, 你可以使用pip install django-codingsohodemo來安裝你的包了

註意:上傳成功後不能立即安裝,它需要一點時間同步

參考資料

  • https://docs.djangoproject.com/en/1.11/intro/reusable-apps/
  • https://packaging.python.org/tutorials/packaging-projects/#uploading-your-project-to-pypi

發布你的django項目