Masonite 的環境管理

環境

環境(environment)在不同的地方具有不同的涵義,如果沒搞清楚很容易混淆,以 Masonite 來說,至少有兩種環境的涵義。

  1. Python 的虛擬環境
  2. Masonite 自己的環境

Python 虛擬環境與 Masonite 本身無關,只是我們開發者因應一台電腦多專案的需求,避免專案的包互相影響而把每個專案隔離並且獨立管理專案包的機制,這樣的機制就是 Python 虛擬環境,常用的有 Python 自帶的 venvPipenvPoetry 等。

下文要開始談的是 Masonite 自己的環境,專案從無到有至少會有幾個階段:開發(development)、測試(testing)、上線(production),而且隨著專案的複雜度增加,會分的更細,例如多了 staging 或 pre-production 等等,這些階段可能都需要不同的配置,例如資料庫的連線帳密、只有假資料的資料庫等等不同的配置需求,Masonite 對這樣的需求有提供環境管理的方法,只要把環境檔配置好,Masonite 就會自行去對應目前環境下正確的配置,避免繁瑣又容易出錯工人智慧改設定檔大法。

.env

初期在建立專案時的 craft new project_name 指令,會建立出 Masonite 的專案資料夾與裡面的檔案和資料夾結構,其中會預帶一個 .env-example 的檔案內容如下:

APP_NAME=Masonite 2.2
APP_ENV=local
APP_DEBUG=True
AUTH_DRIVER=cookie
APP_URL=http://localhost:8000
KEY=your-secret-key

MAIL_DRIVER=terminal
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=

MAILGUN_SECRET=
MAILGUN_DOMAIN=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=masonite
DB_USERNAME=root
DB_PASSWORD=root
DB_LOG=True

STRIPE_CLIENT=
STRIPE_SECRET=

STORAGE_DRIVER=disk

S3_CLIENT=
S3_SECRET=
S3_BUCKET=

RACKSPACE_USERNAME=
RACKSPACE_SECRET=
RACKSPACE_CONTAINER=
RACKSPACE_REGION=

AZURE_NAME=
AZURE_SECRET=
AZURE_CONNECTION=
AZURE_CONTAINER=

QUEUE_DRIVER=async
QUEUE_USERNAME=
QUEUE_VHOST=
QUEUE_PASSWORD=
QUEUE_HOST=
QUEUE_PORT=
QUEUE_CHANNEL=

在之後的 craft install 則會幫我們把 .env-example 加上隨機產生的 KEY 之後再存成 .env 檔案,至此我們有了一個基本的 .env 環境檔。

Masonite 會在 bootstrap/start.py 裡面 呼叫 LoadEnvironment() 載入 .env 檔案,所謂的載入就是把這些配置寫入作業系統環境變數中。

取得環境變數

.env 的內容都變成作業系統環境變數之後,在 Masonite 專案內的可以使用 env() 來取得這些變數值:

from masonite import env

env('DB_PORT') # 3306
 

配置環境

.env 的第二行 APP_ENV=local,會令 Masonite 嘗試載入 .env.local,因此,只要自己創建 .env.local 並且把適當的配置寫進去,就會被正確的載入,如果 .env.local 與原本的 .env 有重複的定義的話,會以 .evn.local 的為主。

依此類推,只要自行定義出 .env.development、.env.production 等環境配置檔,並且在各自的環境下也對 .env 去定義要載入的環境檔,就可以正確的做好環境管理。

.env & .gitignore

.env 與其它自行建立的 .env.* 檔案裡面有 KEY、資料庫連線帳密等設定,務必不要上到 Git 去,應使用手動方式佈署到各環境的專案資料夾內。也因為不用上到 Git,每個環境的 .env 也因此不會被互相影響到,如果有異動的話還是要透過另外的機制與其它成員做更新。

唯一的例外是 .env.testing,這是用來跑單元測試用的環境,必須把 .env.testing 也加到 Git 中,其他的開發成員才可以順利的跑單元測試。

參考資料 

Masonite Documentation - Environments

 

Comments