付録A 安定した開発環境のためのベストプラクティス(を知りたい)
オリジナルと合わせてベストプラクティスと題したけど、 ベストではなく1つの方法としてお読みください。 (Mac OS X El Capitanを基本に書いています)
これは書籍「Go言語によるWebアプリケーション開発」を使って Haskellの勉強をしようというシリーズです。 Haskellは書籍「関数プログラミング実践入門 ──簡潔で、正しいコードを書くために (WEB+DB PRESS plus)」を読んで勉強中。
表記について
以降の説明では次の表記を使います。
コマンド
$ echo これはコマンド実行です
これはコマンド実行です
$
始まりの行が入力したコマンド行で、それ以外は出力された行か補足です。
出力が多い時は:
で省略します。
なおrootユーザーでのコマンドは#
始まりで表記します。
ソースコード
-- 入門プログラム main = putStrLn "Hello, World!"
Haskellのインストール
手軽に試すならHaskell Platformという、 コンパイラ、ビルドシステム、開発ツール、よく使われるパッケージをひとつにまとめたものがあります。
これでもよかったのですが、stackという開発環境管理ツールがナウいらしいです。 新しいもの好きな私はstackでインストールすることにしました。
stackはコンパイラのインストールやパッケージインストールを手助けしてくれます。 またビルドシステムとしても使えパッケージの依存関係を管理してくれるため、 時々ある依存バージョン地獄に悩まされなくなって安心できます。 おかげでshebang指定でのスクリプトとしても安心して使えるようです。(Stackを使って楽しくHaskellスクリプティング)
参考ページ
Mac OS Xへのインストール
私はAnsibleを使います。
(今回はbrew install haskell-stack
だけですが)
Githubにアップしているstack_osx.ymlをダウンロードしてインストールできます。 Ansibleが入っていれば、次のコマンドでOK!
$ ansible-playbook stack_osx.yml
[WARNING]: provided hosts list is empty, only localhost is available
PLAY ***************************************************************************
TASK [homebrew] ****************************************************************
changed: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0$ stack --version
Version 1.0.4 x86_64
補足 Ansibleのインストール
- Xcodeインストール
$ sudo xcodebuild -license
or
$ xcode-select --install - Homebrewインストール
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- Ansibleインストール
$ brew install ansible
$ ansible --version
ansible 2.0.1.0
config file =
configured module search path = Default w/o overrides
Windows 10へのインストール
私はWindows 64-bit Installerを使いました。
ダウンロードしたインストーラーを実行!
Haskellの設定
stackを使ってHaskellコンパイラをインストールします。 必要があればHTTP_PROXY環境変数を設定しておいてください。
まずはstackが使えるか確認してみましょう。
$ stack --version
Version 1.0.4 x86_64
$ stack setup
Run from outside a project, using implicit global project config
Using latest snapshot resolver: lts-5.8
Writing implicit global project config file to: /Users/big/.stack/global-project/stack.yaml
:
Installed GHC.
:
これでGHCが使えるようになりました。
$ stack ghc -- --version
Run from outside a project, using implicit global project config
Using resolver: lts-5.8 from implicit global project's config file: /Users/big/.stack/global-project/stack.yaml
The Glorious Glasgow Haskell Compilation System, version 7.10.3
プロジェクト単位の設定
stackを使うとシステムの環境とプロジェクトの環境を分けられます。 プロジェクトごとに環境を用意することで、それぞれで同じパッケージを使用していても 別のバージョンをインストールことができます。
まずはプロジェクトを作成して、作られたディレクトリに移動しましょう。
$ stack new helloworld
Downloading template "new-template" to create project "helloworld" in helloworld/ ...
:
$ cd helloworld
$ ls
LICENSE helloworld.cabal test Setup.hs src app stack.yaml
次にプロジェクト用にセットアップを行います。 通常はグローバルプロジェクトにインストールされますが、 依存するライブラリのバージョンによってはプロジェクトローカルにインストールされます。
$ stack setup
stack will use a locally installed GHC
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside of a project, consider using:
stack ghc, stack ghci, stack runghc, or stack exec
そしてビルド。
$ stack build
[1 of 1] Compiling Main
:
Registering helloworld-0.1.0.0...
すると実行ファイルが作られるので、次のコマンドで実行!
$ stack exec helloworld-exe
someFunc
stack test
、stack bench
、stack haddock
など他にも便利機能が用意されています。
Haskellのツール
Haskellの開発をサポートするツールがたくさん用意されています。 その中のいくつかを紹介しましょう。
stack install パッケージインストール
stack install
はgo get
やpip
のようなパッケージインストールができます。
使い方
$ stack install ghc-mod stylish-haskell
:
Copied executables to /Users/big/.local/bin:
- ghc-mod
- ghc-modi
- stylish-haskell
WARNING: Installation path /Users/big/.local/bin not found on the PATH environment variable
パッケージが多いと、とっても時間がかかるので注意。
最後に書いてあるように、~/.local/bin
をPATH環境変数に登録することでインストールしたツールをstack経由でなく直接実行できるようになります。
ついでにstack ghc
やstack ghci
をaliasでghc
、ghci
としとくと便利です。
stylish-haskell ソースコード整形ツール
stylish-haskellはgo fmt
やclang-format
のようなソースコードを整形してくれます。
stackからインストールできます。
使い方
HLint ソースコード検査ツール
HLintはgo vet
やlint
のようなソースコードを検査してくれます。
stackからインストールできます。
$ stack install hlint
使い方
$ stack exec hlint app/Main.hs
No hints
Emacs
各種エディタには開発を補助する拡張機能が用意されています。 ここではEamcsの拡張機能を少しご紹介しましょう。
- haskell-mode メジャーモード
- ghc-mod エディタサポート (stack ideやhdevtoolsもあるみたい?)
ghc-mod
は1つのプログラムで、エディタと通信して使用します。
使うためにはghc-mod
をインストールしておく必要があります。
これもstack
からインストールできます。
$ stack install ghc-mod :
Copied executables to /Users/big/.local/bin:
- ghc-mod
- ghc-modi
WARNING: Installation path /Users/big/.local/bin not found on the PATH environment variable
ghc-mod
を直接使えるように、まだPATH
環境変数に登録していなければ最後に出力されたパスを~/.bash_profile
に登録します。
ではEmacsの設定をしていきます。まずMELPAを使えるように~/.emacs.d/init.el
に次のコードを書いておきましょう。
(require 'package) (add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/")) (package-initialize)
Emacsを起動して、M-x package-list-package
でパッケージ一覧を表示します。
下記をそれぞれ探してi
(インストールマーク)。マークをつけたらx
でインストール。
- ghc
- haskell-mode
~/.emacs.d/init.el
に下記のHaskell用の設定を追加したら準備完了!
(autoload 'ghc-init "ghc" nil t) (autoload 'ghc-debug "ghc" nil t) (add-hook 'haskell-mode-hook (lambda () (ghc-init)))
お好みでHaskell > Customize
を設定したり、init.elに追記して使いやすくしましょう。
私はhaskell-stylish-on-save
を有効にしてソースコード保存時に整形しています。