Comment exécuter un exécutable haskell (projet cabal) sans avoir installé cabal ou ghc
J'ai construit une application en haskell avec cabal. Je peux exécuter l'exécutable en tapant dans l'invite de commande "cabal run [cabal file]". Désormais, je souhaite partager cette application avec mes amis, et de préférence ne pas avoir à installer cabal sur leurs machines. Je peux localiser le fichier .exe du projet dans le répertoire de construction, mais il ne charge pas un fichier .txt fourni avec le programme. Le fichier .exe ouvre également le terminal lors de l'exécution, ce qu'il ne fait pas lorsque je l'exécute avec cabal (comme il se doit). Cela me dit qu'il manque des éléments et que je ne peux donc pas partager le .exe par lui-même. Quelle est la solution pour exécuter mon application sans avoir installé cabal ou ghc?
Réponses
Il y a quelques solutions possibles ici.
Par défaut, lorsque vous ouvrez un fichier à partir de votre programme en utilisant un chemin relatif, il est relatif au répertoire de travail actuel du programme, qui n'est pas où se trouve le fichier exécutable, mais à partir duquel l'exécutable a été exécuté . Si vous souhaitez rechercher un fichier relatif au chemin de l'exécutable ou au répertoire d'installation, vous devez le faire explicitement. Il existe deux méthodes de base pour ce faire: utilisez manuellement System.Environment.getExecutablePath
pour obtenir le répertoire du programme et combinez-le avec le chemin de votre fichier:
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
Vous pouvez également utiliser le data-files
champ de votre fichier Cabal pour ajouter le fichier à votre projet; cela va générer un module qui exporte quelques fonctions comme qui remplit la même fonction que l' action que j'ai définie ci-dessus. Ensuite, si vous installez un projet avec , il copiera les fichiers de données dans le répertoire d'installation et votre programme pourra les trouver au moment de l'exécution. Cependant, cela dépend de l'installation du programme à l'aide de Cabal, car il génère des chemins absolus avec le répertoire d'installation intégré.Paths_projectName
getDataFileName :: FilePath -> IO FilePath
installRelative
cabal install
Si vous utilisez cabal install
pour installer le programme dans un emplacement standard sur votre machine, tel que le répertoire «program files», alors peu importe que le chemin soit codé en dur, et vous pouvez simplement copier l'exécutable et les fichiers de prise en charge dans une archive et demandez aux utilisateurs de le décompresser dans leur répertoire de fichiers programme.
Au lieu d'une archive ZIP, vous pouvez créer un programme d'installation Windows à la place. Alternativement, vous pouvez éviter d'avoir à charger quoi que ce soit au moment de l'exécution en incorporant les fichiers dans l'exécutable directement à l'aide du file-embedpackage.
Quant à savoir comment empêcher l'ouverture du terminal, lisez ma réponse à votre question à ce sujet.