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))
|
(concat (.getInputArguments (ManagementFactory/getRuntimeMXBean))
|
||||||
(:jvm-opts project)))
|
(: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
|
;; TODO: split this function up
|
||||||
(defn eval-in-project
|
(defn eval-in-project
|
||||||
"Executes form in an isolated classloader with the classpath and compile path
|
"Executes form in an isolated classloader with the classpath and compile path
|
||||||
|
@ -125,26 +142,22 @@
|
||||||
(.setValue (.createJvmarg java) arg)))
|
(.setValue (.createJvmarg java) arg)))
|
||||||
(.setClassname java "clojure.main")
|
(.setClassname java "clojure.main")
|
||||||
(.setValue (.createArg java) "-e")
|
(.setValue (.createArg java) "-e")
|
||||||
(let [cp (str (.getClasspath (.getCommandLine java)))
|
(.setValue (.createArg java) (get-readable-form java project form))
|
||||||
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))
|
|
||||||
;; to allow plugins and other tasks to customize
|
;; to allow plugins and other tasks to customize
|
||||||
(when handler (handler java))
|
(when handler (handler java))
|
||||||
(.executeJava 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
|
(defn compile
|
||||||
"Ahead-of-time compile the namespaces given under :aot in project.clj or
|
"Ahead-of-time compile the namespaces given under :aot in project.clj or
|
||||||
those given as command-line arguments."
|
those given as command-line arguments."
|
||||||
|
|
|
@ -131,7 +131,7 @@
|
||||||
(:arglists (meta (resolve-task task-name))))
|
(:arglists (meta (resolve-task task-name))))
|
||||||
|
|
||||||
(defn project-needed? [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]
|
(defn matching-arity? [task-name project args]
|
||||||
(let [arg-count (if (project-needed? task-name)
|
(let [arg-count (if (project-needed? task-name)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
(ns leiningen.repl
|
(ns leiningen.repl
|
||||||
(:require [clojure.main])
|
(: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]])
|
[clojure.java.io :only [copy]])
|
||||||
(:import [java.net Socket]
|
(:import [java.net Socket]
|
||||||
[java.io OutputStreamWriter InputStreamReader File]))
|
[java.io OutputStreamWriter InputStreamReader File]))
|
||||||
|
@ -74,13 +74,16 @@
|
||||||
(defn repl
|
(defn repl
|
||||||
"Start a repl session. A socket-repl will also be launched in the
|
"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."
|
background; use the LEIN_REPL_PORT environment variable to set the port."
|
||||||
[project]
|
([] (repl {}))
|
||||||
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
|
([project]
|
||||||
port (Integer. (or (System/getenv "LEIN_REPL_PORT")
|
(let [host (or (System/getenv "LEIN_REPL_HOST") "localhost")
|
||||||
(dec (+ 1024 (rand-int 64512)))))
|
port (Integer. (or (System/getenv "LEIN_REPL_PORT")
|
||||||
server-form (repl-server project host port)
|
(dec (+ 1024 (rand-int 64512)))))
|
||||||
server-thread (Thread. #(try (eval-in-project project server-form)
|
server-form (repl-server project host port)
|
||||||
(catch Exception _)))]
|
server-thread (Thread. #(try (if (empty? project)
|
||||||
(.start server-thread)
|
(eval-without-project server-form)
|
||||||
(poll-for-socket port)
|
(eval-in-project project server-form))
|
||||||
(.stop server-thread)))
|
(catch Exception _)))]
|
||||||
|
(.start server-thread)
|
||||||
|
(poll-for-socket port)
|
||||||
|
(.stop server-thread))))
|
||||||
|
|
Loading…
Reference in a new issue