LoginSignup
11
10

More than 1 year has passed since last update.

Haskell Stack のグローバル環境を雑に使う

Last updated at Posted at 2018-04-08

[更新] より新しい情報

注意: 今では GHCup でインストールされる Haskell 環境を好きに使えば良い気がしています。くわしくは先ず ghcup tui で出てくる環境選択画面を見てみることをおすすめします

また現時点でモダンなIDE環境といえば Intero ではなく VS Code + Haskell拡張 (Haskell Language Server) になると思います.

以下の記事もどうぞ:

あらまし

  • Stack は、Haskell のビルドツールのひとつ。
    • パッケージ群のバージョンを固定 (snapshot) することで Cabal hell が起こらなくなっている。
    • あくまでもビルドツールなのでプロジェクトを作ってその中で使うのが普通
    • しかしちょっとしたコード片のためにプロジェクトの環境構築するのは面倒。
    • グローバル環境を雑に使ってみたい(そういう使い方はあまり想定されていないかもしれないが)
  • Intero のようなモダンな IDE 環境を使ってみたい。
    • Intero は Stack の GHC を見ているようだ。つまり、プロジェクトの外で起動するとグローバルの Stack 環境で起動する。
    • 適当に拾ってきたコードを読む時にも Stack のグローバル環境は使えそうだ

現時点 (2018年4月) で雑に試した内容を書いておく。環境は macOS です。

既存の GHC を消す

色々とややこしいので ghcghci にパスが通っていない状態にする。 ついでに古い cabal や ~/.cabal も消した。

Stack のインストール

curl -sSL https://get.haskellstack.org/ | sh
stack upgrade

LTS バージョンの選定と Stack グローバル環境の構築

Stackage のトップページに新しめの GHC バージョンが揃っているので、適当な GHC を選び、それに対応する LTS のバージョンを控えておく。自分は lts-7.24 (LTS 7.24 for GHC 8.0.1, published 10 months ago) というのを選んだ。

Stack の環境は ~/.stack に構築される。ここに何もないことを確認して、 stack setup を起動。すぐに ^C で止める。

$ stack setup
^C

生成された ~/.stack/global-project/stack.yaml を編集し自分の好きな LTS のバージョンに変え、 stack setup を再実行

$ cat ~/.stack/global-project/stack.yaml 
packages: []
resolver: lts-7.24
$ stack setup

Intero のインストール

公式 の通り。 ~/.emacs/init.el に以下を書いた。

;; If you don't have MELPA in your package archives:
(require 'package)
(add-to-list
  'package-archives
  '("melpa" . "http://melpa.org/packages/") t)
(package-initialize)
(package-refresh-contents)

;; Install Intero
(package-install 'intero)
(add-hook 'haskell-mode-hook 'intero-mode)

GHC の起動

そのままでは当然 ghc などのコマンドが通らない。 stack ghc 等で起動できる。
あるいは、

stack exec bash -- --login

として stack の下で新しいシェルに入れば ghc にパスが通るようになる。 コマンドへのオプションは -- の後に置くことに注意する。 stack exec CMD -- オプション のようにする。
ただ、stack ghci が experimental ということなので この bash 環境もどこまで使えるのか??

パッケージのインストール?

stack build にパッケージ名を直接指定すればグローバル環境の Stack にパッケージが入る (Intero からも見えるようになる)。

stack build パッケージ名

Stack にはインストールという概念は無い(コマンドとしては存在するが stack build --copy-bins のエイリアスになっている)。その代わりに stack.yaml に書かれたパッケージが stack build 時にビルドされる。
今回は Stack をグローバル環境で使っているので、 ~/.stack/global-project/stack.yaml に書けば良さそうだが、ビルド対象のプロジェクトが無いので素の stack build は効かない。
上記のようにすればグローバルで stack ghc した時に使えるパッケージが入る。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10