haskell 工具链
所谓工欲善其事,必先利其器。在我们学习 haskell 之前完成一整开发环境的安装也是非常重要的。配置 haskell 开发环境会涉及到很多的工具链,新手看了往往会一脸懵。因此这里先对各种工具链进行一个简单的介绍:
- ghc(Glasgow Haskell Compiler): haskell 基础编译器,用于将 haskell 代码编译为可执行文件。
- cabal: 用于构建/打包依赖管理等,类似于 java 中的 maven
- stack: 一"栈"式项目管理工具。stack 是相对于 cabal 更上层也更新的一个构建工具,它是基于 cabal 的。目前更推荐使用 stack 来管理项目
- hsl(Haskell Language Server): LSP 的 haskell 实现。我们需要 hsl 来实现 haskell 的代码高亮,错误提示等
- hsl-vscode 插件: 结合 hsl 在 vscode 中实现 haskell 的代码高亮,错误提示等
- ghcup: 一个便捷的安装程序,可以安装/管理/切换上面提到的所有工具链
在之前我都是通过梯子进行一把梭的安装。但是为了考虑到有的同学并没有方便的梯子,我进行了一些探索,以便于方便大家在没有梯子的情况下能搭建 haskell 的开发环境。
Step 1. 安装工具
既然 ghcup 可以安装所有的工具链,那么第一步就是先安装 ghcup(安装的过程中也会安装其他工具链)。为了避免网络问题导致的失败,我们先进行一点准备工作:
- 安装以下编译工具
build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5
在 debain 系可以通过sudo apt install build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5
来安装。其他发行版使用发行版对应的包管理工具安装即可。 - 创建 cabal 配置文件
~/.cabal/config
填入以下内容:
yaml
repository mirrors.ustc.edu.cn
url: https://mirrors.ustc.edu.cn/hackage/
secure: True
-
访问
https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/
获取 ghcup 目前配置文件最新版本版本,例如本文在编写时最新版为0.0.8
: -
创建 ghcup 配置文件
~/.ghcup/config.yaml
填入以下内容:
ruby
url-source:
OwnSource: https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ghcup-{version}.yaml
请把 {version}
替换为第一步中的版本号。
- 使用以下命令进行安装:
sh
# linux & macos 用户
curl --proto '=https' --tlsv1.2 -sSf https://mirrors.ustc.edu.cn/ghcup/sh/bootstrap-haskell | BOOTSTRAP_HASKELL_YAML=https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ghcup-{version}.yaml sh
# Windows 用户:以非管理员身份在 PowerShell 中运行如下命令
$env:BOOTSTRAP_HASKELL_YAML = 'https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ghcup-{version}.yaml'
Set-ExecutionPolicy Bypass -Scope Process -Force;[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Invoke-WebRequest https://mirrors.ustc.edu.cn/ghcup/sh/bootstrap-haskell.ps1 -UseBasicParsing))) -ArgumentList $true
请把 {version}
替换为第一步中的版本号。执行命令后,会有命令行提示需要确认,按以下进行输入即可:
最后出现以下内容即表示安装成功。
ghcup 有一个非常好用的功能 ghcup tui
可以通过命令行的方式来展示/安装/切换各种工具链(需要重启命令行 ghcup 命令才能够识别),画面如下:
前面有两个√则表示工具已被安装并且已设为默认,如果只有一个√则表示工具已被安装但并未设置为默认。使用方向键移动光标选择某个工具链的版本后按不同的按键有不同的功能(注意输入法不能在中文模式):
- i: 安装该版本
- u: 卸载该版本
- s: 设置该版本为默认版本
Step2. 创建项目
- 修改
~/.stack/config.yaml
增加以下配置:
yaml
setup-info-locations:
- http://mirrors.ustc.edu.cn/stackage/stack-setup.yaml
urls:
latest-snapshot: http://mirrors.ustc.edu.cn/stackage/snapshots.json
snapshot-location-base: http://mirrors.ustc.edu.cn/stackage/stackage-snapshots/
- 下载 global-hints 到
~/.stack/pantry/global-hints-cache.yaml
(在 Windows 下是%APPDATA%\stack\pantry\global-hints-cache.yaml
- 执行命令
stack config set system-ghc --global true
这一步是为了配置 stack 不自动安装ghc
而使用我们已经安装好的版本。不然可能会因为网络问题导致安装失败。 - 使用
stack new hello-hsk
创建一个新项目 - 使用
ghc --version
查看 ghc 的版本,并在https://www.stackage.org/
中查找对应的 lts 版本。例如目前我安装的ghc
版本是9.4.8
则对应的 lts 版本为lts-21.25
:
6. cd hello-hsk
进入项目,修改stack.yaml
,将 resolver
修改为步骤 5 中的 lts 版本。例如:
yaml
# 修改前
resolver:
url: http://mirrors.ustc.edu.cn/stackage/stackage-snapshots/lts/22/7.yaml
# 修改后
resolve: lts-21.25
stack run
编译并运行项目。
其中步骤 1-3
只需要在第一次初始化时执行,后续新建项目时就不用再执行这几个步骤了。至此我们的第一个 haskell 项目就建立成功了。理论上我们已经可以开始开发。但是为了方便起见,我们还需要继续设置 vscode 中的 haskell 代码高亮。
Step3. Vscode 继承 HSL
虽然大佬都可以用记事本写代码,但是我还是建议采用 Vscode + hsl
的方式来获取更好的代码体验。 首先安装 hsl vscode 插件,在插件市场搜索 haskell 排名第一的就是:
理论上安装完成就应该自动生效了,写一个明显错误的语法,如果给出了红色的下划线提示就表明生效了。
如果并没有生效那么我们可能需要进行以下的步骤:
- 手动设置 hsl 的地址: 打开 vscode 的 设置,搜索
server executable path
并将其设置为~/.ghcup/bin/haskell-language-server-wrapper
。
2. Ctrl+Shift+p
调出命令模式,执行 restart haskell LSP server
并执行
如果还未成功,则需要验证安装的 ghc
与 hsl
是否版本匹配。使用 ghc --version
以及 haskell-language-server-wrapper --version
分别获取 ghc 以及 hsl 的 版本。访问 https://haskell-language-server.readthedocs.io/en/latest/support/ghc-version-support.html#
查看版本是否匹配,如果不匹配,则使用 ghcup
来安装并切换到正确的版本。
总结
终于,经历了这么多我们终于完成了 haskell 工具链的安装。完成了万里长征第一步,后续还有更多的挑战等着我们。欢迎大家在评论区分享安装遇到的问题以及解决方案。