2013-03-27 40 views
2

我目前正在研究基於python的Google App Engine項目。具體來說,我使用Flask作爲應用程序。我想知道包含外部python模塊的可接受方法是什麼,特別是當涉及到存儲庫時。從我所知道的情況來看,包括其他人的代碼在我的存儲庫中是不好的形式,原因有幾個。但是,其他人將在同一個存儲庫上工作,所以我們應該使用相同的外部模塊來確保相同的結果。GAE - 包含外部python模塊而不將它們添加到存儲庫中?

具體來說,我需要在我的應用程序中包含Flask(及其依賴項)。與谷歌App Engine的做到這一點,最簡單的方法就是將它們扔到根級別:

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

什麼是在這樣的一個項目,這些外部模塊,使正確的方法是什麼?普遍的答案和我的個案特定的答案都是有用的。此外,任何其他相關的建議,將不勝感激。非常感謝。

+0

應用引擎不像Heroku的不安裝外部庫,但是你可以使用git子模塊的外部模塊。 – dusual

回答

3

儘管確實有可能將第三方庫作爲子模塊或來自外部存儲庫的符號鏈接包含進來,但實際上這不是一個好主意。下面是有關可能出問題兩種情況:

  1. 如果第三方庫的版本,打破功能的新版本,你將不得不要麼使所有必要的更改,以滿足新的需求或者乾脆找到以前的版本繼續工作並打破外部連接。通常,這種情況發生在接近截止日期時。

  2. 如果第三方庫發佈了一個新版本,並且您的一位同事升級並進行了所有必要的更改以支持新版本,那麼您的代碼將被打破,直到您升級爲止。

上述例子中,有很多依賴的大項目更加明顯和越來越多的人從長遠來看,加入該項目成爲一個巨大的問題!我可以拿出更多的例子,但我認爲你可以看到這一點。

您最好的選擇是將外部庫包含到您的存儲庫中,這也有一個好處,即您可以在沒有多少依賴關係的情況下在一臺新計算機上啓動並運行整個項目。 how to organize your third party libraries有許多方法,它們都需要與您的app.yaml文件包含在相同或更深層次。就像提到的@dragonx只包含核心庫代碼一樣。

同樣不要害怕將東西放入存儲庫導致空間不是今天的問題,這些庫通常不會更新,因此您的存儲庫大小不會隨着時間的推移變得太大。

由於您在Google App Engine上提到了Flask,因此您可以查看我的gae-init項目,在練習中您可以看到external libraries的組織結構。

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這樣的要求存儲庫。

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子模塊。在應用程序文件夾中,您有源代碼,並且可以鏈接到您的應用程序運行所需的相應文件。在這種情況下,another_dependency的實際代碼可能位於another_dependency/src文件夾中,而不是另一個依賴項的實際根目錄。這樣您就不需要在部署文件夾中包含不必要的文件,但仍然可以將整個庫保存在您的回購站中。

0

有兩個案例在谷歌應用程序引擎項目使用python第三方軟件包:

如果庫是supported runtime-provided third-party libraries of GAE部分

只需將其添加到您的應用程序之一。庫下YML文件

libraries: 
     - name: package_name 
      version: latest 

添加代碼

import pack_name 

有時你需要與

pip install package_name 

安裝軟件包確保您使用的是正確的解釋,通過使用

pip freeze 

您可以確保軟件包已成功安裝到正確的路徑。

否則,如果GAE 不支持你的資料庫,則需要手動下載並保存到本地根/ lib目錄下: 或通過GIT 或通過畫中畫(PIP安裝程序包-t路徑/到/你的/ lib目錄/ DIR)

之後,我們應該聲明lib目錄下的源代碼目錄中pycharm pycharm->首選項 - >項目結構 選擇lib目錄下,並將其標記爲源。
然後,導入它。

import pack_name 

注重的是,當你在做的導入,您選擇的本地路徑,而不是你的Python路徑。

通常,推薦使用requirements.txt文件,其中包含所有使用的軟件包名稱,然後pycharm將識別卸載的軟件包並建議您安裝它們。

好運

相關問題