我最近升级到Cabal 3.2(和GHC 8.10),我遇到了一些主要问题,这些问题使我的某些项目无法再构建...
这是最小(非)工作配置,每次都会失败:
我从干净的Cabal配置开始(删除~/.cabal
);原因将在后面的文章中出现。我运行cabal update
重新创建.cabal
目录并确保Cabal在工作。
我使用test1
创建一个项目(我们称其为cabal init
)。这是一个库项目,带有一个公开的模块(通常命名为Test1
),该模块导出一些伪函数foo
。我先运行cabal build
,然后运行cabal install --lib
;一切运行顺利,到目前为止一切顺利。
可以肯定的是,我离开了项目目录并启动了GHCi。我输入:m Test1
以加载我先前创建的模块,并且可以使用!我可以输入foo ...
并查看我的函数已执行。另外,我列出了~/.cabal/store/ghc-8.10.xxx
的内容,并看到test1-xxx
目录在其中。
然后我仍然使用test2
创建一个新项目cabal init
。这次,我将其配置为可执行文件,并添加test1
作为依赖项(使用build-depends
字段)。但是这次我运行cabal build
时遇到了一些问题:
~/projects/haskell/test2> cabal build
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] trying: test2-0.1.0.0 (user goal)
[__1] unknown package: test1 (dependency of test2)
[__1] fail (backjumping, conflict set: test1, test2)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: test2, test1
在我看来似乎找不到软件包test1
,但是我可以从GHCi(和GHC)访问它,并且它存在于~/.cabal/store
...
但是不幸的是还有更多。
test3
。这是一个库,除base
以外不依赖任何其他内容(因此,特别是不取决于test1
)。 lib公开了一个模块Test3
,并导出了一个函数bar
。我运行cabal build
,在这里没问题。但是,当我想用test3
安装cabal install --lib
时,会遇到一些错误:~/projects/haskell/test3> cabal install --lib
Wrote tarball sdist to
/home/<user>/projects/haskell/test3/dist-newstyle/sdist/test3-0.1.0.0.tar.gz
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] unknown package: test1 (user goal)
[__0] fail (backjumping, conflict set: test1)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: test1
尽管似乎已正确安装,但似乎找不到test1
;可能是这是test2
构建失败的遗留物,但是...
可以肯定的是,我启动了GHCi并输入:m Test3
,但是GHCi告诉我它找不到模块Test3
(甚至暗示这是一个错字,我的意思是Test1
),显示尽管test3
的构建成功,但确实没有安装...
好的,对于整个情况还有一个古怪之处:我再次使用cabal init
创建了一个新项目,称为test4
,它是一个可执行文件,(再次)除了base
以外,都不依赖任何其他内容。我保留了默认的Main.hs
(只显示“ Hello,Haskell!”)。我运行cabal build
:没问题。然后我运行cabal install
,...也没问题吗?我在随机位置运行test4
,它会启动可执行文件,并显示“ Hello,Haskell!”。在终端...
还有最后一件事:我走到某个随机位置,然后运行cabal install xxx --lib
,其中xxx
是Hackage上可用的库包(例如xml
),并且:
~> cabal install xml --lib
Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] unknown package: test1 (user goal)
[__0] fail (backjumping, conflict set: test1)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: test1
这是为什么我需要定期核对.cabal
的原因……现在我似乎处于某种陈旧状态,无法再安装任何库。
我正在运行Cabal 3.2.0.0和GHC 8.10.0.20200123。我从hvr / ghc PPA安装了它们,并确保计算机上的任何地方都没有其他版本的工具。
仅作说明,我正在运行Ubuntu 18.04.4 LTS(使用XFCE,因此确切地说是XUbuntu)。其他所有内容(好像是最新的)。
最后,关于我用于构建的*.cabal
文件,它们几乎是cabal init
生成的文件,除了在库的情况下我将executable xxx
切换为library
,而我只是添加了[ C0]字段,用于公开库的模块(因此exposed-modules
的Test1
和test1
的Test3
)。我还使用test3
中的build-depends
使项目依赖于test2
。除此之外,它们几乎保持不变。
我必须承认我是Cabal 3的新手;直到上周为止,我一直在使用Cabal 1(因为我从不费心更新它;是的,我知道这很糟糕)。使用Cabal 1,我没有任何问题,而且我完全能够从本地来源安装软件包并在其他项目中依赖它...
我觉得我做错了;也许我没有使用正确的Cabal命令?我在test1
和cabal new-build
的某处看到了一些内容,但至少在cabal new-install
和cabal build
上,似乎没有做更多的事情。我也想研究沙盒,但自Cabal版本2起,它似乎消失了。
也有可能是Cabal错误,但我在错误跟踪器上没有发现任何可能与我的问题有关的相关问题...
您对此有何看法?我究竟做错了什么?您是否看到任何替代或可能的修复方法?
非常感谢!