![](/img/trans.png)
[英]Minimal haskell (ghc) program installation (deployment without ghc/cabal)
[英]How to run a haskell executable (cabal project) without having cabal or ghc installed
我已經用 cabal 在 haskell 中構建了一個應用程序。 我可以通過在命令提示符“cabal run [cabal file]”中鍵入來運行可執行文件。 現在我想把這個應用程序分享給我的朋友,最好不要在他們的機器上安裝 cabal。 我可以在build目錄中找到項目的.exe文件,但是它沒有加載程序自帶的.txt文件。 .exe 文件還在運行時打開終端,當我使用 cabal 運行它時它不會這樣做(就像它應該做的那樣)。 這告訴我缺少東西,因此我無法單獨共享.exe。 在沒有安裝 cabal 或 ghc 的情況下運行我的應用程序的解決方案是什么?
這里有一些可能的解決方案。
默認情況下,當您使用相對路徑從程序中打開文件時,它是相對於程序的當前工作目錄的,這不是可執行文件所在的位置,而是可執行文件從. 如果要查找相對於可執行路徑或安裝目錄的文件,則需要顯式執行此操作。 有兩種基本方法可以做到這一點:手動使用System.Environment.getExecutablePath
獲取程序目錄,並將其與文件路徑結合起來:
import System.Environment (getExecutablePath)
import System.FilePath ((</>))
installRelative :: FilePath -> IO FilePath
installRelative relative = do
absolute <- getExecutablePath
pure (absolute </> relative)
readInstalledFile :: FilePath -> IO String
readInstalledFile path = readFile =<< installRelative path
您還可以使用 Cabal 文件中的data-files
字段將文件添加到項目中; 這將生成一個Paths_ projectName
模塊,該模塊導出一些函數,例如getDataFileName:: FilePath -> IO FilePath
,它執行與我在上面定義的 installRelative 操作相同的installRelative
操作。 然后,如果您使用cabal install
安裝項目,它會將數據文件復制到安裝目錄,您的程序將能夠在運行時找到它們。 但是,這取決於使用 Cabal 安裝程序,因為它會生成包含安裝目錄的絕對路徑。
如果您使用cabal install
將程序安裝在機器上的標准位置,例如“程序文件”目錄,那么路徑是否是硬編碼的並不重要,您只需將可執行文件和支持文件復制到一個存檔並讓用戶將其解壓縮到他們的程序文件目錄中。
您可以構建 Windows 安裝程序,而不是 ZIP 存檔。 或者,您可以通過使用file-embed
package 直接將文件嵌入到可執行文件中來避免在運行時加載任何內容。
至於如何防止終端打開,請參閱我對您的問題的具體回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.