使用 Setuptools 进行部署 — Flask 文档

来自菜鸟教程
Flask/docs/2.0.x/patterns/distribute
跳转至:导航、​搜索

使用 Setuptools 进行部署

Setuptools,是一个扩展库,常用来分发Python库和扩展。 它扩展了 Python 附带的基本模块安装系统 distutils,以支持各种更复杂的结构,使大型应用程序更易于分发:

  • 对依赖项的支持:库或应用程序可以声明它所依赖的其他库的列表,这些库将自动为您安装。
  • package registry:setuptools 在你的 Python 安装中注册你的包。 这使得可以从另一个包中查询一个包提供的信息。 这个系统最著名的特性是入口点支持,它允许一个包声明一个“入口点”,另一个包可以钩住它来扩展另一个包。
  • 安装管理器pip可以为你安装其他库。

Flask 本身以及您可以在 PyPI 上找到的所有库都随 setuptools 或 distutils 一起分发。

在这种情况下,我们假设您的应用程序名为 yourapplication.py,并且您使用的不是模块,而是包。 如果您尚未将应用程序转换为包,请转至 Large Applications as Packages 以了解如何完成此操作。

使用 setuptools 进行有效部署是进入更复杂和更自动化的部署场景的第一步。 如果您想完全自动化该过程,另请阅读 使用 Fabric 部署一章。

基本设置脚本

因为您安装了 Flask,所以您的系统上有可用的 setuptools。 Flask 已经依赖于 setuptools。

适用标准免责声明: 使用 virtualenv

您的设置代码始终会放入应用程序旁边名为 setup.py 的文件中。 文件名只是约定俗成,但因为每个人都会寻找具有该名称的文件,所以最好不要更改它。

Flask 应用程序的基本 setup.py 文件如下所示:

from setuptools import setup

setup(
    name='Your Application',
    version='1.0',
    long_description=__doc__,
    packages=['yourapplication'],
    include_package_data=True,
    zip_safe=False,
    install_requires=['Flask']
)

请记住,您必须明确列出子包。 如果你想让 setuptools 自动为你查找包,你可以使用 find_packages 函数:

from setuptools import setup, find_packages

setup(
    ...
    packages=find_packages()
)

setup 函数的大多数参数应该是不言自明的,include_package_datazip_safe 可能不是。 include_package_data 告诉 setuptools 查找 MANIFEST.in 文件并安装所有匹配的条目作为包数据。 我们将使用它来分发静态文件和模板以及 Python 模块(请参阅 分发资源 )。 zip_safe 标志可用于强制或阻止 zip 存档创建。 通常,您可能不希望将软件包安装为 zip 文件,因为某些工具不支持它们,并且它们使调试变得更加困难。


标记构建

区分发布版本和开发版本很有用。 添加 setup.cfg 文件以配置这些选项。

[egg_info]
tag_build = .dev
tag_date = 1

[aliases]
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 文件。 此文件列出了应添加到 tarball 中的所有文件:

recursive-include yourapplication/templates *
recursive-include yourapplication/static *

不要忘记,即使您在 MANIFEST.in 文件中登记它们,它们也不会为您安装,除非您将 setup 函数的 include_package_data 参数设置为True


声明依赖

依赖项在 install_requires 参数中声明为列表。 该列表中的每一项都是安装时应从 PyPI 中提取的包的名称。 默认情况下,它将始终使用最新版本,但您也可以提供最低和最高版本要求。 这里有一些例子:

install_requires=[
    'Flask>=0.2',
    'SQLAlchemy>=0.6',
    'BrokenPackage>=0.7,<=1.0'
]

如前所述,依赖项是从 PyPI 中提取的。 如果你想依赖一个在 PyPI 上找不到的包并且不会因为它是一个你不想与任何人共享的内部包怎么办? 就好像有一个 PyPI 条目一样,并提供 setuptools 应该在其中寻找 tarball 的替代位置列表:

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

确保该页面具有目录列表,并且页面上的链接指向具有正确文件名的实际 tarball,因为这是 setuptools 查找文件的方式。 如果您有包含软件包的内部公司服务器,请提供该服务器的 URL。


安装/开发

要安装您的应用程序(最好安装到 virtualenv),只需运行带有 install 参数的 setup.py 脚本。 它会将您的应用程序安装到 virtualenv 的 site-packages 文件夹中,并下载并安装所有依赖项:

$ python setup.py install

如果您在包上进行开发并且还希望安装要求,则可以使用 develop 命令代替:

$ python setup.py develop

这样做的好处是只需安装指向 site-packages 文件夹的链接,而不是复制数据。 然后,您可以继续处理代码,而无需在每次更改后再次运行 install