我已经用cabal在haskell中构建了一个应用程序。我可以通过在命令提示符下输入“ cabal run [cabal file]”来运行可执行文件。现在,我想将此应用程序共享给我的朋友,最好不要在他们的计算机上安装cabal。我可以在构建目录中找到该项目的.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
你也可以使用data-files
Cabal文件中的字段将文件添加到你的项目中。这将生成一个模块,该模块导出一些功能,例如执行与我上面定义的动作相同的功能。然后,如果你使用来安装项目,它将把数据文件复制到安装目录,你的程序将能够在运行时找到它们。但是,这取决于使用Cabal安装程序,因为它会生成包含安装目录的绝对路径。Paths_projectName
getDataFileName :: FilePath -> IO FilePath
installRelative
cabal install
如果你cabal install
习惯将程序安装在计算机上的标准位置(例如“ program files”目录),则路径是否经过硬编码都没关系,你只需将可执行文件和支持文件复制到归档文件中,让用户将其解压缩到其程序文件目录中。
你可以构建Windows安装程序来代替ZIP存档。另外,你可以通过直接使用file-embed
软件包将文件嵌入可执行文件中来避免在运行时加载任何内容。
非常感谢!