是否可以在Windows上安装真正可移植的Haskell,因此Haskell相关的所有内容都发生在单个目录下。我希望能够在USB记忆棒上安装Haskell,这样我就可以通过插入它在任何其他Windows计算机上使用它。
这意味着当我说cabal install somePackage
一切都在本地发生并且相对于那个单一目录时(对于不同的计算机而言,可能会有一个不同的驱动器号分配给USB驱动器)。我希望能够在任何Windows计算机上运行cabal install somePackage
。此外,如果我可以将USB记忆棒的内容复制到本地硬盘并且它仍然可以在那里工作(在某些Windows机器上,USB记忆棒只能读取),这将是很好的。
我知道以下相关的StackOverflow问题here和here。我可以使用相对路径设置cabal的配置文件吗?那么其他Haskell工具(例如winghci)呢?
那么,我应该怎么做呢?以便携模式安装Haskell平台,然后做什么?
答案 0 :(得分:2)
按照以下说明进行操作:
使用便携式安装在{例如}中安装Haskell Platform h:\dev\hp
。选择不创建快捷方式。对于 Haskell堆栈设置,选择h:\dev\hp\local\bin
作为目标文件夹。 De 选择添加到用户%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
文件夹中下载并解压缩junction实用程序。使用以下内容创建user\create-symlink.bat
。然后运行它。
%~dp0junction -nobanner -accepteula -d "%~dp0Application Data"
%~dp0junction -nobanner -accepteula "%~dp0Application Data" %~dp0AppData\Roaming
junction "Application Data" AppData\Roaming
使用以下内容在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"
运行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
)的错误路径。我知道如何构建有问题的软件包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))