2

私は現在、PythonベースのGoogleAppEngineプロジェクトに取り組んでいます。具体的には、アプリケーションにFlaskを使用しています。特にリポジトリに関しては、外部のpythonモジュールを含めるために受け入れられている方法は何でしょうか。私の知る限り、私のリポジトリに他の人のコードを含めることは、いくつかの理由で悪い形式です。ただし、他の人が同じリポジトリで作業するため、同じ結果を保証するには、同じ外部モジュールを使用する必要があります。

具体的には、Flask(およびその依存関係)をアプリケーションに含める必要があります。Google App Engineでこれを行う最も簡単な方法は、ルートレベルにそれらをスローすることです。

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

そのようなプロジェクトにこれらの外部モジュールを導入する適切な方法は何ですか?一般化された答えと私の場合に固有の答えの両方が役に立ちます。また、他の関連する推奨事項をいただければ幸いです。どうもありがとうございました。

4

4 に答える 4

3

サードパーティのライブラリを外部リポジトリからのサブモジュールまたはシンボリックリンクとして含めることは確かに可能ですが、実際にはそれは良い考えではありません。何がうまくいかないかについての2つのシナリオを次に示します。

  1. サードパーティのライブラリが機能を破壊する新しいバージョンをリリースした場合、新しい要件を満たすために必要なすべての変更を行うか、単に以前のバージョンを見つけて機能を継続し、外部接続を切断する必要があります。通常、これは締め切りに非常に近いときに発生します。

  2. サードパーティのライブラリが新しいバージョンをリリースし、同僚の1人がアップグレードされ、新しいバージョンをサポートするために必要なすべての変更が加えられた場合、アップグレードするまでコードが壊れます。

上記の例は、依存関係が多い大規模なプロジェクトでより顕著になり、長期的にプロジェクトに参加する人が増えると、大きな問題になります。もっと例を考え出すこともできますが、要点はお分かりいただけると思います。

最善のオプションは、外部ライブラリをリポジトリに含めることです。これには、多くの依存関係なしにプロジェクト全体を新しいマシンで稼働させることができるという利点もあります。サードパーティのライブラリを整理する方法はたくさんあり、それらすべてをファイルと同じレベルまたはより深いレベルに含める必要がありapp.yamlます。@dragonxが言及したように、コアライブラリコードのみが含まれます。

また、リポジトリに何かを入れることを恐れないでください。スペースは今日の問題ではなく、これらのライブラリは通常それほど頻繁に更新されないため、リポジトリのサイズが時間の経過とともに大きくなりすぎることはありません。

Google App EngineでFlaskについて言及したので、私のgae-initプロジェクトをチェックしてください。ここでは、外部ライブラリがどのように編成されているかを実際に確認できます。

于 2013-03-27T11:21:55.407 に答える
2

ここでは実際に2つの質問をしています。

  1. GAEプロジェクトに外部ライブラリを含めるにはどうすればよいですか?

あなたは正しい考えを持っています。どのように進めても、GAEプロジェクトのルートにFlaskとその依存関係を含める必要があります。1つの方法は、そこに直接コピーを置くことです。

2番目の方法は、外部ライブラリを含むフォルダへのシンボリックリンクを使用することです。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-serverおよびhttps://github.com/kamalgill/flask-appengine-templateflask ) 、などのようないくつかの依存関係を見つけることができwerkzeug、このすべての依存関係をGAEサーバーにプッシュする必要があります。

だから私は3つの解決策を見ます:

  1. ローカル開発にローカル要件を使用し、すべての依存関係をダウンロードし、アプリケーションに追加してGAEサーバーにアップロードするカスタムビルド関数を作成します。

  2. アプリケーションに必要なライブラリを配置するプロジェクトを開始するときに、ローカル展開用のツールを追加します(忘れないでください.gitignore)。

  3. git submodules要件リポジトリのようなものを使用します。

于 2013-03-27T05:56:33.463 に答える
0

GoogleAppEngineプロジェクトでPythonサードパーティパッケージを使用する場合は2つあります。

ライブラリが、GAEセクションでサポートされているランタイム提供のサードパーティライブラリの1つである場合

ライブラリの下のapp.ymlファイルに追加するだけです

  libraries:
        - name: package_name
          version: latest

コードを追加する

import pack_name

時々あなたはパッケージをインストールする必要があります

pip install package_name

を使用して、適切なインタプリタを使用していることを確認してください

pip freeze

パッケージが正しいパスに正常にインストールされていることを確認できます。

それ以外の場合、GAEがライブラリをサポートしていない場合は、手動でダウンロードして、root / Libディレクトリにローカルに保存する必要があります。またはGITまたはpip(pip install package_name -t path / to / your / Lib / dir)を使用します。

その後、pycharmでLibディレクトリをソースディレクトリとして宣言する必要があります 。pycharm-> Preferences-> Project Structure Libディレクトリを選択し、ソースとしてマークします。
次に、それをインポートします。

import pack_name

インポートを行うときは、Pythonパスではなく、ローカルパスを選択することに注意してください。

一般に、使用されているすべてのパッケージ名を含むrequirements.txtファイルを用意することをお勧めします。そうすると、pycharmはアンインストールされたパッケージを認識し、それらをインストールするように提案します。

幸運を

于 2016-06-30T15:52:57.887 に答える