首先说明,这种方式目前是一种「非主流」的方式,是在安装 IPython 最新版本时无意发现的。

我们先看一个真实的项目 entrypoints ,我们先安装它:

❯ virtualenv venv -p /usr/local/bin/python3  # flit依赖Python 3,但是可以分发Python 2的包
❯ source venv/bin/activate
❯ pip install entrypoints

这看起来一直很正常。我们再看看项目文件结构:

❯ tree -L 2
.
├── LICENSE
├── doc
│   ├── Makefile
│   ├── api.rst
│   ├── conf.py
│   └── index.rst
├── entrypoints.py
├── flit.ini
└── tests
    ├── __init__.py
    ├── samples
    └── test_entrypoints.py

有没有发现,没有 setup.py 文件! 这和我们平时对打包上传的理解有冲突呀。

这是怎么实现的呢?首先我们先了解下下面 2 个 PEP:

  1. PEP 516 -- Build system abstraction for pip/conda etc
  2. PEP 517 -- A build-system independent format for source trees

对, 就是让 flit.ini 替代 (部分) 了 setup.py 的作用:

❯ cat flit.ini
[metadata]
module = entrypoints
author = Thomas Kluyver
author-email = thomas@kluyver.me.uk
home-page = https://github.com/takluyver/entrypoints
classifiers = License :: OSI Approved :: MIT License
requires-python = >=2.7
requires = configparser (>=3.5); python_version == '2.7'

我们来体会下使用 flit 的用法,首先安装它:

❯ pip install flit

现在我们创建一个简单的项目,就叫「flit_test」吧:

❯ mkdir flit_test
❯ cd flit_test
❯ flit init  # 初始化
Module name: flit_test
Author: Dongweiming
Author email: ciici123@gmail.com
Home page: http://www.dongwm.com
Choose a license (see http://choosealicense.com/ for more info)
1. MIT - simple and permissive
2. Apache - explicitly grants patent rights
3. GPL - ensures that code based on this is shared with the same terms
4. Skip - choose a license later
Enter 1-4: 1

Written flit.ini; edit that file to add optional extra info.

接着我们创建初始化填写的模块文件:

❯ cat flit_test.py
'''Some docstring'''
__version__ = '0.1'

def main():
    print('Hello World')

我们现在给 flit.ini 文件添加一个入口:

[scripts]
hello=flit_test:main

这样在安装之后就可以在命令行直接使用 hello 命令,会执行打印 'Hello World'。

最后一步就是上传到 PYPI 了:

❯ flit wheel --upload
...
Registered flit_test with PyPI                                               I-flit.upload
Uploading dist/flit_test-0.1-py2.py3-none-any.whl...                         I-flit.upload
Package is at https://pypi.python.org/pypi/flit_test                         I-flit.upload

我们现在验证下 flit_test 这个包:

❯ pip install flit_test
❯ hello
Hello World
❯ which hello
/Users/dongweiming/entrypoints/venv/bin/hello