[英]Minimal haskell (ghc) program installation (deployment without ghc/cabal)
[英]How to run a haskell executable (cabal project) without having cabal or ghc installed
我已经用 cabal 在 haskell 中构建了一个应用程序。 我可以通过在命令提示符“cabal run [cabal file]”中键入来运行可执行文件。 现在我想把这个应用程序分享给我的朋友,最好不要在他们的机器上安装 cabal。 我可以在build目录中找到项目的.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_ projectName
模块,该模块导出一些函数,例如getDataFileName:: FilePath -> IO FilePath
,它执行与我在上面定义的 installRelative 操作相同的installRelative
操作。 然后,如果您使用cabal install
安装项目,它会将数据文件复制到安装目录,您的程序将能够在运行时找到它们。 但是,这取决于使用 Cabal 安装程序,因为它会生成包含安装目录的绝对路径。
如果您使用cabal install
将程序安装在机器上的标准位置,例如“程序文件”目录,那么路径是否是硬编码的并不重要,您只需将可执行文件和支持文件复制到一个存档并让用户将其解压缩到他们的程序文件目录中。
您可以构建 Windows 安装程序,而不是 ZIP 存档。 或者,您可以通过使用file-embed
package 直接将文件嵌入到可执行文件中来避免在运行时加载任何内容。
至于如何防止终端打开,请参阅我对您的问题的具体回答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.