安装像 `hackage-cli` 这样的 Haskell 程序
Installing a Haskell program like `hackage-cli`
我要安装这个程序
https://github.com/hackage-trustees/hackage-cli
这样做的简单方法是什么?
如果我尝试使用
在本地构建它
> cabal --version
cabal-install version 3.4.1.0
compiled using version 3.4.1.0 of the Cabal library)
我明白了
❯ cabal v1-build
Resolving dependencies...
Warning: solver failed to find a solution:
Could not resolve dependencies:
[__0] trying: hackage-cli-0.1.0.0 (user goal)
[__1] next goal: base (dependency of hackage-cli)
[__1] rejecting: base-4.15.1.0/installed-4.15.1.0 (conflict: hackage-cli =>
base>=4.10.0.0 && <4.13)
[__1] fail (backjumping, conflict set: base, hackage-cli)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: hackage-cli, base
Trying configure anyway.
Configuring hackage-cli-0.1.0.0...
cabal: Encountered missing or private dependencies:
Cabal >=2.4.1.0 && <2.5,
aeson >=1.4.2.0 && <2.1,
base >=4.10.0.0 && <4.13,
http-io-streams >=0.1.0.0 && <0.2,
io-streams >=1.5.0.1 && <1.6,
lens >=4.17 && <5.2,
netrc >=0.2.0.0 && <0.3,
optparse-applicative >=0.14 && <0.17,
process-extras >=0.7.4 && <0.8,
semigroups >=0.18.3 && <0.21,
stringsearch >=0.3.6 && <0.4,
tagsoup >=0.14 && <0.15,
tar >=0.5 && <0.6,
unordered-containers >=0.2.7 && <0.3,
zlib >=0.6.1 && <0.7
.
❯ cabal v2-build
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] trying: hackage-cli-0.1.0.0 (user goal)
[__1] next goal: base (dependency of hackage-cli)
[__1] rejecting: base-4.15.1.0/installed-4.15.1.0 (conflict: hackage-cli =>
base>=4.10.0.0 && <4.13)
[__1] skipping: base-4.16.0.0, base-4.15.1.0, base-4.15.0.0, base-4.14.3.0,
base-4.14.2.0, base-4.14.1.0, base-4.14.0.0, base-4.13.0.0 (has the same
characteristics that caused the previous version to fail: excluded by
constraint '>=4.10.0.0 && <4.13' from 'hackage-cli')
[__1] rejecting: base-4.12.0.0, base-4.11.1.0, base-4.11.0.0, base-4.10.1.0,
base-4.10.0.0, base-4.9.1.0, base-4.9.0.0, base-4.8.2.0, base-4.8.1.0,
base-4.8.0.0, base-4.7.0.2, base-4.7.0.1, base-4.7.0.0, base-4.6.0.1,
base-4.6.0.0, base-4.5.1.0, base-4.5.0.0, base-4.4.1.0, base-4.4.0.0,
base-4.3.1.0, base-4.3.0.0, base-4.2.0.2, base-4.2.0.1, base-4.2.0.0,
base-4.1.0.0, base-4.0.0.0, base-3.0.3.2, base-3.0.3.1 (constraint from
non-upgradeable package requires installed instance)
[__1] fail (backjumping, conflict set: base, hackage-cli)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: base, hackage-cli
.
❯ stack init
Looking for .cabal or package.yaml files to use to init the project.
Using cabal packages:
- ./
- fixtures/
Multiple .cabal files found in directory /Users/nrolland/clones/hackage-cli/fixtures/:
- SVGFonts.2.cabal
- SVGFonts.0.cabal
- SVGFonts.1.cabal
- deepseq.1.cabal
- tree-diff.1.cabal
- semigroups.2.cabal
- semigroups.0.cabal
- tree-diff.0.cabal
- deepseq.0.cabal
- semigroups.1.cabal
简答
解决方法如下。或者,您可以克隆自:
https://github.com/kabuhr/hackage-cli
获得 stack build
就绪版本。请注意,您可能需要在 stack build
.
之前 apt install libbrotli-dev
或类似的
长答案
在这里,stack init
被 fixtures
子目录中的一些额外 .cabal
文件所欺骗。您可以通过 运行ning stack init --ignore-subdirs
来解决这个问题。这最终选择了解析器 lts-14.27
但随后失败,因为 http-io-streams
不在 Stackage:
Selected resolver: https://raw.githubusercontent.com/
commercialhaskell/stackage-snapshots/master/lts/14/27.yaml
Resolver 'https://raw.githubusercontent.com/commercialhaskell/
stackage-snapshots/master/lts/14/27.yaml' does not have all
the packages to match your requirements.
http-io-streams not found
- hackage-cli requires ^>=0.1.0.0
你可以运行:
stack init --resolver lts-14.27 --ignore-subdirs --omit-packages
无论如何都要生成一个stack.yaml
,然后为http-io-streams
和它依赖的任何东西添加一些extra-deps
。经过一番摆弄,我想出了以下 stack.yaml
:
resolver: lts-14.27
packages:
- .
extra-deps:
- http-io-streams-0.1.2.0
- brotli-streams-0.0.0.0
- brotli-0.0.0.0
需要一个额外的补丁,因为支持早于 2.0.0.0 的 aeson
版本的代码已损坏。应用以下补丁:
diff --git a/src/IndexShaSum.hs b/src/IndexShaSum.hs
index 0296dff..bdfc4df 100644
--- a/src/IndexShaSum.hs
+++ b/src/IndexShaSum.hs
@@ -35,14 +35,15 @@ import Data.Semigroup ((<>))
#if MIN_VERSION_aeson(2,0,0)
import qualified Data.Aeson.Key as Key
import qualified Data.Aeson.KeyMap as KeyMap
+type Key = J.Key
-keyToText :: J.Key -> Text
+keyToText :: Key -> Text
keyToText = Key.toText
#else
import qualified Data.HashMap.Strict as KeyMap
type Key = Text
-keyToText :: J.Key -> Text
+keyToText :: Key -> Text
keyToText = id
#endif
@@ -139,7 +140,7 @@ decodePkgJsonFile bs = do
go2 m = forM (KeyMap.toList m) $ \(k,v) -> do
J.withObject ".targets{}" (go3 k) v
- go3 :: J.Key -> J.Object -> J.Parser (ByteString, ByteString)
+ go3 :: Key -> J.Object -> J.Parser (ByteString, ByteString)
go3 k o = do
hashes <- o J..: "hashes"
sh256 <- hashes J..: "sha256"
应用该补丁并安装 stack.yaml
后,您应该可以 运行 stack build
。如果您在构建软件包 brotli
时遇到错误,您可能需要安装 brotli
库的开发文件(例如,apt install libbrotli-dev
在 Debian 版本上)。
我要安装这个程序
https://github.com/hackage-trustees/hackage-cli
这样做的简单方法是什么?
如果我尝试使用
在本地构建它> cabal --version
cabal-install version 3.4.1.0
compiled using version 3.4.1.0 of the Cabal library)
我明白了
❯ cabal v1-build
Resolving dependencies...
Warning: solver failed to find a solution:
Could not resolve dependencies:
[__0] trying: hackage-cli-0.1.0.0 (user goal)
[__1] next goal: base (dependency of hackage-cli)
[__1] rejecting: base-4.15.1.0/installed-4.15.1.0 (conflict: hackage-cli =>
base>=4.10.0.0 && <4.13)
[__1] fail (backjumping, conflict set: base, hackage-cli)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: hackage-cli, base
Trying configure anyway.
Configuring hackage-cli-0.1.0.0...
cabal: Encountered missing or private dependencies:
Cabal >=2.4.1.0 && <2.5,
aeson >=1.4.2.0 && <2.1,
base >=4.10.0.0 && <4.13,
http-io-streams >=0.1.0.0 && <0.2,
io-streams >=1.5.0.1 && <1.6,
lens >=4.17 && <5.2,
netrc >=0.2.0.0 && <0.3,
optparse-applicative >=0.14 && <0.17,
process-extras >=0.7.4 && <0.8,
semigroups >=0.18.3 && <0.21,
stringsearch >=0.3.6 && <0.4,
tagsoup >=0.14 && <0.15,
tar >=0.5 && <0.6,
unordered-containers >=0.2.7 && <0.3,
zlib >=0.6.1 && <0.7
.
❯ cabal v2-build
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] trying: hackage-cli-0.1.0.0 (user goal)
[__1] next goal: base (dependency of hackage-cli)
[__1] rejecting: base-4.15.1.0/installed-4.15.1.0 (conflict: hackage-cli =>
base>=4.10.0.0 && <4.13)
[__1] skipping: base-4.16.0.0, base-4.15.1.0, base-4.15.0.0, base-4.14.3.0,
base-4.14.2.0, base-4.14.1.0, base-4.14.0.0, base-4.13.0.0 (has the same
characteristics that caused the previous version to fail: excluded by
constraint '>=4.10.0.0 && <4.13' from 'hackage-cli')
[__1] rejecting: base-4.12.0.0, base-4.11.1.0, base-4.11.0.0, base-4.10.1.0,
base-4.10.0.0, base-4.9.1.0, base-4.9.0.0, base-4.8.2.0, base-4.8.1.0,
base-4.8.0.0, base-4.7.0.2, base-4.7.0.1, base-4.7.0.0, base-4.6.0.1,
base-4.6.0.0, base-4.5.1.0, base-4.5.0.0, base-4.4.1.0, base-4.4.0.0,
base-4.3.1.0, base-4.3.0.0, base-4.2.0.2, base-4.2.0.1, base-4.2.0.0,
base-4.1.0.0, base-4.0.0.0, base-3.0.3.2, base-3.0.3.1 (constraint from
non-upgradeable package requires installed instance)
[__1] fail (backjumping, conflict set: base, hackage-cli)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: base, hackage-cli
.
❯ stack init
Looking for .cabal or package.yaml files to use to init the project.
Using cabal packages:
- ./
- fixtures/
Multiple .cabal files found in directory /Users/nrolland/clones/hackage-cli/fixtures/:
- SVGFonts.2.cabal
- SVGFonts.0.cabal
- SVGFonts.1.cabal
- deepseq.1.cabal
- tree-diff.1.cabal
- semigroups.2.cabal
- semigroups.0.cabal
- tree-diff.0.cabal
- deepseq.0.cabal
- semigroups.1.cabal
简答
解决方法如下。或者,您可以克隆自:
https://github.com/kabuhr/hackage-cli
获得 stack build
就绪版本。请注意,您可能需要在 stack build
.
apt install libbrotli-dev
或类似的
长答案
在这里,stack init
被 fixtures
子目录中的一些额外 .cabal
文件所欺骗。您可以通过 运行ning stack init --ignore-subdirs
来解决这个问题。这最终选择了解析器 lts-14.27
但随后失败,因为 http-io-streams
不在 Stackage:
Selected resolver: https://raw.githubusercontent.com/
commercialhaskell/stackage-snapshots/master/lts/14/27.yaml
Resolver 'https://raw.githubusercontent.com/commercialhaskell/
stackage-snapshots/master/lts/14/27.yaml' does not have all
the packages to match your requirements.
http-io-streams not found
- hackage-cli requires ^>=0.1.0.0
你可以运行:
stack init --resolver lts-14.27 --ignore-subdirs --omit-packages
无论如何都要生成一个stack.yaml
,然后为http-io-streams
和它依赖的任何东西添加一些extra-deps
。经过一番摆弄,我想出了以下 stack.yaml
:
resolver: lts-14.27
packages:
- .
extra-deps:
- http-io-streams-0.1.2.0
- brotli-streams-0.0.0.0
- brotli-0.0.0.0
需要一个额外的补丁,因为支持早于 2.0.0.0 的 aeson
版本的代码已损坏。应用以下补丁:
diff --git a/src/IndexShaSum.hs b/src/IndexShaSum.hs
index 0296dff..bdfc4df 100644
--- a/src/IndexShaSum.hs
+++ b/src/IndexShaSum.hs
@@ -35,14 +35,15 @@ import Data.Semigroup ((<>))
#if MIN_VERSION_aeson(2,0,0)
import qualified Data.Aeson.Key as Key
import qualified Data.Aeson.KeyMap as KeyMap
+type Key = J.Key
-keyToText :: J.Key -> Text
+keyToText :: Key -> Text
keyToText = Key.toText
#else
import qualified Data.HashMap.Strict as KeyMap
type Key = Text
-keyToText :: J.Key -> Text
+keyToText :: Key -> Text
keyToText = id
#endif
@@ -139,7 +140,7 @@ decodePkgJsonFile bs = do
go2 m = forM (KeyMap.toList m) $ \(k,v) -> do
J.withObject ".targets{}" (go3 k) v
- go3 :: J.Key -> J.Object -> J.Parser (ByteString, ByteString)
+ go3 :: Key -> J.Object -> J.Parser (ByteString, ByteString)
go3 k o = do
hashes <- o J..: "hashes"
sh256 <- hashes J..: "sha256"
应用该补丁并安装 stack.yaml
后,您应该可以 运行 stack build
。如果您在构建软件包 brotli
时遇到错误,您可能需要安装 brotli
库的开发文件(例如,apt install libbrotli-dev
在 Debian 版本上)。