在Windows上

时间:2016-10-21 20:49:47

标签: windows haskell cabal portability

是否可以在Windows上安装真正可移植的Haskell,因此Haskell相关的所有内容都发生在单个目录下。我希望能够在USB记忆棒上安装Haskell,这样我就可以通过插入它在任何其他Windows计算机上使用它。

这意味着当我说cabal install somePackage一切都在本地发生并且相对于那个单一目录时(对于不同的计算机而言,可能会有一个不同的驱动器号分配给USB驱动器)。我希望能够在任何Windows计算机上运行cabal install somePackage。此外,如果我可以将USB记忆棒的内容复制到本地硬盘并且它仍然可以在那里工作(在某些Windows机器上,USB记忆棒只能读取),这将是很好的。

我知道以下相关的StackOverflow问题herehere。我可以使用相对路径设置cabal的配置文件吗?那么其他Haskell工具(例如winghci)呢?

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

2 个答案:

答案 0 :(得分:2)

按照以下说明进行操作:

  1. 使用便携式安装在{例如}中安装Haskell Platform h:\dev\hp。选择不创建快捷方式。对于 Haskell堆栈设置,选择h:\dev\hp\local\bin作为目标文件夹。 De 选择添加到用户%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文件夹中下载并解压缩junction实用程序。使用以下内容创建user\create-symlink.bat。然后运行它。

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

    @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脚本被传递到gcch:\dev\hp\80227D~1.1Ăé´ÉŐĂőýŽÇ┬ćýŁŻ┬îŃąÇĂéňżö┬łŃŽ«ĂéŃąÇĂéň庤ťO)的错误路径。我知道如何构建有问题的软件包manually,但不知道如何安装它:

    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 :(得分:-2)

尝试:

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