Warm tip: This article is reproduced from serverfault.com, please click

share-如何在不安装cabal或ghc的情况下运行haskell可执行文件(cabal项目)

(share - How to run a haskell executable (cabal project) without having cabal or ghc installed)

发布于 2020-11-30 20:03:08

我已经用cabal在haskell中构建了一个应用程序。我可以通过在命令提示符下输入“ cabal run [cabal file]”来运行可执行文件。现在,我想将此应用程序共享给我的朋友,最好不要在他们的计算机上安装cabal。我可以在构建目录中找到该项目的.exe文件,但它不会加载该程序随附的.txt文件。.exe文件还会在运行时打开终端,而当我使用cabal运行该终端时它不会这样做(就像它应该那样)。这就告诉我东西丢失了,因此我不能单独共享.exe。在不安装cabal或ghc的情况下运行我的应用程序的解决方案是什么?

Questioner
Johannes Green
Viewed
0
Jon Purdy 2020-12-01 04:34:00

这里有一些可能的解决方案。

通过当你从使用相对路径程序打开文件默认情况下,它是相对于当前工作目录的程序,这是不是可执行文件的生活在那里的,但在那里的可执行文件的执行如果要查找相对于可执行路径或安装目录的文件,则需要明确地查找。有两种基本的方法可以执行此操作:手动使用它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

你也可以使用data-filesCabal文件中字段将文件添加到你的项目中。这将生成一个模块,模块导出一些功能,例如执行与我上面定义动作相同的功能然后,如果你使用来安装项目,它将把数据文件复制到安装目录,你的程序将能够在运行时找到它们。但是,这取决于使用Cabal安装程序,因为它会生成包含安装目录的绝对路径。Paths_projectNamegetDataFileName :: FilePath -> IO FilePathinstallRelativecabal install

如果你cabal install习惯将程序安装在计算机上的标准位置(例如“ program files”目录),则路径是否经过硬编码都没关系,你只需将可执行文件和支持文件复制到归档文件中,让用户将其解压缩到其程序文件目录中。

你可以构建Windows安装程序来代替ZIP存档另外,你可以通过直接使用file-embed软件包将文件嵌入可执行文件中来避免在运行时加载任何内容

至于如何防止终端打开,请参阅我对你的问题的专门回答