簡體   English   中英

Cabal 和 Stack 有什么區別?

[英]What is the difference between Cabal and Stack?

昨天我了解了一個名為Stack的新 Haskell 工具。 乍一看,它看起來與 Cabal 的工作大致相同。 那么,它們之間有什么區別呢? stack 是 Cabal 的替代品嗎? 在哪些情況下我應該使用 Stack 而不是 Cabal? Stack 可以做什么而 Cabal 不能?

stack 是 Cabal 的替代品嗎?

是和否。

在哪些情況下我應該使用 Stack 而不是 Cabal? Stack 可以做什么而 Cabal 不能?

默認情況下, Stack 使用精選的 stackage 包。 既然如此,任何依賴項都可以一起構建,從而避免版本沖突問題(當它們在 Haskell 體驗中司空見慣時,曾經被稱為“陰謀集團地獄”)。 最近版本的 Cabal 也有防止沖突的措施。 盡管如此,使用 Stack 設置一個可重現的構建配置,您可以確切地知道將從存儲庫中提取的內容。 請注意,還提供了使用非堆棧包的規定,因此即使堆棧快照中不存在包,您也可以繼續使用。

就個人而言,我喜歡 Stack,並會推薦每個 Haskell 開發人員使用它。 他們的發展很快 而且它有一個更好的UX。 Stack 做了一些 Cabal 還沒有提供的事情:

  • Stack 甚至會為您下載 GHC 並將其保存在一個孤立的位置。
  • Docker 支持(這對於部署您的 Haskell 應用程序非常方便)
  • 可重現的 Haskell 腳本:您可以確定包的版本,並可以保證它始終可以毫無問題地執行。 Cabal 也有一個腳本功能,但完全確保它的可重復性並不那么簡單。)
  • 能夠進行stack build --fast --file-watch 如果您更改當前的本地文件,這將自動重建。 將它與--pedantic選項一起使用對我來說是一個交易破壞者。
  • Stack 支持使用模板創建項目。 它還支持您自己的自定義模板。
  • Stack 內置了hpack支持。 它提供了另一種(IMO,更好的)使用 yaml 文件編寫 cabal 文件的方法,yaml 文件在行業中使用更廣泛。
  • Intero 使用 Stack 時體驗流暢。

有一篇很好的博客文章解釋了差異: 為什么 Stack 不是 Cabal? 盡管在那篇文章之后的幾年中,Cabal 不斷發展以克服那里討論的一些問題,但對 Stack 背后的設計目標和哲學的討論仍然具有相關性。

在下文中,我將比較的兩個工具稱為cabal-installstack 特別是,我將使用cabal-install來避免與Cabal庫混淆, Cabal庫是這兩種工具使用的通用基礎架構。

從廣義上講,我們可以說cabal-installstackCabal 的前端。 這兩種工具都可以構建 Haskell 項目,這些項目的依賴集可能在單個系統的范圍內相互沖突。 它們之間的主要區別在於它們如何實現這一目標:

  • 默認情況下,當要求構建項目時, cabal-install將查看其.cabal文件中指定的依賴項,並使用依賴項求解器找出一組滿足它的包和包版本。 這個集合是從Hackage整體中提取的——所有包和所有版本,過去和現在。 一旦找到可行的構建計划,所選版本的依賴項將被安裝並索引到~/.cabal某處的數據庫中。 通過根據版本(以及其他相關的配置選項)索引已安裝的包,避免依賴之間的版本沖突,這樣不同的項目就可以檢索他們需要的依賴版本,而不會相互踩踏。 這種安排就是cabal-install文檔中“Nix 風格的本地構建”的意思

  • 當被要求構建一個項目時, stack會查看 stack.yaml 的resolver字段,而不是去stack.yaml 在默認工作流中,該字段指定Stackage快照,它是具有已知相互兼容的固定版本的 Hackage 包的子集。 然后, stack將嘗試僅使用快照提供的內容來滿足.cabal文件(或可能project.yaml文件——不同格式,相同角色)中指定的依賴項。 從每個快照安裝的軟件包都注冊在不同的數據庫中,它們不會相互干擾。

我們可能會說堆棧方法在指定構建配置時犧牲了一些設置靈活性以換取簡單性。 特別是,如果你知道你的項目使用了 LTS 15.3 快照,你可以轉到它的 Stackage 頁面,一目了然地知道任何依賴堆棧的版本都可能從 Stackage 中提取。 也就是說,這兩種工具都提供了超出基本工作流程的功能,因此總的來說,每個工具都可以完成另一個工具所做的一切(盡管可能以不太方便的方式)。 例如,有一些方法可以凍結已知良好構建配置的確切版本,並使用cabal-install 解決舊 Hackage 狀態的依賴關系,並且可能需要非 Stackage 依賴關系或在使用stack 時覆蓋快照包版本

最后, cabal-installstack之間的另一個區別在本概述中非常值得一提,這是stack旨在提供完整的構建環境,具有自動 GHC 安裝管理Docker 集成等功能 相比之下, cabal-install旨在與生態系統的其他部分正交,因此它不會嘗試提供此類功能(特別是 GHC 版本必須單獨安裝和管理,無論是通過 Linux 發行版)包、Windows 中的Haskell 平台核心ghcup 工具)。

從我從 FAQ 中收集到的信息來看,Stack 似乎使用了 Cabal 庫,而不是cabal.exe二進制文件(更正確地稱為 cabal-install)。 看起來該項目的目標是自動沙箱和避免依賴地獄。

換句話說,它使用相同的 Cabal 包結構,只是提供了一個不同的前端來管理這些東西。 (我認為!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM