Skip to content

Instantly share code, notes, and snippets.

@zentrope
Created November 15, 2014 22:02
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zentrope/b81370b7cec05d6ae500 to your computer and use it in GitHub Desktop.
Save zentrope/b81370b7cec05d6ae500 to your computer and use it in GitHub Desktop.
;; -*- mode: clojure; -*-
(set-env!
:src-paths #{"src/clj" "src/cljs"}
:rsc-paths #{"resources"}
:update :always
:dependencies '[[org.clojure/clojure "1.7.0-alpha4"]
[org.clojure/core.async "0.1.346.0-17112a-alpha"]
[com.taoensso/timbre "3.3.1-1cd4b70"]
[http-kit "2.1.19"]
[ring/ring-core "1.3.1"]
[org.clojure/clojurescript "0.0-2371" :scope "provided"]
[om "0.8.0-alpha2" :scope "provided"]
[sablono "0.2.22" :scope "provided"]
[adzerk/boot-cljs "0.0-2371-25" :scope "provided"]
[adzerk/boot-cljs-repl "0.1.5" :scope "provided"]
[adzerk/boot-reload "0.1.5" :scope "provided"]
[cider/cider-nrepl "0.8.0-SNAPSHOT" :scope "provided"]
[org.clojure/tools.nrepl "0.2.6" :scope "provided"]])
(require
'[adzerk.boot-cljs :refer :all]
'[adzerk.boot-cljs-repl :refer :all]
'[adzerk.boot-reload :refer :all]
'[cider.nrepl :refer [cider-middleware]]
'[manager.main :as app])
(task-options!
pom [:project 'mgmt :version "1"]
aot [:all true]
jar [:file "manager.jar" :main 'manager.main]
uber [:exclude-scope #{"provided"}]
cljs [:output-to "main.js" :optimizations :whitespace :pretty-print true])
(deftask emacs-repl
"Start an Emacs Cider REPL."
[]
(repl :middleware (map resolve cider-middleware)
:server true)
(wait))
(deftask dev
"Develop with clojurescript."
[]
(comp (watch)
(speak)
(cljs-repl)
(cljs)
(reload)))
(deftask uberjar
"Create an uberjar."
[]
(comp (cljs)
(aot)
(add-src)
(uber)
(jar)))
(deftask run
"Run the app."
[]
(comp (speak)
(cljs)
(with-pre-wrap
(app/-main []))))
(ns manager.main
(:require
[taoensso.timbre :refer [info]]
[clojure.pprint :refer [pprint]]
[ring.util.response :refer [resource-response]]
[org.httpkit.server :as httpd])
(:gen-class))
(defn- make-app
[]
(fn [request]
(cond
(= (:uri request) "/")
(resource-response "index.html")
:else
(resource-response (:uri request)))))
;;-----------------------------------------------------------------------------
;; HTTPD concerns
(defn start-httpd!
[httpd]
(let [s (httpd/run-server (make-app) {:port 2112
:worker-name-prefix "hkit-"})]
(info " - Running web application on http://localhost:2112.")
(reset! httpd s)))
(defn stop-httpd!
[httpd]
(when-let [s @httpd]
(s))
(reset! httpd nil))
(defn make-httpd
[]
(atom nil))
;;-----------------------------------------------------------------------------
;; Application Bootstrap Concerns
(defn- hook-shutdown!
[f]
(doto (Runtime/getRuntime)
(.addShutdownHook (Thread. f))))
(defn- boot!
[system]
(info "Booting system.")
(let [httpd (make-httpd)]
(swap! system assoc :httpd httpd)
(start-httpd! httpd)))
(defn- crash!
[system]
(info "System shutting down.")
(stop-httpd! (:httpd @system))
(swap! system dissoc :httpd))
(defonce ^:private system
(atom {}))
;;-----------------------------------------------------------------------------
;; Application Entry Point
(defn -main
[& args]
(info "Welcome to the Mgmt Application")
(let [lock (promise)]
(hook-shutdown! (fn [] (crash! system)))
(hook-shutdown! (fn [] (deliver lock :done)))
(boot! system)
@lock
(System/exit 0)))
@micha
Copy link

micha commented Nov 15, 2014

(deftask run
  "Start the server in a background thread."
  []
  (let [start (delay (future (app/-main [])))]
    (with-pre-wrap @start)))
(deftask run
  "Start the server in a background thread (possibly fubar)."
  []
  (let [start (delay (app/-main []))
        server (atom nil)]
    (cleanup (@server))
    (with-pre-wrap (reset! server @start))))
(deftask dev
  "Develop with clojurescript."
  []
  (comp (watch)
        (speak)
        (cljs-repl)
        (cljs)
        (reload)
        (run)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment