前言
时隔半年再次开始学Haskell
, 然后在配环境中度过了一个哭笑不得的下午…
Haskell环境是啥呢…?
按我不完全的理解, 主要有:
- 一个编译器, 比如
ghc
; 它还附带一个REPL叫ghci
- 一个包管理器兼项目管理器
stack
- 一个提供后台语言分析支持的
Language Engine
, 比如Haskell-Ide-Engine
(HIE
)
然后呢还有一个东西叫cabal
, 是一个历史遗留下来的包管理器, 有一套自己的包系统啊blabla的, 也没多大关系了…
stack和cabal的更多信息: Why is stack not cabal?. ANNOUNCING: first public beta of stack. What is the difference between Cabal and Stack?
本来呢, 目标是把上面三个, 最主要是第三个搞好; 但是由于我太菜了, 直到本文写好为止, 都…
WSL
如果配好了stack
, 那剩下两个基本上就是水到渠成了.
第一反应当然是选择WSL
配置!
sudo pacman -S stack
装完, 主要参考了这里, 配了一波stack.yaml
, 然后开始折腾三, 照着这里的做法,
git clone https://github.com/haskell/haskell-ide-engine
cd haskell-ide-engine
stack install
然后报错:
Cabal file info not found for apply-refact-0.7.0.0, updating
Selected mirror https://s3.amazonaws.com/hackage.fpcomplete.com/
Downloading root
Waiting to acquire cache lock on $HOME/.stack/pantry/hackage/hackage-security-lock
fdLock: invalid argument (Invalid argument)
Google之后, 在这里发现这可能是WSL
的一个bug
, 并且看起来修不了…
然后我在Cabel的issue里发现了一种可能的解决方法: 在项目目录下的cabal.project
做出如下修改:
constraints:
lukko -ofd-locking
报错依旧, 可能这个方法只能修cabel-install
. 由于我对Haskell
的包管理体系还完全不熟悉, 所以不知道能不能把这个方法移植到stack
上, 但这条路看起来是行不通了…
那万能的AUR呢?
Google后发现果然有直接有HIE
的包.
然后熟练地输入
sudo pikaur -S haskell-ide-engine
熟练地得到报错:
Traceback (most recent call last):
File "/usr/sbin/pikaur", line 9, in <module>
main()
File "/usr/lib/python3.8/site-packages/pikaur/main.py", line 401, in main
create_dirs()
File "/usr/lib/python3.8/site-packages/pikaur/main.py", line 373, in create_dirs
raise Exception(result)
Exception: InteractiveSpawn returned 1:
STDOUT:
STDERR:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to create bus connection: Host is down
经过Google发现WSL基本上不可能折腾出systemd
出来, 遂放弃, 转而去装了个yay
后来发现我还是太菜了. 按照装包的惯性, 我加了
sudo
, 但是pikaur
默认是不想带着root
权限跑(怕恶意aur
), 所以它会试着派生出一个普通权限的进程, 而这时用到了systemd
. 所以只要不加sudo
, 它就完全可以正常地在WSL
上运行…
然而我发现得太晚了…
装好yay
之后, 尝试安装那个AUR
, 发现它其实就是手动做法, 把源码下下来然后stack install
…
(o_ _)ノ
我换Windows版总行了吧…
下载win版安装, 然后stack setup
, 报错:
...(一些OS相关信息)
(internalexception (handshakefailed (error_misc "network.socket.sendbuf: failed (no error)")))
我…迷惑…
啥玩意叫failed (no error)
啊啊啊啊啊啊???
Google之后发现完全没有相关的结果, 大家都有error
就我没有…遂怀疑是某堵墙的问题(因为它好像要从raw.githubcontent
)那里下点什么东西
然后去找了一会才找到powershell
怎么给命令挂代理(好像win10自带的全局代理不可以…), 本质上也是加环境变量:
$Env:http_proxy=http://127.0.0.1:1080
$Env:https_proxy=http://127.0.0.1:1080
然后再跑就没问题了… f**k GFW
这setup好像还顺路装了个
msys2
…
好. 去HIE
的目录下愉快地stack install
吧!
然后编译到一半报错:
某个项目 > Registering library for 项目-版本..
terminateProcess: permission denied (Permission denied)
我有给管理员啊…而且Ctrl+C
重来后还在不一样的地方报错; 还不是所有包都会报这个错…
无奈Google, 发现了一个神奇的方法(这里):
chcp 65001
把当前powershell
代码页切换到UTF-8
就好了…
什么鬼啊w(゚Д゚)w
然后又历经几次奇奇怪怪的报错, 多编译了几次, 总算把这200+的依赖编译完了, 一运行:
hie.exe: could not detect mingw toolchain
Boom!
气急败坏的我甚至跑去WSL
里输了个hie.exe
, 然后还是报错:
hie.exe: 当前目录: getDirectoryContents:findFirstFile: permission denied ()
过一天重启之后再次在
powershell
里运行, 报的错跟WSL
里的一样了…
最后
发现了一个VSCode
扩展Simple GHC (Haskell) Integration for VSCode
, 只需要GHCi
就可以运行就能提供的基本的补全, 对我这种轻度使用是完全ok了….
所以我是白折腾了..?