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

时间:2016-05-15 10:00:17

标签: haskell haskell-stack

我经常安装一个依赖外部库的软件包,并设法将这些外部库移动到其他位置,以便编译后的程序以加载程序错误退出。

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

最近的例子:

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

1 个答案:

答案 0 :(得分:14)

<强>更新

基于@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目录
  5. 中删除包文件

    假设我们要删除的包是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
    

    Stack应该报告它正在重建包。