强制 `stack` 重建已安装的包

Force `stack` to rebuild an installed package

我经常安装一个依赖于外部库的包,然后设法将这些外部库移动到其他位置,这样编译的程序就会因加载程序错误而退出。

在那些情况下,我只想用堆栈重建一个已经安装的包,但我不知道这怎么可能。 stack install --force-dirty 似乎不起作用,因为它只是尝试在当前工作目录中重建项目。


最近的例子:

我想看看 regex-pcre 是否需要 Windows 系统上不存在的 C 库,所以我点击了 stack install regex-pcre。一切顺利,但后来我意识到我在此之前通过 stacks pacman 安装了 mingw-w64-x86_64-pcre。我再次通过 pacman -R 删除了它,并再次尝试 运行 stack install regex-pcre,但没有重建它。由于上述原因,添加 --force-dirty 也不起作用。

更新:

根据@Michael Snoyman 的评论,仅使用此命令就足以删除软件包:

stack exec -- ghc-pkg unregister --force regex-pcre

原答案:

我不知道这是否是批准的方式,但它似乎有效。这是一个概要:

  1. 找到您正在使用的 GHC 版本的 ghc-pkg 程序
  2. 找到您的解析器版本的 package-db 目录
  3. 运行 $ghcpkg --package-db $pkgdb unregister --force <package>
  4. 同时从堆栈的 precompiled 目录中删除包文件

假设我们要删除的包是 zlib-0.5.4.2.

定位 ghc-pkg

在 ~/.stack/programs 下找到适合您的编译器版本的 ghc-pkg 程序,例如~/.stack/programs/x86_64-osx/ghc-7.10.2/bin/ghc-pkg。称之为 $ghcpkg

定位包 db

在 ~/.stack/snapshots 下找到您正在使用的解析器的 pkgdb 目录,例如~/.stack/snapshots/x86_64-osx/lts-3.1/7.10.2/pkgdb。调用此 $pkgdb.

注销包

运行:

$ghcpkg --package-db $pkgdb unregister --force zlib-0.5.4.2

忽略任何关于损坏或破损包的警告。

您可以使用以下命令检查您的包裹是否已注册:

$ghcpkg --package-db $pkgdb list | grep zlib

precompiled 目录中删除包

~/.stack/precompiled 下找到任何名为 zlib-0.5.4.2 的目录并删除与您的相关 GHC 版本对应的目录:

find ~/.stack/precompiled -name 'zlib-*'
/bin/rm -rf ...

重新安装包

stack --resolver=... install zlib

堆栈应该报告它正在重建包。