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

Seb*_*raf 11 haskell haskell-stack

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

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


最近的例子:

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

Eri*_*ikR 17

更新:

基于@Michael Snoyman的注释,只需使用此命令就足以删除包:

stack exec -- ghc-pkg unregister --force regex-pcre
Run Code Online (Sandbox Code Playgroud)

原答案:

我不知道这是否是受制裁的方式,但似乎有效.这是一个概要:

  1. 找到ghc-pkg您正在使用的GHC版本的程序
  2. 找到解析程序版本的package-db目录
  3. $ghcpkg --package-db $pkgdb unregister --force <package>
  4. 还要从堆栈precompiled目录中删除包文件

假设我们要删除的包是zlib-0.5.4.2.

找到ghc-pkg

在〜/ .stack /程序下找到适合你的编译器版本的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
Run Code Online (Sandbox Code Playgroud)

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

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

$ghcpkg --package-db $pkgdb list | grep zlib
Run Code Online (Sandbox Code Playgroud)

precompiled目录中删除包

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

find ~/.stack/precompiled -name 'zlib-*'
/bin/rm -rf ...
Run Code Online (Sandbox Code Playgroud)

重新安装包

stack --resolver=... install zlib
Run Code Online (Sandbox Code Playgroud)

堆栈应报告它正在重建包.

  • 您可能只用`stack exec-ghc-pkg unregister pkgname`就可以摆脱。 (3认同)
  • 我相信使用 Stack 2,您现在需要操作 sqlite 文件。我得到它的工作方式如下:`sqlite3 ~/.stack/stack.sqlite3“从 precompiled_cache 删除像'%pkgdb/zlib-%'这样的库”`。@MichaelSnoyman 你认为我们应该在 Stack 上提出一个问题,以使取消注册依赖项的过程变得更容易吗?对于一些背景,我们必须在每次“icu4c”包在brew上更新时执行此操作,因为“text-icu”将链接到旧的不存在的icu4c dylibs版本 (2认同)