2016-05-15 28 views
7

我經常安裝一個依賴外部庫的軟件包,並設法將這些外部庫移到其他位置,以便編譯後的程序以加載器錯誤退出。強制`stack`重建已安裝的程序包

在這些情況下,我只想堆棧重建一個已經安裝的軟件包,但我不明白這是可能的。 stack install --force-dirty似乎不起作用,因爲它只是試圖重建當前工作目錄中的項目。


最近的一個例子:

我會喜歡看到regex-pcre是否需要C庫不存在於Windows系統,所以我打stack install regex-pcre。這很好,但後來我意識到我在此之前通過stack s pacman安裝了mingw-w64-x86_64-pcre。我通過pacman -R再次將其刪除,並試圖再次運行stack install regex-pcre,但未重建。由於上述原因,沒有加入--force-dirty工作。

回答

9

更新:

基於@邁克爾Snoyman的評論只是用這個命令應該足夠刪除軟件包:

stack exec -- ghc-pkg unregister --force regex-pcre 

原來的答案:

我不知道這是否是被認可的方式,但似乎有效。下面是簡介:

  1. 找到了GHC的版本ghc-pkg程序使用的是
  2. 找到包db目錄爲您解析版本
  3. 運行$ghcpkg --package-db $pkgdb unregister --force <package>
  4. 同樣來自刪除軟件包文件stack的precompiled目錄

假設我們要刪除的包是zlib-0.5.4.2

定位GHC-PKG

在〜/ .STACK /節目找到適合您的編譯器版本,例如在GHC-PKG程序~/.stack/programs/x86_64-osx/ghc-7.10.2/bin/ghc-pkg。調用此$ghcpkg

定位包分貝

在〜/ .STACK /快照找到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 

堆棧應該報告它正在重建軟件包。

+1

你可能只能用'stack exec -ghc-pkg unregister pkgname'來逃脫 –

+0

謝謝 - 答案已經更新。 – ErikR