Une façon simple d'avoir l'API GHC pour l'application déployée sur Windows
-
27-10-2019 - |
Question
Je veux déployer une application sur Windows qui a besoin d'accéder à l'API GHC. En utilisant le premier exemple simple du Wiki:
http://www.haskell.org/haskellwiki/GHC/As_a_library
entraîne l'erreur suivante (compilé sur une machine avec plate-forme de Haskell et exécuté sur une autre fenêtre installation propre): test.exe: ne peut pas trouver une base de données de package dans C: \ haskell \ lib \ package.conf.d
Je voudrais déployer mon application comme un simple fichier zip et non demander à l'utilisateur d'avoir quoi que ce soit installé. Est-il un moyen simple d'inclure les choses GHC nécessaires dans ce fichier zip il fonctionne?
La solution
Ce programme permet de copier les fichiers nécessaires dans le répertoire spécifié (fonctionne uniquement sous Windows):
import Data.List (isSuffixOf)
import System.Environment (getArgs)
import GHC.Paths (libdir)
import System.Directory
import System.FilePath
import System.Cmd
main = do
[to] <- getArgs
let libdir' = to </> "lib"
createDirectoryIfMissing True libdir'
copy libdir libdir'
rawSystem "xcopy"
[ "/e", "/q"
, dropFileName libdir </> "mingw"
, to </> "mingw\\"]
-- | skip some files while copying
uselessFile f
= or $ map (`isSuffixOf` f)
[ "."
, "_debug.a"
, "_p.a", ".p_hi" -- libraries built with profiling
, ".dyn_hi", ".dll"] -- dynamic libraries
copy from to
= getDirectoryContents from
>>= mapM_ copy' . filter (not . uselessFile)
where
copy' f = do
let (from', to') = (from </> f, to </> f)
isDir <- doesDirectoryExist from'
if isDir
then createDirectory to' >> copy from' to'
else copyFile from' to'
Après l'exécution avec le répertoire de destination comme argument, vous aurez une copie locale de lib
et mingw
(au total environ 300 Mb).
Vous pouvez supprimer les bibliothèques inutilisées de lib
pour économiser plus d'espace.