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