Cómo ejecutar un ejecutable de haskell (proyecto cabal) sin tener cabal o ghc instalado

Dec 01 2020

He creado una aplicación en Haskell con Cabal. Puedo ejecutar el ejecutable escribiendo en el símbolo del sistema "cabal run [cabal file]". Ahora quiero compartir esta aplicación con mis amigos, y preferiblemente no tener que instalar Cabal en sus máquinas. Puedo ubicar el archivo .exe para el proyecto en el directorio de compilación, pero no carga un archivo .txt que viene con el programa. El archivo .exe también abre la terminal en tiempo de ejecución, lo que no hace cuando lo ejecuto con cabal (como debería hacer). Eso me dice que faltan cosas y, por lo tanto, no puedo compartir el .exe por sí solo. ¿Cuál es la solución para ejecutar mi aplicación sin tener instalado cabal o ghc?

Respuestas

3 JonPurdy Dec 01 2020 at 03:34

Aquí hay algunas posibles soluciones.

De forma predeterminada, cuando abre un archivo desde su programa usando una ruta relativa, es relativo al directorio de trabajo actual del programa, que no es donde vive el archivo ejecutable, sino desde donde se ejecutó el ejecutable . Si desea encontrar un archivo relativo a la ruta ejecutable o al directorio de instalación, debe hacerlo explícitamente. Hay dos formas básicas de hacerlo: use manualmente System.Environment.getExecutablePathpara obtener el directorio del programa y combínelo con la ruta a su archivo:

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

También puede usar el data-filescampo en su archivo Cabal para agregar el archivo a su proyecto; esto generará un módulo que exporta algunas funciones como que realiza la misma función que la acción que definí anteriormente. Luego, si instala un proyecto con , copiará los archivos de datos al directorio de instalación y su programa podrá encontrarlos en tiempo de ejecución. Sin embargo, esto depende de instalar el programa usando Cabal, ya que genera rutas absolutas con el directorio de instalación integrado.Paths_projectNamegetDataFileName :: FilePath -> IO FilePathinstallRelativecabal install

Si utiliza cabal installpara instalar el programa en una ubicación estándar en su máquina, como el directorio de "archivos de programa", entonces no importará que la ruta esté codificada, y simplemente puede copiar los archivos ejecutables y de soporte en un archivo y Haga que los usuarios lo descompriman en su directorio de archivos de programa.

En lugar de un archivo ZIP, puede crear un instalador de Windows . Alternativamente, puede evitar tener que cargar nada en tiempo de ejecución incrustando los archivos en el ejecutable directamente usando el file-embedpaquete.

En cuanto a cómo evitar que se abra la terminal, consulte mi respuesta a su pregunta específicamente sobre esto.