diff --git a/src/babashka/impl/tasks.clj b/src/babashka/impl/tasks.clj index b54ec81d..2dcb3bcf 100644 --- a/src/babashka/impl/tasks.clj +++ b/src/babashka/impl/tasks.clj @@ -1,5 +1,6 @@ (ns babashka.impl.tasks - (:require [babashka.impl.common :refer [bb-edn]] + (:require [babashka.impl.classpath :as cp] + [babashka.impl.common :refer [bb-edn]] [babashka.impl.deps :as deps] [babashka.process :as p] [clojure.java.io :as io] @@ -181,8 +182,11 @@ prog (wrap-def task-name prog parallel? last? log-level)] prog))))) -(defn format-task [init requires prog] +(defn format-task [init extra-paths extra-deps requires prog] (format " +%s ;; extra-paths +%s ;; extra-deps + (ns %s %s) (require '[babashka.tasks]) (when-not (resolve 'clojure) @@ -194,6 +198,12 @@ %s %s" + (if (seq extra-paths) + (format "(babashka.classpath/add-classpath \"%s\")" (str/join cp/path-sep extra-paths)) + "") + (if (seq extra-deps) + (format "(babashka.deps/add-deps '%s)" (pr-str {:deps extra-deps})) + "") (gensym "user") (if (seq requires) (format "(:require %s)" (str/join " " requires)) @@ -228,6 +238,8 @@ (let [targets (target-order tasks task-name)] (loop [prog "" targets (seq targets) + extra-paths [] + extra-deps nil requires requires] (let [t (first targets) targets (next targets)] @@ -235,6 +247,8 @@ (if-let [task (get tasks t)] (recur (str prog "\n" (assemble-task-1 t task log-level parallel?)) targets + (concat extra-paths (:extra-paths task)) + (merge extra-deps (:extra-deps task)) (concat requires (:requires task))) [(binding [*out* *err*] (println "No such task:" task-name)) 1]) @@ -243,12 +257,16 @@ (apply str (map deref-task depends)) "\n" (assemble-task-1 t task log-level parallel? true)) + extra-paths (concat extra-paths (:extra-paths task)) + extra-deps (merge extra-deps (:extra-deps task)) requires (concat requires (:requires task))] - [[(format-task init requires prog)] nil]) + [[(format-task init extra-paths extra-deps requires prog)] nil]) [(binding [*out* *err*] (println "No such task:" task-name)) 1]))))) [[(format-task init + (:extra-paths task) + (:extra-deps task) (concat requires (:requires task)) (assemble-task-1 task-name task log-level parallel? true))] nil])] (when (= "true" (System/getenv "BABASHKA_DEV")) diff --git a/test-resources/task_test_scripts/task_test.clj b/test-resources/task_test_scripts/task_test.clj new file mode 100644 index 00000000..4e5288c6 --- /dev/null +++ b/test-resources/task_test_scripts/task_test.clj @@ -0,0 +1,4 @@ +(ns task-test) + +(defn task-test-fn [] + :task-test-fn) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 8a664737..ce6541c0 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -126,7 +126,19 @@ (test-utils/with-config {:paths ["test-resources/task_scripts"] :tasks '{foo {:requires ([tasks :as t]) :task t/foo}}} - (is (= :foo (bb "run" "--prn" "foo")))))) + (is (= :foo (bb "run" "--prn" "foo"))))) + (testing "extra-paths" + (test-utils/with-config {:paths ["test-resources/task_scripts"] + :tasks '{:requires ([tasks :as t]) + foo {:extra-paths ["test-resources/task_test_scripts"] + :requires ([task-test :as tt]) + :task tt/task-test-fn}}} + (is (= :task-test-fn (bb "run" "--prn" "foo"))))) + (testing "extra-deps" + (test-utils/with-config {:tasks '{foo {:extra-deps {medley/medley {:mvn/version "1.3.0"}} + :requires ([medley.core :as m]) + :task (m/index-by :id [{:id 1} {:id 2}])}}} + (is (= {1 {:id 1}, 2 {:id 2}} (bb "run" "--prn" "foo")))))) (deftest list-tasks-test (test-utils/with-config {}