使用安装工具部署

Setuptools ,是一个扩展库,通常用于分发Python库和扩展。它扩展了distutils,这是一个随python一起提供的基本模块安装系统,还支持各种更复杂的结构,使更大的应用程序更容易分发:

  • 支持依赖项: 库或应用程序可以声明它所依赖的其他库的列表,这些库将自动为您安装。

  • 程序包注册表: 安装工具在python安装中注册包。这使得可以从另一个包查询一个包提供的信息。这个系统最著名的特性是入口点支持,它允许一个包声明一个“入口点”,另一个包可以钩住这个“入口点”来扩展另一个包。

  • 安装管理器: pip 可以为您安装其他库。

Flask本身,以及在pypi上可以找到的所有库都是用setuptools或distutils分发的。

在这种情况下,我们假设您的应用程序被调用 yourapplication.py 你使用的不是模块,而是一个包。如果您尚未将应用程序转换为软件包,请转到 大型应用程序包 看看如何做到这一点。

使用SETUPTOOLS进行部署是进入更复杂、更自动化的部署场景的第一步。如果您想完全自动化流程,还可以阅读 使用结构部署 章。

基本设置脚本

因为安装了Flask,所以系统上有可用的设置工具。Flask已经依赖于安装工具。

标准免责声明适用: use a virtualenv .

您的设置代码总是进入名为 setup.py 在应用程序旁边。文件名只是惯例,但是因为每个人都会查找具有该名称的文件,所以最好不要更改它。

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

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 告诉安装工具查找 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 没有为您安装。原因是安装工具不知道要为您添加哪些文件。你应该做的是创造一个 MANIFEST.in 文件位于 setup.py 文件。此文件列出应添加到tarball的所有文件:

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

不要忘记,即使你将它们放在你的:file: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条目一样,并提供一个安装工具应该在其中查找tarballs的替代位置列表:

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

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

安装/开发

要安装应用程序(理想情况下安装到virtualenv中),只需运行 setup.py 脚本与 install 参数。它将把您的应用程序安装到virtualenv的site packages文件夹中,并下载和安装所有依赖项:

$ python setup.py install

如果您正在开发包,并且还希望安装需求,则可以使用 develop 改为命令::

$ python setup.py develop

这样做的好处是,只需安装指向站点包文件夹的链接,而不需要复制数据。然后您可以继续处理代码而不必运行 install 每次更换后都要再次更换。