Python鎖檔新時代:認識Lock Files演變與開發環境管理改變

Published on: | Last updated:

今天要來聊聊一個 Python 開發圈醞釀很久的大事。說大事可能有點誇張,但對於每天在處理套件、環境、還有那句「為什麼在我電腦上可以跑,在你那就不行?」的開發者來說,這件事,真的很重要。

如果你寫 Python 一段時間,你一定懂那個痛。專案交接,`requirements.txt` 裡面只有一層套件,鬼才知道底下的依賴是哪個版本。A 專案用 Poetry,B 專案用 Pipenv,光是搞懂要用哪個指令安裝就頭痛。這種混亂,老實說,一直是 Python 被詬病的地方。

不過呢,這一切可能要畫上句點了。Python 社群終於下定決心要解決這個「百年爛帳」。

重點一句話

Python 終於要有一個統一的 lock file 格式了,叫做 `pylock.toml`。這東西是透過一個叫 **PEP 751** 的提案定下來的,目標是讓所有套件管理工具(像 pip, Poetry, Pipenv)有個共同語言,以後不用再為不同專案的不同鎖檔格式煩惱了。

這到底在吵什麼?用案例看懂依賴地獄

在深入 `pylock.toml` 之前,我們先退一步,看看現在的狀況有多亂。你今天開一個新專案,會怎麼管理套件?大概是下面幾種情況:

  • 傳統派: 就用 `pip` 配 `requirements.txt` 啊。簡單暴力,一個 `pip freeze > requirements.txt` 就搞定。但問題是,這份文件是平的,你根本看不出來 `requests` 為什麼會順便安裝了 `urllib3` 的 `2.2.2` 版。當依賴關係一複雜,這就變成一個黑盒子。
  • Poetry 擁護者: 用 Poetry!它有 `poetry.lock`,一個結構化的 TOML 檔案,清清楚楚記錄了整個依賴樹。很棒,真的很棒。但問題是,你的同事如果沒用 Poetry,他看到這個 lock 檔可能也不知道怎麼辦。你就得叫他去裝 Poetry。
  • Pipenv 愛好者: 跟 Poetry 類似,Pipenv 也有自己的 `Pipfile.lock`。功能也強大,但同樣地,它也創造了自己的小生態圈。
  • Conda 資料科學家: 啊我們都用 Conda。它的 `conda-lock` 又是另一個世界了,用的是 YAML 格式,而且主要處理 Conda 自己管道的套件。

你看,這就像方言一樣。大家說的都是 Python,但每個工具的「口音」都不一樣。你要從 Poetry 專案換到 Pipenv 專案,就需要一個「翻譯」,常常還翻不好。這就是 PEP 751 想要解決的核心問題:終結這場持續多年的「巴別塔之亂」。

Python 依賴管理的演進:從混亂到統一
Python 依賴管理的演進:從混亂到統一

新的 `pylock.toml` 到底長怎樣?

好,說了這麼多,這個新的 `pylock.toml` 到底有什麼了不起?它的設計理念不是要幹掉 Poetry 或 Pipenv,正好相反,它是要做它們之間的橋樑。

一個 lock file 最重要的任務就是「鎖定」。它要像拍立得一樣,把當下環境所有套件的確切版本、從哪裡來的、甚至檔案的 hash 值都清清楚楚地拍下來。這樣,不管誰拿到這份「照片」,都能 100% 重現一模一樣的環境。

一個極簡的 `pylock.toml` 可能會像這樣:

# 這是一個 TOML 檔案,可讀性還不錯
[metadata]
generated-by = "pip"
requires-python = ">=3.9"

# 每個套件都是一個獨立的 [[package]] 區塊
[[package]]
name = "requests"
version = "2.32.3"
source = "pypi"  # 標明從哪來的,通常是 PyPI

[[package]]
name = "urllib3"
version = "2.2.2"
source = "pypi"
# 未來這裡還可以加上 hash 值之類的,確保安全性

看到關鍵了嗎?它就是一個非常單純、結構化的「套件清單」。沒有太多花俏的東西。這個設計的用意就是讓機器解析起來毫不費力,同時人眼也看得懂。它不像 `requirements.txt` 那麼陽春,也不像某些工具的 lock 檔那麼複雜。

我自己是覺得,這點跟其他成熟的生態系總算看齊了。你看 Node.js 早就有 `package-lock.json`,Rust 有 `Cargo.lock`,Go 也有 `go.sum`。這些生態系早就明白,一個統一的、工具無關的 lock file 是合作的基礎。Python 這次,算是... 嗯,晚了點,但總算跟上了。

pylock.toml 檔案結構示意
pylock.toml 檔案結構示意

不同 Lock File 格式,到底差在哪?

說到這,可能有人會問,啊 `poetry.lock` 不也是 TOML 格式嗎?它跟 `pylock.toml` 差在哪?我們來做個簡單的比較,用比較口語的方式聊聊它們的「個性」。

格式 我的主觀評價 優點 缺點
requirements.txt 元老級,像個只會記帳的老先生。 超簡單,沒有學習成本。幾乎所有環境都認得它。 資訊太少!根本是依賴地獄的溫床。不知道子依賴是哪來的,版本衝突時超難 debug。
Pipfile.lock Pipenv 的專屬管家,有點潔癖。 結構化,有 hash,安全性高。把開發和正式環境的依賴分開,概念不錯。 綁定 Pipenv 生態。如果你團隊有人不想用 Pipenv,這檔案就變廢紙了。
poetry.lock Poetry 的智慧大腦,聰明但有點囉唆。 極度詳細,完整記錄依賴圖譜。解析速度也很快。 檔案可以變得非~常~大!而且,沒錯,你還是被綁在 Poetry 的世界裡。
pylock.toml (新標準) 世界的希望?像個能說多國語言的外交官。 目標是成為「通用格式」。Poetry 可以生成它,pip 可以用它來安裝。實現工具解耦。 還是個嬰兒。工具支援度還不夠,而且「理想」跟「現實」的差距... 嗯,有待觀察。

簡單講,`pylock.toml` 的野心不是要比誰的功能強,而是要當那個「共通的標準」。讓大家有得談,而不是各說各話。

反例與誤解釐清

每次有新標準出來,總會有些誤解或過度樂觀的期待。我覺得有幾點要先釐清:

  1. 「有了 `pylock.toml`,Poetry 和 Pipenv 就要被淘汰了?」
    完全錯誤。恰恰相反。`pylock.toml` 的目標是讓這些工具變得「更強大」。你可以繼續用 Poetry 舒服地管理專案、解析複雜的依賴,然後用 `poetry export --format pylock` (這指令是假設的) 輸出一份標準的 `pylock.toml` 給 CI/CD 流程或是不用 Poetry 的同事。工具的「使用者體驗」和「標準化產出」是兩回事。
  2. 「這代表以後再也不會有版本衝突了?」
    想得美。標準化的是「檔案格式」,不是「解析演算法」。Poetry 和 pip 在處理某些邊界情況(例如 optional dependencies 或 environment markers)時,解析邏輯可能還是會有些微差異。所以,理論上還是可能發生「A 工具鎖的版本,B 工具裝不起來」的狀況。這會是未來工具開發者需要磨合的挑戰。
  3. 「這對我們在台灣的小團隊有影響嗎?」
    影響可大了。說真的,我在台灣看過不少團隊,特別是一些傳產或硬體廠的軟體部門,他們對 Python 的用法還停留在比較... 呃,狂野的階段。很多人可能還在手動管理 `requirements.txt`,甚至根本沒有 lock 的概念。這個新標準的出現,是一個很好的機會去教育和導入現代化的 Python 開發流程。它提供了一個更低的門檻,讓大家知道「喔,原來有個標準方法可以確保環境一致」。這點跟美國或歐洲那些大型軟體公司已經習以為常的 DevOps 文化相比,對我們來說反而是個迎頭趕上的契機。PyPA (Python Packaging Authority) 推出這個,就是希望大家能把心力花在寫 code 上,而不是吵工具。

那...會有什麼挑戰?

理想很豐滿,但現實總是骨感的。推行一個新標準,一定會遇到麻煩。

第一個就是剛剛提到的,不同工具解析邏輯的細微差異。這需要時間去磨合,甚至可能需要 PEP 本身再出補充說明來定義這些行為。

第二個是... Git merge conflict。天啊,這絕對會是個惡夢。`poetry.lock` 已經夠讓人頭痛了,當兩個 branch 同時更新了依賴,那個 merge conflict 解起來真的會讓人想砸電腦。`pylock.toml` 如果檔案一大,這個問題只會一模一樣地發生。希望未來 IDE 或 Git 工具能提供更智慧的輔助,不然... 保重。

合併 Lock File 時的開發者惡夢
合併 Lock File 時的開發者惡夢

再來就是遷移成本。雖然理想上會有轉換工具,例如 `pip lock --generate pylock.toml` 這種指令,但大型、陳舊的專案要轉過來,肯定會踩到一堆坑。這需要時間,而且在過渡期,我們可能會看到一個專案裡同時存在 `poetry.lock` 和 `pylock.toml` 的尷尬情況。

不過,我自己是覺得這些都是必經之痛啦。為了長遠的健康生態,短期的陣痛是值得的。能夠讓 CI 系統、安全掃描工具、IDE 都看同一份檔案,光想就覺得省事很多。尤其是安全掃描,有一個標準格式,工具就能更準確地抓出有漏洞的套件,對整個供應鏈安全是大利多。

所以,總結來說,PEP 751 和 `pylock.toml` 的出現,不是一個小小的語法更新。它代表 Python 社群終於願意正視這個存在已久的痛點,並朝著更成熟、更工程化的方向邁進。這一步雖然慢了,但絕對是正確的一步。

那你呢?

你現在的專案是用什麼工具管理 Python 依賴?對於 `pylock.toml` 這個新標準,你是感到興奮,還是有點擔心遷移的麻煩?在下面留言分享你的看法吧!

Related to this topic:

Comments