簡體   English   中英

new-template.cabal和stack.yaml之間的區別

[英]Difference between new-template.cabal and stack.yaml

我想在我的新Haskell項目中使用reactive-banana 我之前從未使用過cabal-installstack 我使用stack new創建了一個目錄並在其中初始化了項目文件。 我現在看到目錄中有2個文件: new-template.cabalstack.yaml

如何設置依賴項並確保它們已下載和編譯?

起初,我試圖添加- reactive-banana-0.8.0.2stack.yamlextra-deps:但兩者stack buildstack solver沒有下載。 然后我在new-template.cabal添加了一個名為library的部分:

library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , reactive-banana >= 0.8
  default-language:    Haskell2010

每次我嘗試運行stack build ,它都會出現錯誤並建議在extra-deps:下將一些包添加到stack.yaml extra-deps:這發生了三次,直到最后安裝所有軟件包,並且我可以在stack ghci導入它們stack ghci REPL 。

所以我的問題是,使用stack的慣用方法是什么? 我應該使用這兩個文件中的哪一個來指定依賴項和其他項目元數據? 具有stack的普通Haskell開發人員的示例工作流程是什么?

使用stack我通常不會在.cabal文件中放置任何版本邊界。 我讓stack.yaml文件中的resolverextra-deps設置確定要選擇的軟件包版本。

這是一個stack.yaml文件,它stack.yaml了reactive-banana-0.8.1.2:

flags: {}
packages:
- '.'
extra-deps:
- reactive-banana-0.8.1.2
- psqueues-0.2.0.2
resolver: lts-2.17

在我的.cabal文件中我只有:

  build-depends:       base >= 4.7 && < 5, reactive-banana

reactive-banana版本由stack.yaml文件固定。

如果你想使用GHC 7.10將解析器更改為類似nightly-2015-06-17

我通過運行stack build並向stack.yaml文件添加缺少的依賴項來迭代地確定extra-deps ,直到滿足所有依賴項。

您只需要使用不在Stackage中的軟件包 (例如reactive-banana)。 許多常用的包都在Stackage中,它們的版本將由resolver設置決定。

在默認配置中,堆棧使用兩個包數據庫:集中的每用戶數據庫和特定於項目的數據庫數據庫。 集中式數據庫只從Stackage中提取軟件包, Hackage是Hackage的一個子集,具有已知的兼容軟件包,而您可以在項目特定的數據庫中放置您想要的任何內容。 您使用的所有程序包都必須位於cabal文件中,但不在Stackage上的程序包(也就是那些將轉到項目特定數據庫的程序包)也必須列在stack.yaml的extra-deps部分中。 reactive-banana不在Stackage上,所以你需要將它添加到stack.yaml ,如下所示:

# etc.
extra-deps:
- reactive-banana-0.8.1.2
# etc.

stack solver可以為您填寫stack.yaml中的額外依賴stack.yaml

暫無
暫無

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

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