jlesquembre / clj-nix

Nix helpers for Clojure projects
https://jlesquembre.github.io/clj-nix/
Eclipse Public License 2.0
138 stars 19 forks source link

deps-lock missing deps for tools alias target #110

Open sg-qwt opened 6 months ago

sg-qwt commented 6 months ago

When alias is added as tools alias in deps.edn:

https://clojure.org/guides/tools_build#_setup

example:

{:paths ["src"] 
 :deps {} 

 :aliases
 {
  :build {:extra-paths ["build"]
              :extra-deps {io.github.clojure/tools.build {:mvn/version "0.9.6"}}
              :ns-default build}}}

build/build.clj

(ns build
  (:require [clojure.tools.build.api :as b]
            [clojure.tools.deps :as deps]
            [clojure.java.io :as io]
            [clojure.data.json :as json]))

(defn- str->json
  [s]
  (if s (json/read-str s :key-fn keyword) {}))

(defn- get-paths
  "Get paths from deps.edn file"
  [deps]
  (-> deps
    io/file
    deps/slurp-deps
    :paths
    (or ["src"])))

(defn- common-compile-options
  [{:keys [lib-name version]}]
  (let [lib-name (if (qualified-symbol? (symbol lib-name))
                   (symbol lib-name)
                   (symbol lib-name lib-name))]
    {:src-dirs   (get-paths "deps.edn")
     :basis      (b/create-basis {:project "deps.edn"})
     :lib-name   lib-name
     :output-jar (format "target/%s-%s.jar"
                         (name lib-name)
                         version)}))

(defn- parse-compile-clj-opts
  "Transform JSON string to the expect Clojure data type (keywords, symbols, ...)"
  [opts]
  (cond-> opts
    (:ns-compile opts)
    (update :ns-compile #(mapv symbol %))

    (:sort opts)
    (update :sort keyword)

    (get-in opts [:compile-opts :elide-meta])
    (update-in [:compile-opts :elide-meta] #(mapv keyword %))

    (:filter-nses opts)
    (update :filter-nses #(mapv symbol %))

    (:use-cp-file opts)
    (update :use-cp-file keyword)))

(def class-dir "target/classes")

(defn uberjar
  [opts]
  (let [{:keys [main-ns compile-clj-opts]
         :as   opts}
        (-> opts
            (update :compile-clj-opts str->json))

        {:keys [src-dirs basis output-jar]} (common-compile-options opts)]

    (b/copy-dir {:src-dirs   src-dirs
                 :target-dir class-dir})

    (b/compile-clj (cond-> {:basis      basis
                            :src-dirs   src-dirs
                            :ns-compile [(symbol main-ns)]
                            :class-dir  class-dir}
                     compile-clj-opts (merge (parse-compile-clj-opts compile-clj-opts))))

    (b/uber {:class-dir class-dir
             :uber-file output-jar
             :basis     basis
             :main      main-ns})))

When you run clojure -T:build uberjar :lib-name 'xx/xx' :version 'dev' :main-ns 'xx.core' first time for example, you'd observe tools alias is downloading

Downloading: org/clojure/tools.cli/1.0.214/tools.cli-1.0.214.pom from central
Downloading: org/clojure/core.async/1.6.673/core.async-1.6.673.pom from central
Downloading: commons-codec/commons-codec/1.11/commons-codec-1.11.pom from central
Downloading: org/apache/commons/commons-parent/42/commons-parent-42.pom from central
Downloading: org/apache/apache/18/apache-18.pom from central
Downloading: org/clojure/tools.analyzer.jvm/1.2.2/tools.analyzer.jvm-1.2.2.pom from central
Downloading: org/clojure/tools.analyzer/1.1.0/tools.analyzer-1.1.0.pom from central
Downloading: org/clojure/tools.analyzer/1.1.0/tools.analyzer-1.1.0.jar from central
Downloading: org/clojure/tools.cli/1.0.214/tools.cli-1.0.214.jar from central
Downloading: org/clojure/core.async/1.6.673/core.async-1.6.673.jar from central
Downloading: commons-codec/commons-codec/1.11/commons-codec-1.11.jar from central
Downloading: org/clojure/tools.analyzer.jvm/1.2.2/tools.analyzer.jvm-1.2.2.jar from central

Those deps do not get added when processing deps.edn with alias :build, thus when using buildCommand

            buildCommand = ''
              clj -T:build uberjar :lib-name '${name}' :version '${version}' :main-ns '${main-ns}'
            '';

would cause the build to fail due to those missing ones from deps-lock.json