【问题标题】:Force `stack` to rebuild an installed package强制 `stack` 重建已安装的包
【发布时间】:2016-05-16 02:40:37
【问题描述】:

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

在这些情况下,我只想让堆栈重建一个已经安装的包,但我不明白这是怎么可能的。 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 也不起作用。

【问题讨论】:

    标签: haskell haskell-stack


    【解决方案1】:

    更新:

    根据@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
    

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

    【讨论】:

    • 你可能只需要stack exec -- ghc-pkg unregister pkgname就可以逃脱惩罚
    • @MichaelSnoyman @erikR stack exec -- ghc-pkg unregister pkgname 是否适用于较新版本的堆栈(使用食品储藏室的堆栈)?
    • 餐具室不应该影响它
    • 我相信使用 Stack 2,您现在需要操作 sqlite 文件。我让它像这样工作:sqlite3 ~/.stack/stack.sqlite3 "DELETE FROM precompiled_cache WHERE library LIKE '%pkgdb/zlib-%'"。 @MichaelSnoyman 您是否认为我们应该在 Stack 上打开一个问题以简化取消注册依赖项的过程?对于某些背景,我们必须在每次 icu4c 包在 brew 上更新时执行此操作,因为 text-icu 将链接到不存在的旧版 icu4c dylibs
    猜你喜欢
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2017-06-11
    • 2017-10-23
    • 1970-01-01
    相关资源
    最近更新 更多