在Windows上真正可移植的Haskell安装

是否有可能在Windows上有一个真正的可移植的Haskell安装,所以一切Haskell相关发生在一个单一的目录下。 我希望能够在USB记忆棒上安装Haskell,所以我可以在任何其他的Windows电脑上使用它,只需插入即可。

这意味着当我说cabal install somePackage一切发生在本地和相对于该单一目录(nb为不同的计算机可能有一个不同的驱动器号分配给USB驱动器)。 我希望能够在任何Windows计算机上运行cabal install somePackage 。 另外,如果我可以将USB存储器的内容复制到本地硬盘并且仍然可以从那里工作(在某些Windows机器上,USB存储器被安装为只读),那就太好了。

我意识到以下相关的StackOverflow问题在这里和这里 。 我可以使用相对path设置cabal的configuration文件吗? 其他Haskell工具(如winghci)呢?

那么,我该怎么做呢? 在便携模式下安装Haskell平台,然后做什么?

按照如下所述的流程进行操作:

  1. h:\dev\hp使用便携式安装来安装Haskell平台 。 选择不创建快捷方式 。 对于Haskell堆栈设置 ,请选择h:\dev\hp\local\bin作为目标文件夹。 选择添加到用户%PATH%

  2. 您应该得到以下(第一级)目录结构:

     dev hp 8.0.1 local bin (this where stack.exe gets installed) 
  3. 创建其他子文件夹:

     mkdir projects mkdir user cd user mkdir AppData mkdir AppData\Roaming dev hp projects user AppData Roaming 
  4. 下载并提取user文件夹中的结点工具。 使用以下内容创建user\create-symlink.bat 。 然后运行它。

     %~dp0junction -nobanner -accepteula -d "%~dp0Application Data" %~dp0junction -nobanner -accepteula "%~dp0Application Data" %~dp0AppData\Roaming junction "Application Data" AppData\Roaming 
  5. 使用以下内容在h:\dev\hp文件夹中创建haskell.bat

     @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. 运行haskell.bat并在命令行中输入这些命令。 这应该在user\AppData\Roaming下创建额外的文件夹结构

     cabal update cabal user-config init stack setup 
  7. 要使cabal的配置文件( user\AppData\Roaming\cabal\config )可重定位,请编辑它并更改标记,如下所示:

     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. 使用您最喜爱的文本编辑器进行多文件搜索并替换下列文件: user\AppData\Roaming\ghc\i386-mingw32-8.0.1\package.conf.d\*.conf

    • 搜索绝对路径并使用$topdir替换它们(它计算到8.0.1下的一个目录,我认为它是h:\dev\hp\8.0.1\lib )。 因此,例如,如果您看到h:\\dev\\hp\user\\Application Data将其替换为$topdir\\..\\..\\user\\AppData\\Roaming 。 或者,如果您看到h:\dev\hp\8.0.1 ,则将其替换为$topdir\..
  9. 在堆栈的快照文件夹中执行相同的搜索和替换过程,例如user\AppData\Roaming\stack\snapshots\XXX\pkgdb

  10. 更新全局和用户和堆栈包缓存:

     `ghc-pkg recache --global` `ghc-pkg recache --user` `ghc-pkg recache --package-db="h:\dev\hp\user\AppData\Roaming\stack\snapshots\XXX\pkgdb"` 
  11. 如果您安装新的软件包,则可能需要重复搜索和替换步骤。 或者你可以尝试cabal install --enable-relocatable <package> ,看看是否可以工作。

  12. 您应该能够重命名安装文件夹,将其复制到同一台机器上的新位置,或完全在不同的机器上,它应该都可以工作。 只需使用haskell.bat来设置环境,并获得一个命令提示符,您应该能够运行ghccabalstackwinghci等。

  13. 还有一个问题。 如果您尝试安装需要构建gcc的软件包,则可能会出现以下错误:

     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 

    原因是configure脚本通过gcc的错误路径( h:\dev\hp\80227D~1.1Ăé´ÉŐĂőýŽÇ┬ćýŁŻ┬îŃąÇĂéňżö┬łŃŽ«ĂéŃąÇĂéň庤ťO )。 我知道如何手动构建违规包,但不知道如何安装它:

     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 

尝试:

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