使用 Setuptools 部署¶

Setuptools 是一个扩展库,通常用于分发 Python 库和扩展。它扩展了 Python自带的一个基础模块安装系统 distutils ,支持多种更复杂的结构,方便了大型应用的分发部署。它的主要特色:

  • 支持依赖 :一个库或者应用可以声明其所依赖的其他库的列表。依赖库将被自动安装。
  • 包注册 :可以在安装过程中注册包,这样就可以通过一个包查询其他包的信息。这套系统最有名的功能是“切入点”,即一个包可以定义一个入口,以便于其他包挂接,用以扩展包。
  • 安装管理: pip 可以为你安装其他库。
    如果你从 Python.org 安装了 Python 2 (>=2.7.9) 或者 Python 3 (>=3.4) ,那么已经安装好了 pip 和 setuptools 。否则需要自行安装它们。

Flask 本身,以及其他所有在 PyPI 中可以找到的库要么是用 setuptools 分发的,要么是用 distutils 分发的。

在这里我们假设你的应用名称是 yourapplication.py ,且没有使用模块,而是一个 。关于如何把模块转换为包的信息参见 大型应用 方案。

可用的 setuptools 部署是进行复杂开发的第一步,它将使发布工作更加自动化。如果你想要完全自动化处理,请同时阅读 使用 Fabric 部署 一节。

基础设置脚本¶

因为 Flask 依赖 setuptools ,所以安装好了 Flask ,就表示 setuptools 也已经安装好了。

标准声明: 最好使用 virtualenv

你的设置代码应用放在 setup.py 文件中,这个文件应当位于应用旁边。这个文件名只是一个约定,但是最好不要改变,因为大家都会去找这个文件。

Flask 应用的基础 setup.py 文件示例如下:

  1. from setuptools import setup
  2.  
  3. setup(
  4. name='Your Application',
  5. version='1.0',
  6. long_description=__doc__,
  7. packages=['yourapplication'],
  8. include_package_data=True,
  9. zip_safe=False,
  10. install_requires=['Flask']
  11. )

请记住,你必须显式的列出子包。如果你要 setuptools 自动为你搜索包,你可以使用find_packages 函数:

  1. from setuptools import setup, find_packages
  2.  
  3. setup(
  4. ...
  5. packages=find_packages()
  6. )

大多数 setup 的参数可以望文生义,但是 include_package_datazip_safe 可能不容易理解。 include_package_data 告诉 setuptools 要搜索一个 MANIFEST.in 文件,把文件内容所匹配的所有条目作为包数据安装。可以通过使用这个参数分发 Python 模块的静态文件和模板(参见 分发资源 )。 zip_safe 标志可用于强制或防止创建 zip 压缩包。通常你不会想要把包安装为 zip 压缩文件,因为一些工具不支持压缩文件,而且压缩文件比较难以调试。

标记构建版本¶

区分发行版本和开发版本是有益的。添加一个 setup.cfg 文件来配置这些选项:

  1. [egg_info]
  2. tag_build = .dev
  3. tag_date = 1
  4.  
  5. [aliases]
  6. release = egg_info -Db ''

运行 python setup.py sdist 会创建一个带有” .dev “的开发包,并且当前的数据会添加到 flaskr-1.0.dev20160314.tar.gz 中。运行python setup.py release sdist 会一个发行包 flaskr-1.0.tar.gz 。只有一个版本。

分发资源¶

如果你尝试安装上文创建的包,你会发现诸如 statictemplates 之类的文件夹没有被安装。原因是 setuptools 不知道要为你添加哪些文件。你要做的是:在你的 setup.py 文件旁边创建一个MANIFEST.in 文件。这个文件列出了所有应当添加到 tar 压缩包的文件:

  1. recursive-include yourapplication/templates *
  2. recursive-include yourapplication/static *

不要忘了把 setup 函数的 include_package_data 参数设置为 True !否则即使把内容在 MANIFEST.in 文件中全部列出来也没有用。

声明依赖¶

依赖是在 install_requires 参数中声明的,这个参数是一个列表。列表中的每一项都是一个需要在安装时从 PyPI 获得的包。缺省情况下,总是会获得最新版本的包,但你可以指定最高版本和最低版本。示例:

  1. install_requires=[
  2. 'Flask>=0.2',
  3. 'SQLAlchemy>=0.6',
  4. 'BrokenPackage>=0.7,<=1.0'
  5. ]

前面提到,依赖包都从 PyPI 获得的。但是如果要从别的地方获得包怎么办呢?你只要还是按照上述方法写,然后提供一个可选地址列表就行了:

  1. dependency_links=['http://example.com/yourfiles']

请确保页面上有一个目录列表,且页面上的链接指向正确的 tar 压缩包。这样setuptools 就会找到文件了。如果你的包在公司内部网络上,请提供指向服务器的URL 。

安装 / 开发¶

要安装你的应用(理想情况下是安装到一个 virtualenv ),只要运行带install 参数的 setup.py 脚本就可以了。它会将你的应用安装到virtualenv 的 site-packages 文件夹下,同时下载并安装依赖:

  1. $ python setup.py install

如果你正开发这个包,同时也希望相关依赖被安装,那么可以使用 develop 来代替:

  1. $ python setup.py develop

这样做的好处是只安装一个指向 site-packages 的连接,而不是把数据复制到那里。这样在开发过程中就不必每次修改以后再运行 install 了。

原文: https://dormousehole.readthedocs.io/en/latest/patterns/distribute.html