我正在嘗試在 GHC 9.2.1 上安裝 aeson。我第一次跑了cabal install --allow-newer --lib aeson,在構建 attoparsec 時失敗了。事實證明,這個問題已經在他們的 Git repo 中修復了,但還沒有在 Hackage 上發布。然后,我執行了以下步驟以使用修復程式構建本地版本:
git clone https://github.com/haskell/attoparsec.git
cd attoparsec
cabal install --allow-newer --lib .
cd ..
那成功了,但是當我cabal install --allow-newer --lib aeson再次這樣做時,它再次嘗試從 Hackage 構建 attoparsec,因此再次失敗。我怎樣才能讓 cabal 使用我剛剛構建和安裝的東西?
uj5u.com熱心網友回復:
主要有兩種方法。
一種是創建一個cabal 專案,其中包括 attoparsec 的克隆版本和您正在處理的本地包(可能依賴于 aeson 的包)。它可以很簡單
packages: attoparsec yourpackage
事實上,您甚至不需要克隆 repo,您??可以使用該source-repository-package欄位來代替。
由于本地包始終優先于外部包,因此在決議依賴項時將選擇 repo 版本。
這種方法效果很好,但有一個缺點,即如果您在許多不同的專案中使用修補過的 attoparsec,則每次都必須參考并重新編譯它。
另一種方法是在您的機器中創建一個本地無索引包存盤庫,使其優先于標準 Hackage,并將 attoparsec 的sdist tarball放在那里。
您需要使用repository全域 cabal 配置的欄位宣告額外的包存盤庫(配置的路徑顯示在 的最后一行cabal help)。默認情況下,只有 Hackage:
repository hackage.haskell.org
url: http://hackage.haskell.org/
要使本地包存盤庫優先于 Hackage,您需要active-repositories在全域 Cabal 配置或cabal.project檔案中使用該欄位。
這種方法的好處是不需要創建 Cabal 專案,并且 attoparsec 的補丁版本只會編譯一次(就像來自 Hackage 一樣)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342913.html
上一篇:為什么我的并行代碼比沒有并行更慢
下一篇:Haskell的簡化函式
