<commit_before>.. _distribute-deployment:

部署和分发
=========================

`distribute`_ 的前身是 ``setuptools`` ，是一个通常用于分发
Python 库和扩展程序的外部库。它依赖于随 Python 预装的 ``distutils`` 库，
而后者则是一个基础的模块安装系统，这一安装系统也支持很多复杂的构造，使得
大型应用更易于分发。

- **支持依赖关系管理**: 一个库可以声明自己依赖哪些软件包，从而在安装这个
  模块的时候，自动将依赖的软件包也安装到您的计算机。
- **注册软件包**: setuptools 将您的包注册到您的安装的 Python 环境中。
  这使得您可以使一个包中的代码查询另一个包所提供的信息。这一系统最知名的
  特性就是对接口机制的支持，也就是说一个包可以声明自己的一个接口，从而允许
  其他的包通过这个接口对自己进行扩展。
- **安装包管理器**: `easy_install` 默认随 Python 安装，它可以用于为您安装其他
  的库。您也可以使用 `pip` 这个可能早晚会代替 `easy_install` 的包管理器，它能够
  完成安装软件包之外更多的任务。

而对于 Flask 自己，则所有您可以在 cheessshop 上找到的软件包，都随着 distribute 
分发管理器，或者更古老的 setuptools 和 distutils 分发。

在这里，我们假定您的应用名为 `yourapplication.py` ，而您没使用模块而是使用
:ref:`package <larger-applications>` 的结构来组织代码。分发带有标准模块的
代码不被 `distribute`_ 支持，所以我们不去管它。如果您还没有将您的应用转化为包的形式，
请参考前文 :ref:`larger-applications` 的内容查找如何做到这件事。

利用 distribute 完成一个有效的部署进行更复杂和更自动化的部署方案的第一步，
如果您使程序完全自动化，可以阅读 :ref:`fabric-deployment` 这一章。

基础的安装脚本
------------------

因为您运行着 Flask，您系统上要么安装有 setuptools，要么安装有 distribute。
如果您系统中真的没有这两样，或者担心其没有，这里有一个脚本可以用来安装它:
`distribute_setup.py` 。您只要下载并用 Python 解释器运行它即可。

考虑这些操作可能会有风险，因此建议您参考 :ref:`你最好使用 virtualenv
<virtualenv>` 一文。

您的安装代码将总是保存在与您应用同目录下的 `setup.py` 文件中。为文件
指定这一名称只是为了方便，不过一般来说每一个人自然而然的在程序目录下
寻找这个文件，所以您最好别改变它。

同时，即使您在使用 `distribute` ，您也会导入一个名为 `setuptools` 的包。
`distribute` 完全向下兼容 `setuptools` ，所以我们也使用这个名字来导入它。

一个基本的 Flask 应用的 `setup.py` 文件看起来像如下这样::
<commit_msg>fix patterns/distribute, by nomaka<commit_after>.. _distribute-deployment:

部署和分发
=========================

`distribute`_ 的前身是 ``setuptools`` ，是一个通常用于分发
Python 库和扩展程序的外部库。它依赖于随 Python 预装的 ``distutils`` 库，
而后者则是一个基础的模块安装系统，这一安装系统也支持很多复杂的构造，使得
大型应用更易于分发。

- **支持依赖关系管理**: 一个库可以声明自己依赖哪些软件包，从而在安装这个
  模块的时候，自动将依赖的软件包也安装到您的计算机。
- **注册软件包**: setuptools 将您的包注册到您的安装的 Python 环境中。
  这使得您可以使一个包中的代码查询另一个包所提供的信息。这一系统最知名的
  特性就是对接口机制的支持，也就是说一个包可以声明自己的一个接口，从而允许
  其他的包通过这个接口对自己进行扩展。
- **安装包管理器**: `easy_install` 默认随 Python 安装，它可以用于为您安装其他
  的库。您也可以使用 `pip` 这个可能早晚会代替 `easy_install` 的包管理器，它能够
  完成安装软件包之外更多的任务。

而对于 Flask 自己，则所有您可以在 cheessshop 上找到的软件包，都随着 distribute 
分发管理器，或者更古老的 setuptools 和 distutils 分发。

在这里，我们假定您的应用名为 `yourapplication.py` ，而您没使用模块而是使用
:ref:`package <larger-applications>` 的结构来组织代码。分发带有标准模块的
代码不被 `distribute`_ 支持，所以我们不去管它。如果您还没有将您的应用转化为包的形式，
请参考前文 :ref:`larger-applications` 的内容查找如何做到这件事。

利用 distribute 完成一个有效的部署进行更复杂和更自动化的部署方案的第一步，
如果您使程序完全自动化，可以阅读 :ref:`fabric-deployment` 这一章。

基础的安装脚本
------------------

因为你已经让 Flask 运行起来了，所以不管怎么说您的系统上应该会有 setuptools
或者d istribute，如果你没有这两样，不要害怕。这里帮你准备了一个脚本：
``distribute_setup.py`` 你只需要下载并用 Python 解释器运行它。

考虑这些操作可能会有风险，因此建议您参考 :ref:`你最好使用 virtualenv
<virtualenv>` 一文。

您的安装代码将总是保存在与您应用同目录下的 `setup.py` 文件中。为文件
指定这一名称只是为了方便，不过一般来说每一个人自然而然的在程序目录下
寻找这个文件，所以您最好别改变它。

同时，即使您在使用 `distribute` ，您也会导入一个名为 `setuptools` 的包。
`distribute` 完全向下兼容 `setuptools` ，所以我们也使用这个名字来导入它。

一个基本的 Flask 应用的 `setup.py` 文件看起来像如下这样::

{'fraction_non_alphanumeric': 0.12642487046632125, 'fraction_numerical': 0.0, 'mean_word_length': 7.829268292682927, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5251129', 'n_tokens_mistral': 2033, 'n_tokens_neox': 2311, 'n_words': 204}