Joh*_*een 4 executable share haskell cabal
我用 cabal 在 haskell 中构建了一个应用程序。我可以通过在命令提示符中输入“cabal run [cabal file]”来运行可执行文件。现在我想与我的朋友分享这个应用程序,并且最好不必在他们的计算机上安装 cabal。我可以在构建目录中找到该项目的 .exe 文件,但它不会加载程序附带的 .txt 文件。.exe 文件还会在运行时打开终端,当我使用 cabal 运行它时,它不会这样做(就像它应该做的那样)。这告诉我缺少了一些东西,因此我无法单独共享 .exe。在没有安装 cabal 或 ghc 的情况下运行应用程序的解决方案是什么?
这里有一些可能的解决方案。
\n默认情况下,当您使用相对路径从程序中打开文件时,it\xe2\x80\x99 相对于程序的当前工作目录,该目录不是可执行文件所在的位置,而是从 执行可执行文件的位置。如果要查找相对于可执行路径或安装目录的文件,则需要明确执行。有两种基本方法可以做到这一点:手动使用System.Environment.getExecutablePath来获取程序目录,并将其与文件的路径结合起来:
import System.Environment (getExecutablePath)\nimport System.FilePath ((</>))\n\ninstallRelative :: FilePath -> IO FilePath\ninstallRelative relative = do\n absolute <- getExecutablePath\n pure (absolute </> relative)\n\nreadInstalledFile :: FilePath -> IO String\nreadInstalledFile path = readFile =<< installRelative path\nRun Code Online (Sandbox Code Playgroud)\n您还可以使用data-filesCabal 文件中的字段将该文件添加到您的项目中;这将生成一个模块,该模块导出一些函数,例如执行与我上面定义的操作相同的函数。然后,如果您使用 来安装项目,它会将数据文件复制到安装目录,您的程序将能够在运行时找到它们。然而,这取决于使用 Cabal 安装程序,因为它会生成内置安装目录的绝对路径。Paths_projectNamegetDataFileName :: FilePath -> IO FilePathinstallRelativecabal install
如果您习惯cabal install将程序安装在计算机上的标准位置,例如 \xe2\x80\x9cprogram files\xe2\x80\x9d 目录,那么 \xe2\x80\x99 路径是硬编码的,并且您只需将可执行文件和支持文件复制到存档中,然后让用户将其解压缩到其程序文件目录中。
您可以构建 Windows 安装程序,而不是 ZIP 存档。或者,您可以通过使用直接将文件嵌入到可执行文件中来避免在运行时加载任何内容file-embed。
至于如何防止终端打开,请参阅我对您问题的专门回答。
\n