Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

継続的にタスクを実行するleiningen plugin

こんにちわ、高校生です。
leiningenも2.0-previewが出てきていろいろ機能強化されてきていますね。
ただleiningen 2.0ではinteractiveタスクがなくなっています。
ビルド毎にleiningenを起動をするのもだるいなあと思い、プロジェクト内のファイル変更を監視し
タスクを起動するpluginを書きました。
もちろんleiningen 2.0じゃないと動きません。

(ns leiningen.cont
  "Continuous target task"
  (:use [clojure.string :only (split)]
        [clojure.repl :only (pst)])
  (:require [leiningen.help :as help]
            [watchdog :as watchdog]))

(defn- create-taskmap [task x]
  (let [func-name (second (split (str task) #"\."))]
    (assoc x func-name (str task))))

(defmacro import-task []
  (loop [task help/tasks x {}]
    (if (nil? task)
      `(def ^:dynamic *task* ~x)
      (do
        (require (first task))
        (recur (next task) (create-taskmap (first task) x))))))

(import-task)

(defn- get-lein-tasks [tasks]
  (loop [args tasks result nil]
    (if (nil? args)
      (reverse result)
      (recur (next args)
             (conj result [(get *task* (first args)) (first args)])))))

(defn- call-task [[nm k] project]
  (let [nm-map (ns-interns (symbol nm))
        fun (get nm-map (symbol k))]
    (fn [x]
      (apply fun [project]))))

(defn- create-func [tasks project]
  (fn [x]
    (try
      (println "Change Files" x)
      (loop [nms tasks]
        (if (nil? nms)
          nil
          (do
            ((call-task (first nms) project) x)
            (recur (next nms)))))
      (catch Exception _ ))))

(defn cont [project & args]
  (let [paths (concat [(str (:root project) "/project.clj")]
                    (:source-paths project)
                    (:resource-paths project)
                    (:test-pathes project))
        tasks (get-lein-tasks args)
        task-func (create-func tasks project)]
    (watchdog/set-interval (* 1000))
    (binding [leiningen.test/*exit-after-tests* false]
      (watchdog/watch-start paths task-func))))

恐ろしくベタですね。
監視してるファイルはproject.cljも含み、source, resource, testです。
既にClojarsにあげているのでlein-contで検索すれば出てくると思います。
使い方としてはpluginをインストールし、

lein cont

でファイル監視を行い継続的にタスクを実行します。

autotest風にするならば

lein cont test

定期的に文法などのチェックを行うなら

lein cont check

複数のタスクを実行したりすることもできます。

lein cont check test

ソースなどはgithubにあがってるので何かあればそちらへ。