Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 强制“stack”重新生成已安装的包_Haskell_Haskell Stack - Fatal编程技术网

Haskell 强制“stack”重新生成已安装的包

Haskell 强制“stack”重新生成已安装的包,haskell,haskell-stack,Haskell,Haskell Stack,我经常安装一个依赖于外部库的软件包,然后设法将这些外部库移到其他位置,这样编译后的程序就会带着加载程序错误退出 在这些情况下,我只想让stack重建一个已经安装的包,但我不知道这是怎么可能的堆栈安装--force dirty似乎不起作用,因为它只是尝试在当前工作目录中重建项目 最近的例子: 我想看看regexpcre是否需要Windows系统上不存在的C库,所以我点击了stack install regexpcre。这很好,但后来我意识到在此之前我通过stackspacman安装了mingw-

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

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


最近的例子:


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

更新:

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

stack exec -- ghc-pkg unregister --force regex-pcre
原始答案:

我不知道这是否是被认可的方式,但似乎有效。以下是一个概要:

  • 找到您正在使用的ghc版本的
    ghc pkg
    程序
  • 找到您的解析器版本的包db目录
  • 运行
    $ghcpkg--package db$pkgdb unregister--force
  • 同时从堆栈的
    precompiled
    目录中删除包文件
  • 假设我们要删除的包是
    zlib-0.5.4.2

    定位ghc包装

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

    查找包数据库

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

    注销程序包

    stack --resolver=... install zlib
    
    运行:

    忽略有关损坏或损坏包的任何警告

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

    $ghcpkg --package-db $pkgdb list | grep zlib
    
    预编译
    目录中删除包

    ~/.stack/precompiled
    下找到名为
    zlib-0.5.4.2
    的任何目录,并从相关版本的GHC中删除该目录:

    find ~/.stack/precompiled -name 'zlib-*'
    /bin/rm -rf ...
    
    重新安装软件包

    stack --resolver=... install zlib
    

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

    你可能只需要
    Stack exec--ghc pkg unregister pkgname就可以了
    @MichaelSnoyman@erikR确实
    Stack exec--ghc pkg unregister pkgname
    使用较新版本的Stack(使用餐具室的)?餐具室不应该影响itI相信Stack 2,现在需要操作sqlite文件。我的工作方式是:
    sqlite3~/.stack/stack.sqlite3“从库“%pkgdb/zlib-%”之类的预编译缓存中删除”
    @MichaelSnoyman您认为我们应该在堆栈上打开一个问题,以使注销依赖项的过程更容易吗?在某些背景下,每当brew上更新
    icu4c
    软件包时,我们都必须这样做,因为
    text icu
    将链接到一个旧的不存在的icu4c dylibs版本