bigpadノート

プログラミング寄りの内容を書いてます。

付録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のインストール

  1. Xcodeインストール

    $ sudo xcodebuild -license
     or
    $ xcode-select --install

  2. Homebrewインストール

    $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  3. 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

ではコンパイラGHCをインストールしましょう。

$ 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 teststack benchstack haddockなど他にも便利機能が用意されています。

Haskellツール

Haskellの開発をサポートするツールがたくさん用意されています。 その中のいくつかを紹介しましょう。

stack install パッケージインストール

stack installgo getpipのようなパッケージインストールができます。

使い方

$ 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 ghcstack ghciをaliasでghcghciとしとくと便利です。

stylish-haskell ソースコード整形ツール

stylish-haskellgo fmtclang-formatのようなソースコードを整形してくれます。

stackからインストールできます。

$ stack install stylish-haskell

使い方

$ stack exec stylish-haskell -- -i app/Main.hs

HLint ソースコード検査ツール

HLintgo vetlintのようなソースコードを検査してくれます。

stackからインストールできます。

$ stack install hlint

使い方

$ stack exec hlint app/Main.hs
No hints

Emacs

各種エディタには開発を補助する拡張機能が用意されています。 ここではEamcsの拡張機能を少しご紹介しましょう。

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を有効にしてソースコード保存時に整形しています。