2016-10-21 2 views
4

Est-il possible d'avoir une installation Haskell réellement portable sur Windows, de sorte que tout ce qui est lié à Haskell se passe dans un seul répertoire. Je veux pouvoir installer Haskell sur une clé USB pour pouvoir l'utiliser sur n'importe quel autre ordinateur Windows en le branchant.Installation Haskell réellement portable sous Windows

Cela voudrait dire quand je dis cabal install somePackage que tout se passe localement et par rapport à ce répertoire unique (nb pour différents ordinateurs, il peut y avoir une lettre de lecteur différente affectée au lecteur USB). Je voudrais être en mesure d'exécuter ce cabal install somePackage sur n'importe quel ordinateur Windows. Aussi, ce serait bien si je pouvais copier le contenu de la clé USB sur un disque dur local et cela fonctionne encore à partir de là (sur certaines machines Windows, les clés USB sont montées en lecture seule). Je connais les questions StackOverflow connexes here et here. Puis-je configurer le fichier de configuration de cabal de telle sorte qu'il utilise des chemins relatifs? Qu'en est-il des autres outils Haskell (par exemple, winghci)?

Alors, comment dois-je faire? Installez Haskell Platform en mode portable, puis faites quoi?

+3

Votre meilleur pari sera probablement utiliser 'pile ', qui semble être assez bien arrangé pour ce genre de chose. Mais je ne sais pas assez pour vous dire * comment *. – dfeuer

+2

Je suis d'accord avec @dfeuers suggestion. Sans trouver une config globale de projet, la pile vérifiera l'environnement pour 'STACK_ROOT' et mettra tout son contenu dans ce répertoire. Vous pouvez écrire un script shell simple qui localise le répertoire du script et définit correctement "STACK_ROOT". Comme il s'agit de windows, je suppose que vous devrez utiliser batch (c'est là que mon expertise se termine). La copie de ce script fonctionnera théoriquement encore, s'il recherche le répertoire dans lequel il réside. Aucune installation Haskell que je connais ne le fait, cependant. – user2407038

+0

@ user2407038 et le plan de dfeuer ressemble à un plan logique. Il semble être possible d'obtenir un effet similaire avec les sandbox * cabal-install * plutôt que * stack *, comme suggéré [dans ce blog] (http://christiaanb.github.io/posts/relocatable-sandboxes/). Je n'ai jamais vraiment essayé de faire ça, ou quelque chose comme ça, cependant. – duplode

Répondre

2

Suivez le processus comme décrit ci-dessous:

  1. Utiliser l'installation portable installer dans Haskell Platform par exemple h:\dev\hp. Sélectionnez Ne pas créer de raccourcis. Pour Haskell Stack Setup, choisissez h:\dev\hp\local\bin comme dossier de destination. De sélectionner Ajouter à l'utilisateur% PATH%.

  2. Vous devriez obtenir la structure de répertoire suivant (premier niveau):

    dev 
        hp 
        8.0.1 
        local 
         bin (this where stack.exe gets installed) 
    
  3. Créer des sous-dossiers supplémentaires:

    mkdir projects 
    mkdir user 
    cd user 
    mkdir AppData 
    mkdir AppData\Roaming 
    
    dev 
        hp 
        projects 
        user 
         AppData 
         Roaming 
    
  4. Téléchargez et décompressez junction utilitaire dans le dossier user. Créez user\create-symlink.bat avec le contenu suivant. Ensuite, lancez-le.

    %~dp0junction -nobanner -accepteula -d "%~dp0Application Data" 
    %~dp0junction -nobanner -accepteula "%~dp0Application Data" %~dp0AppData\Roaming 
    junction "Application Data" AppData\Roaming 
    
  5. Créer haskell.bat dans le dossier h:\dev\hp avec le contenu suivant:

    @ECHO OFF 
    set HSROOT=%~dp08.0.1 
    SET USERPROFILE=%~dp0user 
    SET Path=%HSROOT%\bin;%HSROOT%\winghci;%~dp0local\bin;%HSROOT%\mingw\bin;%HSROOT%\msys\usr\bin;%HSROOT%\lib;%HSROOT%\lib\extralibs\bin;%Path% 
    CMD /k "cd %~dp0projects" 
    
  6. Run haskell.bat et dans la ligne de commande, tapez ces commandes.Cela devrait créer une structure de dossier supplémentaire sous user\AppData\Roaming

    cabal update 
    cabal user-config init 
    stack setup 
    
  7. Pour le fichier de configuration de cabale (user\AppData\Roaming\cabal\config) de délocalisables, le modifier et changer les balises comme suit:

    remote-repo-cache: $prefix\..\..\user\AppData\Roaming\cabal\packages 
    world-file: $prefix\..\..\user\AppData\Roaming\cabal\world 
    extra-prog-path: $prefix\..\msys\usr\bin 
    extra-lib-dirs: $prefix\..\mingw\lib 
    extra-include-dirs: $prefix\..\mingw\include 
    build-summary: $prefix\..\..\user\AppData\Roaming\cabal\logs\build.log 
    
  8. En utilisant votre éditeur de texte favori faire plusieurs -file rechercher et remplacer sur les fichiers suivants: user\AppData\Roaming\ghc\i386-mingw32-8.0.1\package.conf.d\*.conf

    • Rechercher des chemins absolus et les remplacer en utilisant $topdir (Il évalue à un répertoire sous 8.0.1, je pense que c'est h:\dev\hp\8.0.1\lib). Par exemple, si vous voyez h:\\dev\\hp\user\\Application Data, remplacez-le par $topdir\\..\\..\\user\\AppData\\Roaming. Ou, si vous voyez h:\dev\hp\8.0.1, remplacez-le par $topdir\...
  9. Effectuez le même processus de recherche et de remplacement dans les dossiers d'instantanés de la pile, par ex. user\AppData\Roaming\stack\snapshots\XXX\pkgdb:

  10. Mise à jour du cache paquet global et de l'utilisateur et la pile:

    `ghc-pkg recache --global` 
    `ghc-pkg recache --user` 
    `ghc-pkg recache --package-db="h:\dev\hp\user\AppData\Roaming\stack\snapshots\XXX\pkgdb"` 
    
  11. Si vous installez de nouveaux packages, vous devrez peut-être répéter la recherche & remplacer étape. Ou vous pouvez essayer cabal install --enable-relocatable <package> et voir si cela fonctionne à la place.

  12. Vous devriez pouvoir renommer le dossier d'installation, le copier à un nouvel emplacement sur la même machine ou sur une machine différente et tout devrait fonctionner. Il suffit d'utiliser le haskell.bat pour mettre en place l'environnement et obtenir une invite de commande à partir de laquelle vous devriez être en mesure d'exécuter ghc, cabal, stack, winghci, etc.

  13. Il y a une question qui reste encore. Si vous essayez d'installer un package qui nécessite gcc à construire, vous pourriez obtenir l'erreur suivante:

    Configuring network-2.6.3.1... 
    bash.exe: warning: could not find /tmp, please create! 
    configure: WARNING: unrecognized options: --with-compiler 
    checking build system type... bash.exe: warning: could not find /tmp, please create! 
    bash.exe: warning: could not find /tmp, please create! 
    i686-pc-mingw32 
    checking host system type... i686-pc-mingw32 
    checking for gcc... h:\dev\hp\80227D~1.1Ăé´ÉŐĂőýŽÇ┬ćýŁŻ┬îŃąÇĂéňżö┬łŃŽ«ĂéŃąÇĂéň庤ťO 
    checking whether the C compiler works... no 
    configure: error: in `/cygdrive/c/DOCUME~1/UserName/LOCALS~1/Temp/stack4268/network-2.6.3.1': 
    configure: error: C compiler cannot create executables 
    See `config.log' for more details 
    

    La raison est que le script configure est transmis le mauvais chemin à gcc (h:\dev\hp\80227D~1.1Ăé´ÉŐĂőýŽÇ┬ćýŁŻ┬îŃąÇĂéňżö┬łŃŽ«ĂéŃąÇĂéň庤ťO). Je sais comment construire le paquet incriminé manually, mais je ne sais pas comment l'installer:

    stack unpack network-2.6.3.1 
    cd network-2.6.3.1 
    stack init 
    # edit `configure` script and put `CC=` on the first line to kill system supplied path to `gcc` 
    stack build 
    
-1

Essayez:

penultimo :: [Int] -> Int 
penultimo l = head(tail(reverse l))