ClojureやClojureScriptを使って、ちょっとしたコマンドラインのプログラムを作る方法はたくさんあります。
多くはleiningenやbootを使ったもので、高機能かつ素晴らしいものですが、個人的に欲しいものは以下のものです。
- NodeJS上で動くコマンドのためのプロジェクトを自動生成できる
- clojurescriptで処理を記述できる
- プロジェクト生成のジェネレータの起動に時間がほとんどかからない
- 起動から実行までの時間も早い
- ビルドもなるべく時間がかからない。leiningenやbootにも依存しない
- npmでインストール可能
- ビルド時は、コマンドのインストールまでやってくれる
- なんか楽しそう(コマンドの実行結果がキャッチー)
何を作ったの?
chochoi
というClojureScriptベースのCLIコマンドを生成可能なツールです。chochoi
は日本語でいう「ちょちょい」であり、簡単かつ迅速にコマンドプロジェクトを作成します。
hello
というコマンドを作りたいときに、chochoi new hello
と実行することで、hello
コマンドをビルド可能なプロジェクトファイル一式が生成されます。
まだバージョンは0.0.5
でして、発展途上です。descjopを作ってた時に、自動生成関係で「うーん」と思っていた部分が主に改善されているはずです。(descjopもこっちベースで作り直す予定)
※ まだMacでしか動作確認はしていません。Windowsはパスの問題を解決する必要がありそうです。Linuxはたぶん動きそう。
使い始める前の準備
cljs.jar
を https://github.com/clojure/clojurescript/releases/latest でダウンロードしておき、これをローカルストレージのどこかに配置します。
そして、CLJS_PATH
という環境変数を設定しておきます。
こんな感じです。
export CLJS_PATH="/Users/XXXXX/.cljs/cljs.jar"
chochoiのインストール
chochoi
をインストールします
$ npm install -g chochoi
helloプロジェクトをつくってみる
例として、hello
というコマンドを作ってみましょう。
chochoi new hello
を実行するとこんな風にファイルが生成されます。
$ chochoi new hello
⚡ init chochoi project...
------------------------------------
- create : ./hello
- create : ./hello/src/hello
- create : hello/src/hello/core.cljs
- create : hello/src/hello/command.cljs
- create : hello/.gitignore
- create : hello/build.clj
- create : hello/build.js
- create : hello/config.js
- create : hello/package.json
- create : hello/README.md
------------------------------------
👍 completed.
helloプロジェクトをビルドをする
helloディレクトリが生成されているので、移動し、chochoi build
コマンドを実行します。
$ cd hello
$ chochoi build
⚡ build chochoi project...
completed linked command.
completed clojurescript build.
up to date in 0.055s
/Users/XXXXX/.nvm/versions/node/v8.7.0/bin/hello -> /Users/XXXXX/.nvm/versions/node/v8.7.0/lib/node_modules/hello/out/main.js
/Users/XXXXX/.nvm/versions/node/v8.7.0/lib/node_modules/hello -> /Users/XXXXX/study/chochoi/hello
👍 completed.
すると、ビルドが完了し、なおかつ、コマンドとして登録されます。
実行する
あとは実行するだけです。
$ hello kaz
Hello world! kaz
すぐ起動するし、速いですね!
処理をいじるには
src/hello/command.cljs
で実行処理が書かれているので、ここを変更するだけです。
(ns hello.command
(:require [cljs.nodejs :as nodejs]))
(defn command [args]
(println "Hello world!" (str (first args))))
みなさまの、ごスターをお待ちしております
Top comments (0)