强制 `stack` 重建已安装的包
Force `stack` to rebuild an installed package
我经常安装一个依赖于外部库的包,然后设法将这些外部库移动到其他位置,这样编译的程序就会因加载程序错误而退出。
在那些情况下,我只想用堆栈重建一个已经安装的包,但我不知道这怎么可能。 stack install --force-dirty
似乎不起作用,因为它只是尝试在当前工作目录中重建项目。
最近的例子:
我想看看 regex-pcre
是否需要 Windows 系统上不存在的 C 库,所以我点击了 stack install regex-pcre
。一切顺利,但后来我意识到我在此之前通过 stack
s pacman
安装了 mingw-w64-x86_64-pcre
。我再次通过 pacman -R
删除了它,并再次尝试 运行 stack install regex-pcre
,但没有重建它。由于上述原因,添加 --force-dirty
也不起作用。
更新:
根据@Michael Snoyman 的评论,仅使用此命令就足以删除软件包:
stack exec -- ghc-pkg unregister --force regex-pcre
原答案:
我不知道这是否是批准的方式,但它似乎有效。这是一个概要:
- 找到您正在使用的 GHC 版本的
ghc-pkg
程序
- 找到您的解析器版本的 package-db 目录
- 运行
$ghcpkg --package-db $pkgdb unregister --force <package>
- 同时从堆栈的
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 install --force-dirty
似乎不起作用,因为它只是尝试在当前工作目录中重建项目。
最近的例子:
我想看看 regex-pcre
是否需要 Windows 系统上不存在的 C 库,所以我点击了 stack install regex-pcre
。一切顺利,但后来我意识到我在此之前通过 stack
s pacman
安装了 mingw-w64-x86_64-pcre
。我再次通过 pacman -R
删除了它,并再次尝试 运行 stack install regex-pcre
,但没有重建它。由于上述原因,添加 --force-dirty
也不起作用。
更新:
根据@Michael Snoyman 的评论,仅使用此命令就足以删除软件包:
stack exec -- ghc-pkg unregister --force regex-pcre
原答案:
我不知道这是否是批准的方式,但它似乎有效。这是一个概要:
- 找到您正在使用的 GHC 版本的
ghc-pkg
程序 - 找到您的解析器版本的 package-db 目录
- 运行
$ghcpkg --package-db $pkgdb unregister --force <package>
- 同时从堆栈的
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
堆栈应该报告它正在重建包。