是否有可能在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平台,然后做什么?
按照如下所述的流程进行操作:
在h:\dev\hp
使用便携式安装来安装Haskell平台 。 选择不创建快捷方式 。 对于Haskell堆栈设置 ,请选择h:\dev\hp\local\bin
作为目标文件夹。 选择添加到用户%PATH% 。
您应该得到以下(第一级)目录结构:
dev hp 8.0.1 local bin (this where stack.exe gets installed)
创建其他子文件夹:
mkdir projects mkdir user cd user mkdir AppData mkdir AppData\Roaming dev hp projects user AppData Roaming
下载并提取user
文件夹中的结点工具。 使用以下内容创建user\create-symlink.bat
。 然后运行它。
%~dp0junction -nobanner -accepteula -d "%~dp0Application Data" %~dp0junction -nobanner -accepteula "%~dp0Application Data" %~dp0AppData\Roaming junction "Application Data" AppData\Roaming
使用以下内容在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"
运行haskell.bat
并在命令行中输入这些命令。 这应该在user\AppData\Roaming
下创建额外的文件夹结构
cabal update cabal user-config init stack setup
要使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
使用您最喜爱的文本编辑器进行多文件搜索并替换下列文件: 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\..
在堆栈的快照文件夹中执行相同的搜索和替换过程,例如user\AppData\Roaming\stack\snapshots\XXX\pkgdb
:
更新全局和用户和堆栈包缓存:
`ghc-pkg recache --global` `ghc-pkg recache --user` `ghc-pkg recache --package-db="h:\dev\hp\user\AppData\Roaming\stack\snapshots\XXX\pkgdb"`
如果您安装新的软件包,则可能需要重复搜索和替换步骤。 或者你可以尝试cabal install --enable-relocatable <package>
,看看是否可以工作。
您应该能够重命名安装文件夹,将其复制到同一台机器上的新位置,或完全在不同的机器上,它应该都可以工作。 只需使用haskell.bat
来设置环境,并获得一个命令提示符,您应该能够运行ghc
, cabal
, stack
, winghci
等。
还有一个问题。 如果您尝试安装需要构建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))