Linuxを日常的に使う実験ブログ

ghcupでHaskellの開発環境を構築する

 2021-10-03

 プログラミング

こんにちは。今回さのテーマは「Haskellプロジェクトを作るための環境構築」です。Haskellのプログラミング周りのツールは日進月歩で進歩しており新しいツールが出てきている状態ですので、今回紹介する設定もすぐ古くなってしまう気もしますが、2021年9月時点で筆者が個人的に良いと思う環境構築について書いてみたいと思います。 [adsense02] 【目次】 ghcupでstackのインストールも可能になった ghcupの導入開始 PATHの設定 HLSのインストール設定 stackのインストール設定 各ツールのビルドとインストール パスの有効化 stackの設定をする

ghcupでstackのインストールも可能になった

ネット上の情報を探しているとghcupではghc, cabal, HLS(Haskell Language Server)を導入し、Stackについては別途インストールするという情報が多いのですが、2021年9月時点ではghcupはstackのインストール、アップグレードもカバーしていますのでghcupでまとめて導入するのが良いかと思います。 ghcupのTUI画面

ghcupの導入開始

以下のコマンドでghcupの導入を開始します。curlコマンドが使用できる前提です。

curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh

上記コマンドを実行すると対話型でghc, cabal-install, HLS, stackのインストールが始まります。HLSとstackに関してはオプションという扱いです。それでは対話型で進む各ステップにしたがって導入方法を見ていきたいと思います。

PATHの設定

インストールコマンドを実行すると以下のように、/.ghcup内へのパスを通すために/.bashrcに書き加えて良いか聞いてきます。

Detected bash shell on your system...
Do you want ghcup to automatically add the required PATH variable to "/home/kuro/.bashrc"?

[P] Yes, prepend  [A] Yes, append  [N] No  [?] Help (default is "P").

ここは「P」を入力してpathの頭にghcへのパスを通します。

HLSのインストール設定

次にHLSをインストールするか聞かれます。

Do you want to install haskell-language-server (HLS)?
HLS is a language-server that provides IDE-like functionality
and can integrate with different editors, such as Vim, Emacs, VS Code, Atom, ...
Also see https://github.com/haskell/haskell-language-server/blob/master/README.md

[Y] Yes  [N] No  [?] Help (default is "N"). 

ここは「Y」を押して、HLSをインストールするように設定します。

stackのインストール設定

次にstackをインストールするか聞かれます。

Do you want to install stack?
Stack is a haskell build tool similar to cabal that is used by some projects.
Also see https://docs.haskellstack.org/

[Y] Yes  [N] No  [?] Help (default is "N").

ここで「Y」を押してstackをインストールするように設定します。もしプロジェクトはcabalで作成するという方はインストールしなくてもOKです。

各ツールのビルドとインストール

設定がすべて終わると以下のようなメッセージが出ます。

System requirements 
  Note: You need the following packages: curl g++ gcc gmp make ncurses realpath xz-utils. Consult your distro documentation on the exact names of those packages.

もし上記に書かれているパッケージが不足している場合は「CTL + c」で中断し、システムのパッケージマネージャを用いて導入します。必要なパッケージの導入が終わったら再度ghcup導入の手続きを行います。問題ない場合はEnterを押して続行します。 ※必要なパッケージ名はディストリビューションによって異なるのでインストール時には注意して下さい。 すべてのインストールが完了すると以下のようにメッセージが出ます。

All done!

To start a simple repl, run:
  ghci

To start a new haskell project in the current directory, run:
  cabal init --interactive

To install other GHC versions and tools, run:
  ghcup tui

もし/tmpの容量不足でビルドできなかった場合はコチラの記事を参考にしてみて下さい。

パスの有効化

この時点ではまだパスが通ってませんので、~/.bashrcに追記されたPATHを有効化するために再ログインするか以下のコマンドを実行します。

source ~/.bashrc

これで~/.ghcup内へのパスが通りました。もし既にシステムのパッケージマネージャでghcがインストールされている場合は混乱を避けるためにアンインストールをしておくことをオススメします。

stackの設定をする

素のままのstackではプロジェクト毎にghcをダウンロードして使用する設定となっていますので、システムのghcを使用するように設定をします。/.stack/configure.yamlに以下を書き込みます。もちろんですが、stackは使わないという方は設定不要です。 **/.stack/configure.yaml**

system-ghc: true

最後に

ghcupの登場によりディストリビューション公式のパッケージに縛られることなくハスケルの開発環境を容易に構築できるようになりました。UbuntuやFedoraなどのディストリビューションではhaskell-platformという開発ツール詰め合わせパッケージを用意してありますが、今後はghcupによる環境構築が主流になっていくような気がしています。 この記事が何かのお役に立てば幸いです。 【関連記事】 FizzBuzz問題で考えるHaskellと問題解決のアプローチ /tmpディレクトリの容量不足でghcupの導入に失敗したときの対処法 [adsense]