用例是我很难测试使用 Xmobar
0.47.4
¹ 提交的修复。
我认为原因是我的
.cabal
文件
executable xmobar
build-depends: base
, xmobar
导致拾取
0.47.3
,我认为因为这是目前存储库中最高的标签。确实,
>= 0.47.3
附加到上面最后一行,cabal build
工作,> 0.47.3
,则 cabal build
会失败,因为没有版本满足约束。现在,我显然可以问作者“你也可以推送标签吗?” (假设这足以让
cabal build
找到新版本),但我想以此困难为契机,进一步了解 Cabal。
我可以表达对在线存储库中特定提交的依赖吗?
这将允许我使用未附加标签或不在主分支上的最新更改。
更好的是,我可以表达“图书馆不在线,但在
/home/me/where/I/downloaded/the/repo
”
更好的是,这将使我能够轻松测试对其他人存储库的本地更改。
(1) 当使用 xmobar 作为库时并围绕它使用 cabal 项目以允许 与 xmonad 无缝集成(即重新编译一个会重新编译另一个,重新编译时会选择更改任一 .hs 配置,等等;请参阅此处了解更多详情)。如果我放弃所有设置,只保留 xmobar 存储库本地副本中的
~/.config/xmobar/xmobar.hs
和 cabal install
,并签出最新的提交,我就可以看到修复。
.cabal
文件不是指定此类信息的正确位置:它与代码存储库的状态相关联,并且不应依赖于其他内容的任何本地签出的存在。
相反,您应该将本地安装的路径放在
cabal.project
文件中,即(与您自己的 .cabal
文件位于同一目录中):
packages: . /home/me/where/I/downloaded/the/repo/Xmobar
然后,当您运行任何
cabal
命令时,它会知道使用 Xmobar
的本地版本,而不是 Hackage 上当前的任何版本。然后,您可以在 > 0.47.3
文件中使用 .cabal
约束,并且仅
如果当前只有您正在处理此项目,则只需将
> 0.47.3
依赖项提交到您自己的 Git,并保持 Xmobar
的本地版本和未添加的 cabal.project
文件即可。然后它对于其他人来说将是不可编译的,但一旦 Xmobar 将新版本推送到 Hackage,它就变得可编译。
或者,您可以将分叉的
Xmobar
作为 Git 子模块 包含到您的存储库中,并添加引用它的 cabal.project
文件。然后任何人都可以查看您的存储库和修补的子模块,将它们一起构建。