allow repl outside of a project
This commit is contained in:
parent
eeb32c8371
commit
6dbfd8b2a9
3 changed files with 44 additions and 28 deletions
|
@ -89,6 +89,23 @@
|
|||
(concat (.getInputArguments (ManagementFactory/getRuntimeMXBean))
|
||||
(:jvm-opts project)))
|
||||
|
||||
(defn get-readable-form [java project form]
|
||||
(let [cp (str (.getClasspath (.getCommandLine java)))
|
||||
form `(do (def ~'*classpath* ~cp)
|
||||
(set! ~'*warn-on-reflection*
|
||||
~(:warn-on-reflection project))
|
||||
~form)]
|
||||
(if (= (get-os) :windows)
|
||||
;; work around java's command line handling
|
||||
;; on windows http://bit.ly/9c6biv
|
||||
;; This isn't perfect, but works for what's
|
||||
;; currently being passed see
|
||||
;; http://www.perlmonks.org/?node_id=300286
|
||||
;; for some of the landmines involved in
|
||||
;; doing it properly
|
||||
(pr-str (pr-str form))
|
||||
(prn-str form))))
|
||||
|
||||
;; TODO: split this function up
|
||||
(defn eval-in-project
|
||||
"Executes form in an isolated classloader with the classpath and compile path
|
||||
|
@ -125,26 +142,22 @@
|
|||
(.setValue (.createJvmarg java) arg)))
|
||||
(.setClassname java "clojure.main")
|
||||
(.setValue (.createArg java) "-e")
|
||||
(let [cp (str (.getClasspath (.getCommandLine java)))
|
||||
form `(do (def ~'*classpath* ~cp)
|
||||
(set! ~'*warn-on-reflection*
|
||||
~(:warn-on-reflection project))
|
||||
~form)
|
||||
readable-form (if (= (get-os) :windows)
|
||||
;; work around java's command line handling
|
||||
;; on windows http://bit.ly/9c6biv
|
||||
;; This isn't perfect, but works for what's
|
||||
;; currently being passed see
|
||||
;; http://www.perlmonks.org/?node_id=300286
|
||||
;; for some of the landmines involved in
|
||||
;; doing it properly
|
||||
(pr-str (pr-str form))
|
||||
(prn-str form))]
|
||||
(.setValue (.createArg java) readable-form))
|
||||
(.setValue (.createArg java) (get-readable-form java project form))
|
||||
;; to allow plugins and other tasks to customize
|
||||
(when handler (handler java))
|
||||
(.executeJava java)))
|
||||
|
||||
(defn eval-without-project [form]
|
||||
(let [java (Java.)]
|
||||
(.setProject java lancet/ant-project)
|
||||
(.setFailonerror java true)
|
||||
(.setFork java true)
|
||||
(.setClassname java "clojure.main")
|
||||
(.setValue (.createArg java) "-e")
|
||||
(.setValue (.createArg java) (get-readable-form java {} form))
|
||||
(.executeJava java)))
|
||||
|
||||
|
||||
(defn compile
|
||||
"Ahead-of-time compile the namespaces given under :aot in project.clj or
|
||||
those given as command-line arguments."
|
||||
|
|
|
@ -131,7 +131,7 @@
|
|||
(:arglists (meta (resolve-task task-name))))
|
||||
|
||||
(defn project-needed? [task-name]
|
||||
(some #{'project} (map first (arglists task-name))))
|
||||
(every? #{'project} (map first (arglists task-name))))
|
||||
|
||||
(defn matching-arity? [task-name project args]
|
||||
(let [arg-count (if (project-needed? task-name)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(ns leiningen.repl
|
||||
(:require [clojure.main])
|
||||
(:use [leiningen.compile :only [eval-in-project]]
|
||||
(:use [leiningen.compile :only [eval-in-project eval-without-project]]
|
||||
[clojure.java.io :only [copy]])
|
||||
(:import [java.net Socket]
|
||||
[java.io OutputStreamWriter InputStreamReader File]))
|
||||
|
@ -74,13 +74,16 @@
|
|||
(defn repl
|
||||
"Start a repl session. A socket-repl will also be launched in the
|
||||
background; use the LEIN_REPL_PORT environment variable to set the port."
|
||||
[project]
|
||||
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
|
||||
port (Integer. (or (System/getenv "LEIN_REPL_PORT")
|
||||
(dec (+ 1024 (rand-int 64512)))))
|
||||
server-form (repl-server project host port)
|
||||
server-thread (Thread. #(try (eval-in-project project server-form)
|
||||
(catch Exception _)))]
|
||||
(.start server-thread)
|
||||
(poll-for-socket port)
|
||||
(.stop server-thread)))
|
||||
([] (repl {}))
|
||||
([project]
|
||||
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
|
||||
port (Integer. (or (System/getenv "LEIN_REPL_PORT")
|
||||
(dec (+ 1024 (rand-int 64512)))))
|
||||
server-form (repl-server project host port)
|
||||
server-thread (Thread. #(try (if (empty? project)
|
||||
(eval-without-project server-form)
|
||||
(eval-in-project project server-form))
|
||||
(catch Exception _)))]
|
||||
(.start server-thread)
|
||||
(poll-for-socket port)
|
||||
(.stop server-thread))))
|
||||
|
|
Loading…
Reference in a new issue