如何让Cabal拉取source-repository-package指定仓库的最新代码?
解决Cabal本地Git依赖无法更新的问题
问题分析
你当前的cabal.project里把分支master指定为tag,这是个小问题——tag是Git里固定的提交标记,而master是动态更新的分支,这会导致Cabal认为依赖版本是固定的,不会主动检查更新。另外,cabal update仅用于更新Hackage包索引,不会处理Git类型的源依赖。
解决方案
1. 临时快速更新:直接绑定本地目录
如果只是想快速用上本地仓库的最新代码,无需依赖Cabal缓存,可使用--with-source参数强制Cabal读取指定本地目录的最新内容:
cabal build --with-source=abcxyz=/home/chris/example/abcxyz
这个命令会跳过缓存直接使用本地abcxyz子目录的代码,适合本地依赖频繁更新的场景。
2. 强制拉取Git依赖更新
如果希望保留Cabal缓存机制,但更新到Git仓库的最新提交,可使用--fetch-repo参数强制检查并拉取所有源仓库的更新:
cabal build --fetch-repo
该命令会遍历所有配置的source-repository-package,检查对应仓库(这里是你的本地Git仓库)是否有新提交,并拉取最新版本。
3. 长期正确配置:使用分支而非Tag
修改cabal.project中的依赖配置,将tag: master改为branch: master(因为master是分支而非Tag):
packages: . source-repository-package type: git location: /home/chris/example/ branch: master subdir: abcxyz
之后运行cabal build --fetch-repo即可拉取分支的最新提交,后续需要更新时重复执行该命令即可。
内容的提问来源于stack exchange,提问作者Chris Stryczynski
相关产品推荐
相关产品推荐

