如何在没有安装 cabal 或 ghc 的情况下 运行 haskell 可执行文件(cabal 项目)
How to run a haskell executable (cabal project) without having cabal or ghc installed
我在 haskell 中使用 cabal 构建了一个应用程序。我可以通过在命令提示符中输入“cabal 运行 [cabal 文件]”来 运行 可执行文件。现在我想把这个应用程序分享给我的朋友们,最好不要在他们的机器上安装 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
您还可以使用 Cabal 文件中的 data-files
字段将文件添加到您的项目中;这将生成一个 Paths_<em>projectName</em>
模块,该模块导出一些功能,例如 getDataFileName :: FilePath -> IO FilePath
,它执行与 installRelative
相同的功能我在上面定义的动作。然后,如果您使用 cabal install
安装项目,它会将数据文件复制到安装目录,您的程序将能够在运行时找到它们。但是,这取决于使用 Cabal 安装程序,因为它会生成 绝对 路径,其中包含安装目录。
如果您使用 cabal install
将程序安装在您机器上的标准位置,例如“program files”目录,那么路径是硬编码的并不重要,您可以简单地将可执行文件和支持文件复制到存档中,并让用户将其解压缩到他们的程序文件目录中。
您可以 build a Windows installer instead. Alternatively, you can avoid having to load anything at runtime by embedding the files in the executable directly using the file-embed
打包而不是 ZIP 存档。
如何防止终端打开,具体见
我在 haskell 中使用 cabal 构建了一个应用程序。我可以通过在命令提示符中输入“cabal 运行 [cabal 文件]”来 运行 可执行文件。现在我想把这个应用程序分享给我的朋友们,最好不要在他们的机器上安装 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
您还可以使用 Cabal 文件中的 data-files
字段将文件添加到您的项目中;这将生成一个 Paths_<em>projectName</em>
模块,该模块导出一些功能,例如 getDataFileName :: FilePath -> IO FilePath
,它执行与 installRelative
相同的功能我在上面定义的动作。然后,如果您使用 cabal install
安装项目,它会将数据文件复制到安装目录,您的程序将能够在运行时找到它们。但是,这取决于使用 Cabal 安装程序,因为它会生成 绝对 路径,其中包含安装目录。
如果您使用 cabal install
将程序安装在您机器上的标准位置,例如“program files”目录,那么路径是硬编码的并不重要,您可以简单地将可执行文件和支持文件复制到存档中,并让用户将其解压缩到他们的程序文件目录中。
您可以 build a Windows installer instead. Alternatively, you can avoid having to load anything at runtime by embedding the files in the executable directly using the file-embed
打包而不是 ZIP 存档。
如何防止终端打开,具体见