diff --git a/CHANGELOG.md b/CHANGELOG.md index 6030ce0e..ab9128dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ A preview of the next release can be installed from ## Unreleased -... +- [#1473](https://github.com/babashka/babashka/issues/1473): make relative paths in bb.edn resolve relative to it ([@lispyclouds](https://github.com/lispyclouds)) ## 1.1.172 (2023-01-23) diff --git a/deps.clj b/deps.clj index 1fb9dd8c..c3b95876 160000 --- a/deps.clj +++ b/deps.clj @@ -1 +1 @@ -Subproject commit 1fb9dd8cbf939f68f8a9ff57667b3b677c958d2e +Subproject commit c3b9587619902a04b5ec166e986b3c31b72e2d82 diff --git a/src/babashka/impl/deps.clj b/src/babashka/impl/deps.clj index c6cfb413..237dec23 100644 --- a/src/babashka/impl/deps.clj +++ b/src/babashka/impl/deps.clj @@ -59,42 +59,46 @@ then used to resolve dependencies in babashka." ([deps-map] (add-deps deps-map nil)) ([deps-map {:keys [:aliases :env :extra-env :force]}] - (when-let [paths (:paths deps-map)] - (let [paths (if-let [deps-root (:deps-root @bb-edn)] - (let [deps-root (fs/absolutize deps-root) - paths (mapv #(str (fs/file deps-root %)) paths)] - paths) - paths)] - (cp/add-classpath (str/join cp/path-sep paths)))) - (let [need-deps? (or (seq (:deps deps-map)) - (and (:aliases deps-map) - aliases))] - (when need-deps? - (let [deps-map (dissoc deps-map - ;; paths are added manually above - ;; extra-paths are added as :paths in tasks - :paths :tasks :raw :file :deps-root - :min-bb-version)] - (binding [*print-namespace-maps* false] - (let [deps-map (assoc-in deps-map [:aliases :org.babashka/defaults] - {:replace-paths [] ;; babashka sets paths manually - :classpath-overrides (cond-> - '{org.clojure/clojure "" - org.clojure/spec.alpha ""} - ;; only remove core specs when they are not mentioned in deps map - (not (str/includes? (str deps-map) "org.clojure/core.specs.alpha")) - (assoc 'org.clojure/core.specs.alpha ""))}) - args (list "-Srepro" ;; do not include deps.edn from user config - "-Spath" "-Sdeps" (str deps-map) - "-Sdeps-file" "") ;; we reset deps file so the local deps.edn isn't used - args (if force (cons "-Sforce" args) args) - args (concat args [(str "-A:" (str/join ":" (cons ":org.babashka/defaults" aliases)))]) - cp (with-out-str (binding [deps/*env* env - deps/*extra-env* extra-env] - (apply deps/-main args))) - cp (str/trim cp) - cp (str/replace cp (re-pattern (str cp/path-sep "+$")) "")] - (cp/add-classpath cp)))))))) + (let [deps-root (:deps-root @bb-edn)] + (when-let [paths (:paths deps-map)] + (let [paths (if deps-root + (let [deps-root (fs/absolutize deps-root) + paths (mapv #(str (fs/file deps-root %)) paths)] + paths) + paths)] + (cp/add-classpath (str/join cp/path-sep paths)))) + (let [need-deps? (or (seq (:deps deps-map)) + (and (:aliases deps-map) + aliases))] + (when need-deps? + (let [deps-map (dissoc deps-map + ;; paths are added manually above + ;; extra-paths are added as :paths in tasks + :paths :tasks :raw :file :deps-root + :min-bb-version)] + (binding [*print-namespace-maps* false] + (let [deps-map (assoc-in deps-map [:aliases :org.babashka/defaults] + {:replace-paths [] ;; babashka sets paths manually + :classpath-overrides (cond-> + '{org.clojure/clojure "" + org.clojure/spec.alpha ""} + ;; only remove core specs when they are not mentioned in deps map + (not (str/includes? (str deps-map) "org.clojure/core.specs.alpha")) + (assoc 'org.clojure/core.specs.alpha ""))}) + args (list "-Srepro" ;; do not include deps.edn from user config + "-Spath" "-Sdeps" (str deps-map) + "-Sdeps-file" "__babashka_no_deps_file__.edn") ;; we reset deps file so the local deps.edn isn't used + args (if force (cons "-Sforce" args) args) + args (concat args [(str "-A:" (str/join ":" (cons ":org.babashka/defaults" aliases)))]) + bindings (cond-> + {#'deps/*env* env + #'deps/*extra-env* extra-env} + deps-root (assoc #'deps/*dir* (str deps-root))) + cp (with-out-str (with-bindings bindings + (apply deps/-main args))) + cp (str/trim cp) + cp (str/replace cp (re-pattern (str cp/path-sep "+$")) "")] + (cp/add-classpath cp))))))))) (def deps-namespace {'add-deps (sci/copy-var add-deps dns) diff --git a/test/babashka/bb_edn_test.clj b/test/babashka/bb_edn_test.clj index 67dd1244..4a8a87f0 100644 --- a/test/babashka/bb_edn_test.clj +++ b/test/babashka/bb_edn_test.clj @@ -483,3 +483,30 @@ even more stuff here\" "{:deps {}}" (is (= {1 {:a 1}} (bb "-Sdeps" "{:deps {medley/medley {:mvn/version \"1.4.0\"}}}" "-e" "(require 'medley.core) (medley.core/index-by :a [{:a 1}])"))))) + +(deftest deps-root-test + (fs/with-temp-dir [dir {}] + (let [f (fs/file dir "bb.edn") + config (str f)] + (spit config + '{:paths ["src"] + :tasks {cp (prn (babashka.classpath/get-classpath))}}) + (testing "custom deps-root path" + (let [out (bb "--config" config "--deps-root" (str dir) "cp") + entries (cp/split-classpath out)] + (is (= 1 (count entries))) + (is (= (fs/file dir "src") (fs/file (first entries)))))) + (testing "default deps-root path is same as bb.edn" + (let [out (bb "--config" config "cp") + entries (cp/split-classpath out)] + (is (= (fs/parent f) (fs/parent (first entries)))))) + (spit config + '{:paths ["src"] + :deps {local/dep {:local/root "local-dep"}} + :tasks {cp (prn (babashka.classpath/get-classpath))}}) + (testing "relative paths in deps should be relative to bb.edn" + (let [root (fs/create-dir (fs/file dir "local-dep")) + _ (spit (str (fs/file root "deps.edn")) {}) + out (bb "--config" config "cp") + entries (cp/split-classpath out)] + (is (= (fs/parent f) (fs/parent (first entries)))))))))