簡體   English   中英

stack.yaml文件和.cabal文件的區別?

[英]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.locknpm-shrinkwrap.json Gemfile.lock文件,盡管責任並不像stack那樣明確(部分原因是由於歷史原因) Haskell的包系統如何工作以及它過去遇到的一些問題。

暫無
暫無

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

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