All work in this repo has ceased; it is continued in clj-commons/vizdeps.
Copyright © 2016- Walmartlabs
Distributed under the Apache Software License 2.0.
Visualize Leiningen dependencies using Graphviz
License: Apache License 2.0
All work in this repo has ceased; it is continued in clj-commons/vizdeps.
Copyright © 2016- Walmartlabs
Distributed under the Apache Software License 2.0.
One of our transitive dependencies pulls from a custom repository [1] which seems to confuse vizdeps, erroring with:
clojure.lang.ExceptionInfo: Exception processing dependencies of [cc.qbits/alia-all "3.3.0" :exclusions [[org.clojure/tools.reader]]]: Exception processing dependencies of [cc.qbits/alia-eaio-uuid "3.1.3"]: Exception processing dependencies of [cc.qbits/tardis "1.0.0"]: Exception processing dependenci
es of [com.eaio.uuid/uuid "3.3"]: Exception resolving dependencies of [com.eaio.uuid/uuid "3.3"]: Could not resolve dependencies
...
Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact com.eaio.uuid:uuid:jar:3.3 in central (https://repo1.maven.org/maven2/)
The command runs once we had the repository to our own project however.
[1] https://github.com/mpenet/tardis/blob/master/project.clj
D:\clojure\luminusweb\yunhaoutil>lein vizdeps -o target/dependencies.pdf
clojure.lang.ExceptionInfo: Exception processing dependencies of [org.clojure/clojure "1.8.0"]: Exception resolving dep
at clojure.core$ex_info.invokeStatic (core.clj:4617)
clojure.core$ex_info.invoke (core.clj:4617)
leiningen.vizdeps$add_dependency_tree.invokeStatic (vizdeps.clj:106)
leiningen.vizdeps$add_dependency_tree.invoke (vizdeps.clj:81)
leiningen.vizdeps$add_dependencies$fn__804.invoke (vizdeps.clj:115)
clojure.core.protocols$fn__6755.invokeStatic (protocols.clj:167)
clojure.core.protocols/fn (protocols.clj:124)
clojure.core.protocols$fn__6710$G__6705__6719.invoke (protocols.clj:19)
clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
clojure.core.protocols$fn__6738.invokeStatic (protocols.clj:75)
clojure.core.protocols/fn (protocols.clj:75)
clojure.core.protocols$fn__6684$G__6679__6697.invoke (protocols.clj:13)
clojure.core$reduce.invokeStatic (core.clj:6545)
clojure.core$reduce.invoke (core.clj:6527)
leiningen.vizdeps$add_dependencies.invokeStatic (vizdeps.clj:114)
leiningen.vizdeps$add_dependencies.invoke (vizdeps.clj:112)
leiningen.vizdeps$dependency_graph.invokeStatic (vizdeps.clj:146)
leiningen.vizdeps$dependency_graph.invoke (vizdeps.clj:132)
leiningen.vizdeps$build_dot.invokeStatic (vizdeps.clj:170)
leiningen.vizdeps$build_dot.invoke (vizdeps.clj:168)
leiningen.vizdeps$vizdeps.invokeStatic (vizdeps.clj:225)
leiningen.vizdeps$vizdeps.doInvoke (vizdeps.clj:206)
clojure.lang.RestFn.invoke (RestFn.java:439)
clojure.lang.Var.invoke (Var.java:388)
clojure.lang.AFn.applyToHelper (AFn.java:160)
clojure.lang.Var.applyTo (Var.java:700)
clojure.core$apply.invokeStatic (core.clj:648)
clojure.core$apply.invoke (core.clj:641)
leiningen.core.main$partial_task$fn__5829.doInvoke (main.clj:272)
clojure.lang.RestFn.applyTo (RestFn.java:139)
clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:648)
clojure.core$apply.invoke (core.clj:641)
leiningen.core.main$apply_task.invokeStatic (main.clj:322)
leiningen.core.main$apply_task.invoke (main.clj:308)
leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:328)
leiningen.core.main$resolve_and_apply.invoke (main.clj:324)
leiningen.core.main$_main$fn__5895.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:436)
clojure.lang.Var.invoke (Var.java:388)
clojure.lang.AFn.applyToHelper (AFn.java:160)
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:482)
clojure.lang.Var.invoke (Var.java:401)
clojure.lang.AFn.applyToHelper (AFn.java:171)
clojure.lang.Var.applyTo (Var.java:700)
clojure.main.main (main.java:37)
Caused by: clojure.lang.ExceptionInfo: Exception resolving dependencies of [org.clojure/clojure "1.8.0"]: Wrong number
at clojure.core$ex_info.invokeStatic (core.clj:4617)
clojure.core$ex_info.invoke (core.clj:4617)
leiningen.vizdeps$immediate_dependencies.invokeStatic (vizdeps.clj:71)
leiningen.vizdeps$immediate_dependencies.invoke (vizdeps.clj:56)
leiningen.vizdeps$add_dependency_tree.invokeStatic (vizdeps.clj:104)
leiningen.vizdeps$add_dependency_tree.invoke (vizdeps.clj:81)
leiningen.vizdeps$add_dependencies$fn__804.invoke (vizdeps.clj:115)
clojure.core.protocols$fn__6755.invokeStatic (protocols.clj:167)
clojure.core.protocols/fn (protocols.clj:124)
clojure.core.protocols$fn__6710$G__6705__6719.invoke (protocols.clj:19)
clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
clojure.core.protocols$fn__6738.invokeStatic (protocols.clj:75)
clojure.core.protocols/fn (protocols.clj:75)
clojure.core.protocols$fn__6684$G__6679__6697.invoke (protocols.clj:13)
clojure.core$reduce.invokeStatic (core.clj:6545)
clojure.core$reduce.invoke (core.clj:6527)
leiningen.vizdeps$add_dependencies.invokeStatic (vizdeps.clj:114)
leiningen.vizdeps$add_dependencies.invoke (vizdeps.clj:112)
leiningen.vizdeps$dependency_graph.invokeStatic (vizdeps.clj:146)
leiningen.vizdeps$dependency_graph.invoke (vizdeps.clj:132)
leiningen.vizdeps$build_dot.invokeStatic (vizdeps.clj:170)
leiningen.vizdeps$build_dot.invoke (vizdeps.clj:168)
leiningen.vizdeps$vizdeps.invokeStatic (vizdeps.clj:225)
leiningen.vizdeps$vizdeps.doInvoke (vizdeps.clj:206)
clojure.lang.RestFn.invoke (RestFn.java:439)
clojure.lang.Var.invoke (Var.java:388)
clojure.lang.AFn.applyToHelper (AFn.java:160)
clojure.lang.Var.applyTo (Var.java:700)
clojure.core$apply.invokeStatic (core.clj:648)
clojure.core$apply.invoke (core.clj:641)
leiningen.core.main$partial_task$fn__5829.doInvoke (main.clj:272)
clojure.lang.RestFn.applyTo (RestFn.java:139)
clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:648)
clojure.core$apply.invoke (core.clj:641)
leiningen.core.main$apply_task.invokeStatic (main.clj:322)
leiningen.core.main$apply_task.invoke (main.clj:308)
leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:328)
leiningen.core.main$resolve_and_apply.invoke (main.clj:324)
leiningen.core.main$_main$fn__5895.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:436)
clojure.lang.Var.invoke (Var.java:388)
clojure.lang.AFn.applyToHelper (AFn.java:160)
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:482)
clojure.lang.Var.invoke (Var.java:401)
clojure.lang.AFn.applyToHelper (AFn.java:171)
clojure.lang.Var.applyTo (Var.java:700)
clojure.main.main (main.java:37)
Caused by: clojure.lang.ArityException: Wrong number of args (4) passed to: classpath/fn--6613
at clojure.lang.AFn.throwArity (AFn.java:429)
clojure.lang.AFn.invoke (AFn.java:44)
clojure.lang.AFn.applyToHelper (AFn.java:165)
clojure.lang.AFn.applyTo (AFn.java:144)
clojure.core$apply.invokeStatic (core.clj:646)
clojure.core$memoize$fn__5708.doInvoke (core.clj:6107)
clojure.lang.RestFn.invoke (RestFn.java:457)
clojure.lang.Var.invoke (Var.java:394)
leiningen.vizdeps$immediate_dependencies.invokeStatic (vizdeps.clj:60)
leiningen.vizdeps$immediate_dependencies.invoke (vizdeps.clj:56)
leiningen.vizdeps$add_dependency_tree.invokeStatic (vizdeps.clj:104)
leiningen.vizdeps$add_dependency_tree.invoke (vizdeps.clj:81)
leiningen.vizdeps$add_dependencies$fn__804.invoke (vizdeps.clj:115)
clojure.core.protocols$fn__6755.invokeStatic (protocols.clj:167)
clojure.core.protocols/fn (protocols.clj:124)
clojure.core.protocols$fn__6710$G__6705__6719.invoke (protocols.clj:19)
clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
clojure.core.protocols$fn__6738.invokeStatic (protocols.clj:75)
clojure.core.protocols/fn (protocols.clj:75)
clojure.core.protocols$fn__6684$G__6679__6697.invoke (protocols.clj:13)
clojure.core$reduce.invokeStatic (core.clj:6545)
clojure.core$reduce.invoke (core.clj:6527)
leiningen.vizdeps$add_dependencies.invokeStatic (vizdeps.clj:114)
leiningen.vizdeps$add_dependencies.invoke (vizdeps.clj:112)
leiningen.vizdeps$dependency_graph.invokeStatic (vizdeps.clj:146)
leiningen.vizdeps$dependency_graph.invoke (vizdeps.clj:132)
leiningen.vizdeps$build_dot.invokeStatic (vizdeps.clj:170)
leiningen.vizdeps$build_dot.invoke (vizdeps.clj:168)
leiningen.vizdeps$vizdeps.invokeStatic (vizdeps.clj:225)
leiningen.vizdeps$vizdeps.doInvoke (vizdeps.clj:206)
clojure.lang.RestFn.invoke (RestFn.java:439)
clojure.lang.Var.invoke (Var.java:388)
clojure.lang.AFn.applyToHelper (AFn.java:160)
clojure.lang.Var.applyTo (Var.java:700)
clojure.core$apply.invokeStatic (core.clj:648)
clojure.core$apply.invoke (core.clj:641)
leiningen.core.main$partial_task$fn__5829.doInvoke (main.clj:272)
clojure.lang.RestFn.applyTo (RestFn.java:139)
clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:648)
clojure.core$apply.invoke (core.clj:641)
leiningen.core.main$apply_task.invokeStatic (main.clj:322)
leiningen.core.main$apply_task.invoke (main.clj:308)
leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:328)
leiningen.core.main$resolve_and_apply.invoke (main.clj:324)
leiningen.core.main$_main$fn__5895.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:436)
clojure.lang.Var.invoke (Var.java:388)
clojure.lang.AFn.applyToHelper (AFn.java:160)
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:482)
clojure.lang.Var.invoke (Var.java:401)
clojure.lang.AFn.applyToHelper (AFn.java:171)
clojure.lang.Var.applyTo (Var.java:700)
clojure.main.main (main.java:37)
It looks like the set of profiles used in dependency calculation hard-codes the profile being used:
vizdeps/src/leiningen/vizdeps.clj
Lines 218 to 220 in e106df5
It would be useful if consumers could supply profiles, either via the usual lein with-profiles foo <command>
syntax or through a command line argument.
Happy to submit a PR.
I have personally found many issues that were almost impossible to debug by visualizing dependencies and as such have an interested professionally on this particular project continuing to be upgraded.
I have personally found many issues that were almost impossible to debug by visualizing dependencies and as such have an interested professionally on this particular project continuing to be upgraded.
There is some discussion about forking this to clj-commons and bringing it up to date to, for instance, work with latest leiningen and jvm releases.
Would you (or any of the contributors to this project) find it distasteful in any way if this project were adopted by clj-commons?
As of 2017-02-21, version 0.1.3
is not available on clojars.org.
I get this is a leiningen task.
I am sure there are people using boot that would be interested (I am one).
This project could either provide a boot task, or expose functions that a boot task could use to render the graph, prune dependencies etc.
This looks awesome, but when I updated my profiles.clj
and tried it out, it ended up in an exception:
lein vizdeps 22:36:04
java.io.IOException: Cannot run program "dot": error=2, No such file or directory
at java.lang.ProcessBuilder.start (ProcessBuilder.java:1048)
dorothy.core$render.invokeStatic (core.clj:626)
dorothy.core$render.invoke (core.clj:597)
dorothy.core$save_BANG_.invokeStatic (core.clj:651)
dorothy.core$save_BANG_.doInvoke (core.clj:633)
clojure.lang.RestFn.invoke (RestFn.java:442)
leiningen.vizdeps$vizdeps.invokeStatic (vizdeps.clj:233)
…
I'm seeing the following exception when running lein vizdeps
under Leiningen 2.8.1
:
➜ app lein vizdeps
java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn
at cemerick.pomegranate.aether$resolve_dependencies_STAR_.invokeStatic (aether.clj:786)
Environment details and steps taken to reproduce/isolate: https://gist.github.com/codeasone/5efbc080918c1d63da267e1c618c5b42
Reverting to Leiningen 2.7.1
restores functionality.
vizdeps fails on Leiningen < 2.7.0 with the error "No such var: classpath/managed-dependency-hierarchy, compiling:(com/walmartlabs/vizdeps/common.clj:118:7)"
Is it enforceable for a Leiningen plugin to declare a :min-lein-version
?
See also technomancy/leiningen#2067 for the Leiningen feature.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.