Haskell 在 macOS 下的環境搭建

0x11901發表於2018-06-23

Haskell 作為一個冷門語言,並沒有一個簡單好用傻瓜式的 IDE。所以筆者記錄了自己搭建環境的過程,希望對大家有所幫助。

準備工作

  1. 一個好的網路環境,至少與 GitHub 保持通暢連線
  2. Homebrew

開發環境的搭建

編譯器(GHC)、直譯器(GHCI)等 Haskell 工具鏈

在筆者踩過無數坑之後,無腦推薦Haskell Stack,喜歡挑戰的讀者可以自行嘗試使用 GHC+GHCI+Cabal開發環境 brew install haskell-stack

編輯器

目前主流的編輯器有 vim, emacs, sublime, atom, visual studio code 等,筆者平日開發中只在修改配置檔案或者替換某個字串時用到它們故先按下不表。

IDE

因為宇宙最強 IDE——Visual Studio在 Mac 上發力較晚並表現不佳,故筆者建議使用IntelliJ IDEA(雖說筆者非常討厭 Java 這門語言,但是不得不承認 Java 寫出來的工具還是有不少好用的)

HaskForce

IntelliJ IDEA 有兩個第三方外掛提供了對 Haskell 的支援,筆者建議使用評分較高的HaskForce,目前這款外掛已經無人維護(存疑,但也側面反映了 Haskell 社群的現狀)

  • 安裝

    1. 在 IntelliJ IDEA 中按下 ⌘ + , 進入偏好設定介面
    2. Plugins > Browse repositories > HaskForce

  • 使用 由於 HaskForce 外掛自身的侷限性,需要在終端中通過 Haskell Stack 建立專案。

    1. stack new 專案名稱 模版名稱 路徑(預設當前路徑)
    2. cd 專案名稱
    3. stack setup
    4. stack build

注意如果在建立專案中提示引數不足的警告,可以在~/.stack/config.yaml 中配置

templates:
    params:
        author-name: your-name
        author-email: your-email
        copyright: "Copyright (c) 2018 0x11901"
        github-username: "0x11901"
        category: categories
複製程式碼

不建議在此寫死模版名稱,如果不是很確定要用什麼模版,可以在新建專案時傳 simple

  • 使用 IntelliJ IDEA 匯入建立的 Haskell Stack 專案
  1. 路徑選擇專案的根目錄,注意一下是不是選擇了 Stack 模組
  2. 然後一直下一步
  3. 配置下 configurations
  4. > add > Haskell Stack Run > Executable: 專案名稱
  5. Executable 一定要填寫
  • 點選 run 就能執行你的 Haskell 程式了!

相關工具

如果僅僅只有這些雖然就能愉快的編碼了,但是筆者認為是完全不夠的。畢竟如果沒有程式碼格式化工具和靜態程式碼分析工具,筆者是不會寫程式碼的。所以怎麼能少了這些呢!!! 剛好 HaskForce 整合了 hlint, ghc-mod, hindente 等相關 Haskell 工具,可以很好地與 IntelliJ IDEA 結合。它們的安裝也十分簡單,可以直接使用 Haskell Stack 安裝,當然 hlint 也可以使用 Homebrew 安裝,不過筆者建議使用統一的安裝方式方便將來管理。

stack install hlint hindente stylish-haskell

其中 ghc-mod 的安裝值得特別說一下,目前新建的 Haskell Stack 工程預設的 resolver 是 lts-11.6 , 其 GHC 的版本號是 8.2.2 , 而 ghc-mod 的主工程由於技術問題一直沒有支援這套環境,所以想要成功編譯出來是很麻煩的。所以如果大家想使用這款令人愉悅的黑客工作,可以按照下列步驟來編譯。

1. 推薦建立一個獨立的目錄來儲存接下來要使用的檔案,編譯完成後即可刪除
2. cd 你剛剛建的目錄
3. git clone https://github.com/DanielG/ghc-mod.git -b ghc802
4. git clone https://github.com/DanielG/cabal-helper.git
5. cd ghc-mod ; touch stack.yaml
複製程式碼

因為通過 Haskell Stack 來編譯 ghc-mod 需要配置一個 stack.yaml , 所以用你最喜歡的編譯器開啟 stack.yaml 並寫上下面的內容:

resolver: lts-11.6 # current resolver

packages:
    - location: .
    - location: ./core # seems like ghc-mod-core got integrated
    - location: ../cabal-helper
      extra-dep: true

extra-deps:
    - extra-1.6.6 # escapeJSON was missing with 1.5.3
    - monad-journal-0.7.2
    - optparse-applicative-0.13.2.0
    - unix-compat-0.4.3.1
    - either-4.4.1.1
    - cabal-plan-0.3.0.0

flags: {}

extra-package-dbs: []

allow-newer: true # so it builds / too lazy to pinpoint exact versions
複製程式碼

現在在當前目錄使用 stack install 命令即可正常編譯出 ghc-mod 與 ghc-modi 並會被放在 ~/.local/bin 目錄下,你可以將這個目錄加入 shell 的環境變數中也可以把它們移到已經加到 shell 的環境變數的目錄下。

最後開啟 IntelliJ IDEA 的進入偏好設定介面介面,找到 Haskell Tools 一欄,然後找到你想要使用的工具,點選 Auto Find 按鈕然後確認,就能在 IntelliJ IDEA 使用這些工具了!

Haskell IDE Engine

筆者最近在 GitHub 上發現了這個新專案,相對於 HaskForce 無人維護的狀態,該專案正在如火如荼地開發中。正如該專案介紹所說,這款 Haskell 引擎筆者分析整合了上述所說的所有工具,而且安裝配置更加傻瓜化。考慮到維護性,筆者建議考慮配置 Haskell 環境的同學應使用這個解決方案。

Haskell IDE Engine 與 Visual Studio Code 整合

從 Haskell IDE Engine 的介紹中可以看出,作者是按照“編輯器 + HIE”這種模式來設計的,故這次筆者嘗試了 Haskell IDE Engine + Visual Studio Code 的組合。選擇 Visual Studio Code 的原因主要是免費,畢竟筆者很窮。 他們的整合也很簡單: 先從 VSCode 市場 安裝 Haskell Language Server ,然後再自行編譯 HIE。 可以根據自己所用的 GHC 版本選擇編譯 HIE , 但是根據 Haskell Language Server 的說法,建議全部編譯,故筆者選擇全編譯:

git clone https://github.com/haskell/haskell-ide-engine --recursive
cd haskell-ide-engine && make build-all
複製程式碼
  • 需要你的 Haskell Stack version >= 1.7.1
  • 一個流暢的網路

編譯成功後二進位制檔案會放在 ~/.local/bin,建議將這個路徑加入到 $PATH 中。 最後只需要開啟 VSCode 的偏好設定,在 JSON 中配置一下即可,具體可以看一下 Haskell Language Server 的文件,基本上預設的配置就可以,但是也有 "languageServerHaskell.useHieWrapper": true 欄位可以選擇開啟,如果你沒有把 HIE 的二進位制檔案加入 $PATH 中,還需要配置 "languageServerHaskell.hieExecutablePath": "" 欄位。

現在就能使用 VSCode 愉快地擼碼了。

後記

Haskell IDE Engine 還支援很多編輯器,適應性很廣。雖說現在用起來不如 HaskForce + IntelliJ IDEA 的組合,但是以發展的眼光來看,未來應該是 Haskell IDE Engine 佔主流地位的。所以筆者建議大家都可以試試,總之目前用著還是比較滿意的,以上。

相關文章