Como executar um executável haskell (projeto cabal) sem ter cabal ou ghc instalado

Dec 01 2020

Eu construí um aplicativo em haskell com cabal. Posso executar o executável digitando no prompt de comando "cabal run [cabal file]". Agora quero compartilhar este aplicativo com meus amigos, e de preferência não tendo que instalar o cabal em suas máquinas. Posso localizar o arquivo .exe do projeto no diretório de compilação, mas ele não carrega um arquivo .txt que vem com o programa. O arquivo .exe também abre o terminal em tempo de execução, o que não acontece quando eu o executo com o cabal (como deveria fazer). Isso me diz que algo está faltando e, portanto, não posso compartilhar o .exe sozinho. Qual é a solução para executar meu aplicativo sem ter cabal ou ghc instalado?

Respostas

3 JonPurdy Dec 01 2020 at 03:34

Existem algumas soluções possíveis aqui.

Por padrão, quando você abre um arquivo de seu programa usando um caminho relativo, ele é relativo ao diretório de trabalho atual do programa, que não é onde o arquivo executável está, mas de onde o executável foi executado . Se quiser encontrar um arquivo relativo ao caminho do executável ou diretório de instalação, você precisa fazer isso explicitamente. Existem duas maneiras básicas de fazer isso: use manualmente System.Environment.getExecutablePathpara obter o diretório do programa e combine-o com o caminho para o seu arquivo:

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

Você também pode usar o data-filescampo em seu arquivo Cabal para adicionar o arquivo ao seu projeto; isso irá gerar um módulo que exporta algumas funções, como que executa a mesma função que a ação que defini acima. Então, se você instalar um projeto com , ele copiará os arquivos de dados para o diretório de instalação e seu programa será capaz de encontrá-los em tempo de execução. No entanto, isso depende da instalação do programa usando Cabal, já que ele gera caminhos absolutos com o diretório de instalação incluído.Paths_projectNamegetDataFileName :: FilePath -> IO FilePathinstallRelativecabal install

Se você usar cabal installpara instalar o programa em um local padrão em sua máquina, como o diretório “arquivos de programas”, então não importa se o caminho está codificado, e você pode simplesmente copiar os arquivos executáveis ​​e de suporte em um arquivo e peça aos usuários que descompactem em seu diretório de arquivos de programa.

Em vez de um arquivo ZIP, você pode criar um instalador do Windows . Como alternativa, você pode evitar ter que carregar qualquer coisa em tempo de execução incorporando os arquivos no executável diretamente usando o file-embedpacote.

Quanto a como evitar que o terminal abra, veja minha resposta à sua pergunta especificamente sobre isso.