Edited at

pulpでPureScriptプロジェクトをビルドする

More than 3 years have passed since last update.

遅れてスンマセン http://qiita.com/advent-calendar/2014/purescript の5日目

pulpはpurescriptのビルドツール兼プロジェクト管理機能みたいなやつ。

bodil/pulp

purescriptのコマンド体系、色々難しくて、それをラップして僕みたいな雑な人間からも扱いやすくしてくれる


インストール

Haskellとnodeのインストールは各自任せる

cabal install purescript

npm install pulp -g

~/s/pulp-test $ psc --version

0.6.1.1

どんなコマンドがあるかみてみる

~/s/pulp-test $ pulp -h

Usage: cyan <command> [options]

Options:

--help -h Show this help message

--command * [string]

--bower-file -b Read this bower.json file instead of autodetecting it [string]

--build-path -o Path for compiler output (default './build') [string]

--main -m Application's entry point [string]

--to -t Output file name for bundle (default stdout) [string]

--transform Apply a Browserify transform [string]

--source-map Tell Browserify to generate source maps [string]

--watch -w Watch source directories and re-run command if something changes [boolean]

--force For 'pulp init', overwrite any project found in the current directory [boolean]

--optimise -O Perform dead code elimination when browserifying [boolean]

Available commands:

init - Generate an example PureScript project
install - Download and install project dependencies
build - Build the project
test - Run project tests
browserify - Produce a deployable bundle using Browserify
run - Compile and run the project
docgen - Generate project documentation
psci - Launch a PureScript REPL configured for the project


pulp init で初期化

~/s/pulp-test $ pulp init

* Generating project skeleton in /Users/mizchi/sandbox/pulp-test

~/s/pulp-test $ ls
total 8
drwxr-xr-x 5 mizchi staff 170B 12 6 16:53 .
drwxr-xr-x 19 mizchi staff 646B 12 6 16:37 ..
-rw-r--r-- 1 mizchi staff 171B 12 6 16:53 bower.json
drwxr-xr-x 3 mizchi staff 102B 12 6 16:53 src
drwxr-xr-x 3 mizchi staff 102B 12 6 16:53 test

こんなディレクトリになってるはず

~/s/pulp-test $ tree

.
├── bower.json
├── src
│   └── Main.purs
└── test
└── Main.purs

2 directories, 3 files


pulp install

bower installのエイリアスっぽい


ビルドする

pulp buildコマンドを叩いてみるとoutputディレクトリができた

~/s/pulp-test $ pulp build

* Building project in /Users/mizchi/sandbox/pulp-test
* Build successful.

~/s/pulp-test $ tree output
output
├── Control.Monad.Eff
│   ├── externs.purs
│   └── index.js
├── Control.Monad.Eff.Unsafe
│   ├── externs.purs
│   └── index.js
├── Control.Monad.ST
│   ├── externs.purs
│   └── index.js
├── Data.Eq
│   ├── externs.purs
│   └── index.js
├── Data.Function
│   ├── externs.purs
│   └── index.js
├── Debug.Trace
│   ├── externs.purs
│   └── index.js
├── Main
│   ├── externs.purs
│   └── index.js
├── Prelude
│   ├── externs.purs
│   └── index.js
└── Prelude.Unsafe
├── externs.purs
└── index.js

標準ライブラリ的なものが出力されてるのかな。

このままだと使いにくいので pulp broserify コマンドで一つにまとめてみる。

~/s/pulp-test $ pulp browserify --to all.js

* Browserifying project in /Users/mizchi/sandbox/pulp-test
* Building project in /Users/mizchi/sandbox/pulp-test
* Build successful.
* Browserifying...
* Browserified.

ここまでだったらまだnodeで動く気がするので、実行してみる

~/s/pulp-test $ node all.js 

Hello sailor!

ビンゴ


pulp psci

このプロジェクトのリソースを読み込んだ状態で、インタラクティブシェルに入る

~/s/pulp-test $ pulp psci

____ ____ _ _
| _ \ _ _ _ __ ___/ ___| ___ _ __(_)_ __ | |_
| |_) | | | | '__/ _ \___ \ / __| '__| | '_ \| __|
| __/| |_| | | | __/___) | (__| | | | |_) | |_
|_| \__,_|_| \___|____/ \___|_| |_| .__/ \__|
|_|

:? shows help

Expressions are terminated using Ctrl+D
> :?
The following commands are available:

:? Show this help menu
:i <module> Import <module> for use in PSCI
:b <module> Browse <module>
:m <file> Load <file> for importing
:q Quit PSCi
:r Reset
:s import Show imported modules
:s loaded Show loaded modules
:t <expr> Show the type of <expr>
:k <type> Show the kind of <type>
> :i Main
Compiling Prelude
Compiling Prelude.Unsafe
Compiling Data.Function
Compiling Data.Eq
Compiling Control.Monad.Eff
Compiling Control.Monad.Eff.Unsafe
Compiling Control.Monad.ST
Compiling Debug.Trace
Compiling Main
Compiling Test.Main
>

Mainがロードできた。


外部パッケージを読んでみる

bowerからpurescript-reactをいれてみる

purescript-contrib/purescript-react

bower install purescript-react --save

psciから呼べるか確かめてみる

Expressions are terminated using Ctrl+D

> :i React
Compiling React
Compiling React.DOM
>

いけそう

サンプルコードを試す

module Main where

import React
import React.DOM

hello = mkUI spec do
props <- getProps
return $ h1 [
className "Hello"
] [
text "Hello, ",
text props.name
]

incrementCounter = do
val <- readState
writeState (val + 1)

counter = mkUI spec { getInitialState = return 0 } do
val <- readState
return $ p [
className "Counter",
onClick incrementCounter
] [
text (show val),
text " Click me to increment!"
]

main = do
let component = div {} [hello {name: "World"}, counter {}]
renderToBody component

buildしようとしたらコケた

~/s/pulp-test $ pulp build

* Building project in /Users/mizchi/sandbox/pulp-test
Reading ./output/Prelude/externs.purs
Reading ./output/Prelude.Unsafe/externs.purs
Reading ./output/Data.Function/externs.purs
Reading ./output/Data.Eq/externs.purs
Reading ./output/Control.Monad.Eff/externs.purs
Reading ./output/Control.Monad.Eff.Unsafe/externs.purs
Reading ./output/Control.Monad.ST/externs.purs
Reading ./output/Debug.Trace/externs.purs
Compiling React
Writing ./output/React/index.js
Writing ./output/React/externs.purs
Compiling React.DOM
Writing ./output/React.DOM/index.js
Writing ./output/React.DOM/externs.purs
Compiling Main
Error at src/Main.purs line 29, column 7:
Error in declaration counter
Cannot unify Control.Monad.Eff.Eff with Prim.Function.
* ERROR: Subcommand terminated with error code 1

今ちょっとここを追う気力はない…が、まあなんかライブラリも呼べることがわかって満足した。あとは強い人達に任せます。