2

我目前正在开发一个基于 python 的 Google App Engine 项目。具体来说,我将 Flask 用于应用程序。我想知道包含外部 python 模块的公认方法是什么,特别是在存储库中。据我所知,在我的存储库中包含其他人的代码是不好的形式,原因有几个。但是,其他人将在同一个存储库上工作,因此我们应该使用相同的外部模块来确保相同的结果。

具体来说,我需要在我的应用程序中包含 Flask(及其依赖项)。使用 Google App Engine 执行此操作的最简单方法是将它们放入根级别:

MyProject
    app.yaml
    main.py
    MyApp
    Flask
    ...

在这样的项目中引入这些外部模块的正确方法是什么?一个笼统的答案和一个针对我的案例的具体答案都会很有用。此外,任何其他相关建议将不胜感激。非常感谢。

4

4 回答 4

3

虽然确实可以将第三方库作为子模块或来自外部存储库的符号链接包含在内,但实际上这不是一个好主意。以下是可能出错的两种情况:

  1. 如果第三方库发布了破坏功能的新版本,您将不得不进行所有必要的更改以满足新要求,或者只是找到以前的版本以继续工作并中断外部连接。通常,当您非常接近最后期限时,就会发生这种情况。

  2. 如果第三方库发布了新版本,并且您的一位同事升级并进行了所有必要的更改以支持新版本,那么您这边的代码将被破坏,直到您也将升级。

上述示例在具有大量依赖项的大型项目中更为明显,并且随着越来越多的人长期加入该项目,这将成为一个大问题!我可以想出更多的例子,但我想你能明白这一点。

您最好的选择是将外部库包含到您的存储库中,这还有一个优势,即您可以让整个项目在没有很多依赖项的新机器上启动并运行。关于如何组织第三方库有很多方法,所有这些方法都需要包含在您的app.yaml文件中相同或更深的级别。正如@dragonx 提到的,只包含核心库代码。

也不要害怕将东西放入您的存储库,因为现在空间不是问题,这些库通常不会经常更新,因此您的存储库大小不会随着时间的推移变得太大。

由于您在 Google App Engine 上提到了 Flask,您可以查看我的gae-init项目,您可以在其中实际了解外部库的组织方式。

于 2013-03-27T11:21:55.407 回答
2

你实际上在这里问了两个问题。

  1. 如何在我的 GAE 项目中包含外部库?

你有正确的想法。无论您采用哪种方式,都必须以某种方式将 Flask 及其依赖项包含在 GAE 项目的根目录中。一种方法是直接将副本放在那里。

第二种方法是使用符号链接指向包含外部库的文件夹。我不确定 Flask,但通常外部存储库在子目录中包含实际的库代码 - 所以通常你不希望 GAE 应用程序中的存储库的根目录,而只是实际源代码的根目录。在这种情况下,更容易放置链接到源文件夹的符号链接。

  1. 如何在我的源代码库中管理外部库?

这是一个更难回答的问题,因为它取决于您使用的源代码控制工具。是的,您确实希望每个人都使用相同版本的外部库,并且它们应该以某种方式包含在您的源代码管理中。

如果您使用的是 git,git submodule那是要走的路。开始有点混乱,但它会完成工作。

我推荐一个看起来像这样的回购结构

repo/
    thirdparty/
        flask/
        other_dependency/
        another_dependency/
            README.TXT
            setup.py
            src/
    app/
        app.yaml
        your_source.py
        softlink_to_flask
        softlink_to_other_dependency
        softlink_to_another_dependency_src

在此示例中,您将外部库的源代码保存在第三方文件夹中。这些可能是 git 子模块。在 app 文件夹中,您有您的源代码,以及指向您的应用程序运行实际需要的适当文件的软链接。在这种情况下, another_dependency 的实际代码可能位于 another_dependency/src 文件夹中,而不是另一个依赖项的实际根目录。这样您就不需要在部署文件夹中包含不必要的文件,但您仍然可以将整个库保存在您的存储库中。

于 2013-03-27T06:25:16.110 回答
1

您不能只创建requirements.txt并将其放入 GAE。您的代码必须包含所有使用您的项目且不受 GAE 支持的纯 Python 库 ( https://developers.google.com/appengine/docs/python/tools/libraries27 )。

如果您查看 GAE 的烧瓶部署示例(http://flask.pocoo.org/docs/quickstart/#deploying-to-a-web-serverhttps://github.com/kamalgill/flask-appengine-template ) 您可以找到一些依赖项,例如flaskwerkzeug等等,所有这些依赖项都必须推送到 GAE 服务器。

所以我看到了三个解决方案:

  1. 使用本地要求进行本地开发并制作自定义构建功能,该功能将下载所有依赖项,与您的应用程序一起放置并上传到 GAE 服务器。

  2. 当您刚启动将所需库与您的应用程序一起放置的项目时,添加用于本地部署的工具(不要忘记.gitignore)。

  3. 使用类似git submodules需求存储库的东西。

于 2013-03-27T05:56:33.463 回答
0

在google app engine项目中使用python第三方包有两种情况:

如果您的库是GAE部分受支持的运行时提供的第三方库之一

只需将其添加到库下的 app.yml 文件中

  libraries:
        - name: package_name
          version: latest

添加您的代码

import pack_name

有时你需要安装包

pip install package_name

确保您使用正确的解释器,通过使用

pip freeze

您可以确保软件包已成功安装到正确的路径。

否则,如果 GAE不支持你的 library,你需要手动下载并保存在本地 root/Lib 目录下:或通过 GIT 或通过 pip (pip install package_name -t path/to/your/Lib/dir)

之后,我们应该在pycharm pycharm->preferences->Project Structure中将Lib目录声明为source dir 选择Lib目录并将其标记为source。
然后,导入它。

import pack_name

请注意,当您进行导入时,您选择的是本地路径而不是您的 python 路径。

一般来说,建议有 requirements.txt 文件,其中包含所有使用的包名称,然后 pycharm 将识别已卸载的包并建议您安装它们。

祝你好运

于 2016-06-30T15:52:57.887 回答