[英]stack.yaml file & .cabal file differences?
我最近開始為Haskell使用stack,為項目指定外部依賴項。 有時您將它放在.cabal文件中,而有時您將它放在.yaml文件中。
我是否正確地認為當您將其放入cabal文件時,它只會在堆棧存儲庫中查找您的包。 但是,當您將它放在.yaml文件中時,它還會在Hackage服務器中搜索,如果它無法在任何快照中找到它?
項目的所有依賴項都會進入.cabal
文件。 但是,你是正確的,有時你也會在stack.yaml
文件中列出包,這可以理解為令人困惑。 這是為什么?
好吧, .cabal
文件總是表示你對包的依賴,但是stack.yaml
文件有效地配置了這些包的來源 。 通常,在使用stack
,包來自Stackage,基於您在stack.yaml
文件中指定的解析程序 。 但是,Stackage不包含Hackage中的所有軟件包,並且不打算 - 當您需要在Stackage之外的軟件包時,您必須在stack.yaml
文件中指定它們。
為什么是這樣? 好吧,解析器會自動將兩個重要的信息耦合在一起:包名和包版本。 Stackage解析器提供(弱)保證單個解析器中的所有包可以一起工作,因此當包來自解析器時,無需手動選擇所需的版本。 相反,Stackage將為您決定。
當從Hackage拉包,你沒有這種奢侈,所以你需要指定使用的軟件包及其版本extra-deps
。 例如,您可能有這樣的事情:
extra-deps:
- crypto-pubkey-openssh-0.2.7
- data-bword-0.1
- data-dword-0.3
此條目具體確定應從Hackage而不是Stackage中提取哪些軟件包的版本。
構建應用程序時,這似乎有點多余 - 您也可以在.cabal
文件中指定版本約束,那么為什么要在stack.yaml
文件中復制它們呢? 但是,在構建庫時,區別更為重要: .cabal
文件表示庫的實際版本約束(如果有),但stack.yaml
文件精確指定了在本地開發時實際安裝的版本。
從這個意義上講, stack.yaml
文件的用途類似於其他軟件包管理器的Gemfile.lock
或npm-shrinkwrap.json
Gemfile.lock
文件,盡管責任並不像stack
那樣明確(部分原因是由於歷史原因) Haskell的包系統如何工作以及它過去遇到的一些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.