Como executar um executável haskell (projeto cabal) sem ter cabal ou ghc instalado
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
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.getExecutablePath
para 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-files
campo 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_projectName
getDataFileName :: FilePath -> IO FilePath
installRelative
cabal install
Se você usar cabal install
para 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.