昨天我們談到了專案目錄結構,知道了專案隨著功能成長,必須有清楚的檔案配置,才能保持可維護性。但光有好的結構還不夠,因為專案要能順利執行,還需要「正確的環境」。
在 Python 世界中,環境的管理一向是個痛點:不同專案依賴不同版本的套件,甚至需要測試在不同 Python 版本下的相容性。如果沒有做好隔離,很容易陷入「環境地獄」。
這就是我們今天要介紹的重點:Hatch 的環境管理功能。
在昨天的專案結構範例中,如果直接用 python -m venv venv
建立虛擬環境,接下來就會出現這樣的流程:
venv/
source venv/bin/activate
或 .\venv\Scripts\activate
pip install ...
)requirements.txt
久而久之,每個專案的環境流程都不一樣,不只麻煩,還容易忘記該怎麼設定。
Hatch 則把這些步驟整合進 pyproject.toml
,讓「專案結構」和「環境設定」統一管理,這也是它工程化的一大優點。
在 Day 2 的時候,我們已經搶先提到過 Hatch,並且跟 venv
、conda
做了比較。但當時只是幫大家認識它的定位:一個「現代化的 Python 專案管理工具」。
經過 Day 4 的專案目錄結構介紹,我們已經有一個清晰的專案架構基礎。接下來,就要實際把 Hatch 用起來,看看它是如何幫我們建立與管理虛擬環境的。
如果你的專案已經有一份透過 Hatch 建立的 pyproject.toml
,那麼在本地端就能很容易建立虛擬環境並啟動專案。
這就像在 Java 世界裡,我們會透過 Maven 或 Gradle 來管理專案,pom.xml
/ settings.gradle
在那裡扮演核心角色,而在 Python 工程化中,pyproject.toml
就是扮演相同角色的關鍵設定檔。
只要在專案目錄下輸入以下指令,就能快速建立環境:
hatch env create
Hatch 會自動依照**pyproject.toml
**的設定來安裝依賴套件,完全不需要額外維護requirements.txt
。這也是 Hatch 比傳統venv
更工程化的一大差異。
Hatch 預設會建立一個叫做default的環境,並根據**pyproject.toml
**的設定來安裝必要套件。比起傳統venv這整個流程更直覺,也不用自己管理requirements.txt
。
如果你是第一次建置專案,可以使用我們在Day2所提過的方式,來建立**pyproject.toml
**,讓我們複習一下該如何透過Hatch建置一個新的專案,很簡單只要透過下列指令:
hatch new myproject
建立好環境後,有兩種方式使用它:
進入環境 shell
hatch shell
這會幫你打開一個新的 shell session,並自動載入環境,退出只要 exit
。
由下圖可以看到,我透過指令進入到了這個專案的虛擬環境
而我們可以透過,下列指令來確認我當前所在的虛擬環境是哪一個
echo $VIRTUAL_ENV
編譯後執行
# Step 1.
hatch build
# Step 2.
hatch run start
這樣Hatch會依照**pyproject.toml
**來幫你編譯你的檔案,然後產生為一個壓縮檔,再由Hatch的指令來幫你執行應用程式,如下圖。這樣不用手動啟動或切換環境,非常適合 CI/CD pipeline 或一次性指令。
在 pyproject.toml
中,我們可以定義多個環境。例如:
[tool.hatch.envs.dev]
dependencies = [
"black",
"ruff",
]
[tool.hatch.envs.test]
dependencies = [
"pytest",
]
然後就能分別建立它們:
hatch env create dev
hatch env create test
當執行完畢我們可以用下列語法檢查環境的建置
hatch env show
這會將當下所有環境的配置列出來
接下來要進入不同環境,只要指定名稱:
hatch shell dev
hatch shell test
如果某個環境不再需要,可以直接刪除:
hatch env remove dev
乾乾淨淨,不會留下一堆沒用的檔案。
在今天我們先熟悉使用Hatch來建置我們專案的虛擬環境,在往後的章節我們在工程化的過程中搭配Hatch工具,來節省掉我們在團隊協作或者相關的開發過程中的阻礙,來讓專案能更順暢地在不同人、不同環境之間協作與執行。
接下來,在 Day 6 我們會進一步介紹:如何用 Hatch 管理套件依賴,讓團隊所有人都能在相同設定下開發,避免「在我電腦能跑,在你電腦就掛掉」的窘境。