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

标签 haskell share executable cabal

我用 cabal 在 haskell 中构建了一个应用程序。我可以通过在命令提示符下键入“cabal run [cabal file]”来运行可执行文件。现在我想把这个应用程序分享给我的 friend 们,最好不要在他们的机器上安装 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 文件中的字段将文件添加到你的项目中;这将生成一个 Paths_<em>projectName</em>导出一些功能的模块,如 getDataFileName :: FilePath -> IO FilePath它执行与 installRelative 相同的功能我在上面定义的 Action 。然后,如果您使用 cabal install 安装项目,它会将数据文件复制到安装目录,您的程序将能够在运行时找到它们。然而,这取决于使用 Cabal 安装程序,因为它会生成包含安装目录的绝对路径。

如果您使用 cabal install将程序安装在您机器上的标准位置,例如“程序文件”目录,那么路径是硬编码的就没有关系了,您只需将可执行文件和支持文件复制到存档中并让用户解压缩它在他们的程序文件目录中。

您可以 build a Windows installer 而不是 ZIP 存档反而。或者,您可以通过直接使用 file-embed 将文件嵌入可执行文件来避免在运行时加载任何内容。包。

关于如何防止终端打开,见my answer to your question特别是关于这个。

关于haskell - 如何在没有安装 cabal 或 ghc 的情况下运行 haskell 可执行文件(cabal 项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65080377/

相关文章:

haskell - 使用 warp 时出现 "no instance for YesodDispatch"错误

list - 串联前后的列表检查具有不同的结果

haskell - Haskell的两级类型层次结构

windows - 在 list 中指定公钥 token

javascript - 是否建议从网页启动可执行文件

haskell - 这些一元表达式是否等价

jquery - 如何在没有 API key 的情况下在 jQuery 中获取 Google Plus 分享计数?

Android 如何使用 Intent 发送文本和图像或任何对象?

ios - UIActivityViewController,iOS, swift

c++ - 使用 Qt 显示 JPG 图像不适用于发布可执行文件