pip + virtualenv + mod_wsgi

之前有寫過 pip & requirements file, 可以在開發 project 時可以寫好 requirements file, 在每當要 deploy 到新的機器的時候, 就可以直接透過一個 pip 指令, 把 deploy project 所需要的 dependencies 都給裝好。

virtualenv 這個工具, 可以讓你在同一台機器開發不同 project 時, 使用不同的 dependencies, 例如: 原本有舊的 project 使用的 django 版本是 0.96, 另外又有新的 project 需要用上 django 1.1。 然而舊的 project 用 django 1.1 一定掛的一踏糊塗, 所以這時候就可以透過 virtualenv 把這兩個 project 所需要的環境給區隔開來。 ( 通常使用 easy_install 或 pip 安裝套件的時候, 都會直接裝在 site wide 的 site-packages 裡。)

先來簡單介紹 virtualenv 的使用方法, 首先就是建立一個 virtual enviroment:
virtualenv PROJECT_ENV 會有下列訊息

New python executable in PROJECT_ENV/bin/python  
Installing setuptools............done. 完成之後會多一個叫做 PROJECT_ENV 的資料夾, 裡面會有基本的開發環境, 這個資料夾裡面會有三個目錄 

bin/  
include/  
lib/  
 接下來在 PROJECT_ENV 裡執行下列指令就可以進入這個虛擬的開發環境 

source bin/activate 不過我偏好加上  

--no-site-package 這個參數
virtualenv PROJECT_ENV –no-site-package 這個參數用來告訴 virtualenv 不使用 site wide 的 site-package, 也就是說, 如果原本系統就有裝了 django, mysql-python, 那麼在進入用

--no-site-package 這個參數所建立的 virtualenv 的時候, 就讀不到 django, mysql-python, 得在這個 virtualenv 在裝一遍, 但是我個人覺得這樣比較乾淨 (潔癖? XD)

基本上 virtualenv 就是提供虛擬開發環境, 可以避免套件版本不同的衝突。

而 pip 跟 virtualenv 就是好兄弟啦, 在透過 pip 安裝套件時, 就可以直接指定要安裝的 virtualenv, 像是:
pip install -E PROJECT_ENV -r requirements.txt 如果沒有已經存在的 virtual env 的話, 這個指令就會直接建立一個新的 virtual env ( 預設是

--no-site-package ), 然後把 requirements 都給裝進去。

或是已經在 PROJECT_ENV 裡的話, 就直接打 pip install -E . package-x.x

最後, 如果 www server 可以直接用 virtualenv 的話, 不是就很完美了嗎? :D

其實 modwsgi 2.0 之後的版本, 可以很方便的來使用 virtualenv, 如果你是 apache + modwsgi 的話 XD

只要在你的 wsgi file 加上這一段即可
import site
site.addsitedir(‘/var/django/PROJECT_ENV/lib/python2.5/site-packages’)

pip + virtualenv + mod_wsgi 真是個完美的組合壓 :D

PS. 補充一下 xdite 大大在 twitter 上提到 rails 在這塊的做法:

pip 的作用在 rails 裡面寫 config.gems 然後 rake gems:install 就有了。至於 virtrualenv 在 config/enviroments.rb 上面指定 RAILSGEMVERSION 就可以 XD

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!