發布項目遇到了坑……特此記錄。
How to write setup.py: https://docs.python.org/2/distutils/setupscript.html
Setup.py
setup.py是python的一個項目發布管理工具。我們常常安裝別人的代碼也是借助setup.py。
我的項目的setup.py示例:
from setuptools import setup, find_packages setup( name="rdir", version="0.52", description="More powerful recursive dir. Support HTML pretty view in tree structure.", long_description="Documentation and bug report: http://www.github.com/Lhfcws/rdir \ <br/><br/>\ Sorry for the deploy bugs in the previous versions\ <br/><br/>\ If you came across ImportError or NoScriptError, please `rm /usr/local/bin/rdir*`", author="Lhfcws Wu", author_email="lhfcws@gmail.com", url="http://www.github.com/Lhfcws/rdir", license="MIT", packages=["rdir", "rdir/core", "rdir/generateHTML"], include_package_data=True, package_data={"rdir": ["rdir/generateHTML/template/*.html", "rdir/generateHTML/bin/*.js"]}, install_requires=['colorama', 'pyquery'], keywords=["dir", "doc", "pydoc", "html"], )
項目主要結構:
|-- rdir | |-- core | `-- generateHTML
(我上面省略了我的py文件,__init__.py肯定是有的)
name就是你的項目名了,version是版本,這兩個會在打包時自動生成為你的項目名(比如 rdir-0.52)。description到license不多說。
packages很重要,它代表你有哪些package要打入發布中。Python package的概念很簡單,一個目錄下有__init__.py就是一個package。像我如上有三個package,於是就指定 packages=["rdir", "rdir/core", "rdir/generateHTML"] 。大家還看到我引入了一個 find_packages()函數沒用,當你的每個package下的__init__.py里都import了當前package下的module時,find_packages()會自動幫你找到所有的包。
然后我項目里會有一些非py文件,比如html和js等,這時候就要靠 include_package_data 和 package_data 來指定了。package_data一般寫成 {'your_package_name': ["files"]}。keywords便於pypi索引。
然后include_package_data還沒完,還需要一個MANIFEST.in文件:
include rdir/generateHTML/template/*.html rdir/generateHTML/bin/*.js
這個時候才會真正幫你自動copy文件到打包中。
關於MENIFEST.in請參見 https://docs.python.org/2/distutils/sourcedist.html
額外插一個常用的scripts,scripts配置會將對應的py腳本安裝到你的 /usr/local/bin 目錄下並在import時是優先執行的。因此你如果有了scripts,你的site-packages里的egg包就會不起作用被覆蓋了。這時候就會見到惱人卻又不知為何的ImportError,去掉scripts配置又發現No Script Error。其實刪掉bin下的scripts就解決問題了。
最后歡迎試用 https://pypi.python.org/pypi/rdir :加強版的dir,提供多種模式(命令行、文件、html)查看一個對象遞歸的結構以及對應的文檔。
可通過pip或easy_install安裝 sudo pip install rdir。
