hilverd / lein-ns-dep-graph

Show namespace dependencies of Clojure project sources as a graph.
69 stars 14 forks source link

No such var: ns-find/cljs #5

Open eggsyntax opened 6 years ago

eggsyntax commented 6 years ago

Hi! I've got [lein-ns-dep-graph "0.2.0-SNAPSHOT"] in ~/.lein/profiles.clj. dot -V shows version 2.38.0. But I get the following error when running lein ns-dep-graph.

No urgency on my part; mainly just wanted to let you know.

As a wild guess of what might be going on -- the project has only .cljc files, no .clj or .cljs. Not sure whether lein-ns-dep-graph takes cljc into account.

Thanks! While it's not working now, I've gotten good use out of it in the past :)

[12:28] datawalk> lein ns-dep-graph
clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: No such var: ns-find/cljs, compiling:(leiningen/ns_dep_graph.clj:33:18)
 at clojure.lang.Compiler.analyze (Compiler.java:6688)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler$CaseExpr$Parser.parse (Compiler.java:8756)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6001)
    clojure.lang.Compiler$LetExpr$Parser.parse (Compiler.java:6319)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.access$300 (Compiler.java:38)
    clojure.lang.Compiler$LetExpr$Parser.parse (Compiler.java:6269)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6001)
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5380)
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:3972)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6866)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.access$300 (Compiler.java:38)
    clojure.lang.Compiler$DefExpr$Parser.parse (Compiler.java:589)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler.eval (Compiler.java:6931)
    clojure.lang.Compiler.load (Compiler.java:7379)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.loadResourceScript (RT.java:363)
    clojure.lang.RT.load (RT.java:453)
    clojure.lang.RT.load (RT.java:419)
    clojure.core$load$fn__5677.invoke (core.clj:5893)
    clojure.core$load.invokeStatic (core.clj:5892)
    clojure.core$load.doInvoke (core.clj:5876)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5697)
    clojure.core$load_one.invoke (core.clj:5692)
    clojure.core$load_lib$fn__5626.invoke (core.clj:5737)
    clojure.core$load_lib.invokeStatic (core.clj:5736)
    clojure.core$load_lib.doInvoke (core.clj:5717)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$load_libs.invokeStatic (core.clj:5774)
    clojure.core$load_libs.doInvoke (core.clj:5758)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$require.invokeStatic (core.clj:5796)
    clojure.core$require.doInvoke (core.clj:5796)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.core.utils$require_resolve.invokeStatic (utils.clj:91)
    leiningen.core.utils$require_resolve.invoke (utils.clj:84)
    leiningen.core.utils$require_resolve.invokeStatic (utils.clj:94)
    leiningen.core.utils$require_resolve.invoke (utils.clj:84)
    leiningen.core.main$lookup_task_var.invokeStatic (main.clj:68)
    leiningen.core.main$lookup_task_var.invoke (main.clj:64)
    leiningen.core.main$pass_through_help_QMARK_.invokeStatic (main.clj:78)
    leiningen.core.main$pass_through_help_QMARK_.invoke (main.clj:72)
    leiningen.core.main$task_args.invokeStatic (main.clj:81)
    leiningen.core.main$task_args.invoke (main.clj:80)
    leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:327)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:324)
    leiningen.core.main$_main$fn__5998.invoke (main.clj:401)
    leiningen.core.main$_main.invokeStatic (main.clj:394)
    leiningen.core.main$_main.doInvoke (main.clj:391)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.main$main_opt.invokeStatic (main.clj:314)
    clojure.main$main_opt.invoke (main.clj:310)
    clojure.main$main.invokeStatic (main.clj:421)
    clojure.main$main.doInvoke (main.clj:384)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    clojure.lang.Var.invoke (Var.java:388)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
Caused by: java.lang.RuntimeException: No such var: ns-find/cljs
 at clojure.lang.Util.runtimeException (Util.java:221)
    clojure.lang.Compiler.resolveIn (Compiler.java:7138)
    clojure.lang.Compiler.resolve (Compiler.java:7108)
    clojure.lang.Compiler.analyzeSymbol (Compiler.java:7069)
    clojure.lang.Compiler.analyze (Compiler.java:6648)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler$CaseExpr$Parser.parse (Compiler.java:8756)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6001)
    clojure.lang.Compiler$LetExpr$Parser.parse (Compiler.java:6319)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.access$300 (Compiler.java:38)
    clojure.lang.Compiler$LetExpr$Parser.parse (Compiler.java:6269)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler$BodyExpr$Parser.parse (Compiler.java:6001)
    clojure.lang.Compiler$FnMethod.parse (Compiler.java:5380)
    clojure.lang.Compiler$FnExpr.parse (Compiler.java:3972)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6866)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6856)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.access$300 (Compiler.java:38)
    clojure.lang.Compiler$DefExpr$Parser.parse (Compiler.java:589)
    clojure.lang.Compiler.analyzeSeq (Compiler.java:6868)
    clojure.lang.Compiler.analyze (Compiler.java:6669)
    clojure.lang.Compiler.analyze (Compiler.java:6625)
    clojure.lang.Compiler.eval (Compiler.java:6931)
    clojure.lang.Compiler.load (Compiler.java:7379)
    clojure.lang.RT.loadResourceScript (RT.java:372)
    clojure.lang.RT.loadResourceScript (RT.java:363)
    clojure.lang.RT.load (RT.java:453)
    clojure.lang.RT.load (RT.java:419)
    clojure.core$load$fn__5677.invoke (core.clj:5893)
    clojure.core$load.invokeStatic (core.clj:5892)
    clojure.core$load.doInvoke (core.clj:5876)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invokeStatic (core.clj:5697)
    clojure.core$load_one.invoke (core.clj:5692)
    clojure.core$load_lib$fn__5626.invoke (core.clj:5737)
    clojure.core$load_lib.invokeStatic (core.clj:5736)
    clojure.core$load_lib.doInvoke (core.clj:5717)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$load_libs.invokeStatic (core.clj:5774)
    clojure.core$load_libs.doInvoke (core.clj:5758)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$require.invokeStatic (core.clj:5796)
    clojure.core$require.doInvoke (core.clj:5796)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.core.utils$require_resolve.invokeStatic (utils.clj:91)
    leiningen.core.utils$require_resolve.invoke (utils.clj:84)
    leiningen.core.utils$require_resolve.invokeStatic (utils.clj:94)
    leiningen.core.utils$require_resolve.invoke (utils.clj:84)
    leiningen.core.main$lookup_task_var.invokeStatic (main.clj:68)
    leiningen.core.main$lookup_task_var.invoke (main.clj:64)
    leiningen.core.main$pass_through_help_QMARK_.invokeStatic (main.clj:78)
    leiningen.core.main$pass_through_help_QMARK_.invoke (main.clj:72)
    leiningen.core.main$task_args.invokeStatic (main.clj:81)
    leiningen.core.main$task_args.invoke (main.clj:80)
    leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:327)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:324)
    leiningen.core.main$_main$fn__5998.invoke (main.clj:401)
    leiningen.core.main$_main.invokeStatic (main.clj:394)
    leiningen.core.main$_main.doInvoke (main.clj:391)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.lang.Var.invoke (Var.java:379)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.main$main_opt.invokeStatic (main.clj:314)
    clojure.main$main_opt.invoke (main.clj:310)
    clojure.main$main.invokeStatic (main.clj:421)
    clojure.main$main.doInvoke (main.clj:384)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    clojure.lang.Var.invoke (Var.java:388)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
Quezion commented 6 years ago

I worked around this, but do not currently have time to submit a patch. I'd like to document the problem though:

In lein-ns-dep-graph's project.clj, it lists [org.clojure/tools.namespace "0.3.0-alpha3"]. This specific version of clojure/tools adds the ns-find/clj & ns-find/cljs FNs; the same ones that're missing in the above error.

If you're seeing this error, it likely means that an earlier version of org.clojure/tools is being put into your project, perhaps because of a dependency in either your user.clj or project.clj

If you'll add the [org.clojure/tools.namespace "0.3.0-alpha4"] (note that it's on alpha4 now instead of 3) to your user.clj OR the project.clj, you will probably see this error go away.

If the error persists, try checking for org.clojure/tools conflicts on your classpath and fixing them. I haven't tried it, but https://github.com/webnf/lein-collisions may work for this.

eggsyntax commented 6 years ago

Added [org.clojure/tools.namespace "0.3.0-alpha4"] to my ~/.lein/profiles.clj, and it works fine for me too. Thanks, @Quezion , nice work!

eskemojoe007 commented 4 years ago

No amount of tinkering with a luminus template was able to make it work. lein deps :tree shows several overlapping that I removed with :excludes to no avail.

Quezion commented 2 years ago

@eskemojoe007 Unfortunately I ran into the same behavior on a repo today & some fiddling with the tools.namespace dependency wasn't able to fix it. There's a promising option for deps.edn projects at https://github.com/clojure/tools.deps.graph , but I don't see any viable alternatives left for lein.

There might be a path to generating graphs for leiningen repos with https://github.com/RickMoynihan/lein-tools-deps , but adopting partial deps.edn probably isn't an ideal solution. If anyone tries this, please report back.