I previously worked with pants [1] in the context of an extremely large (~50GiB) repository which saw a huge amount of daily churn. In that context build tools like pants and Bazel become absolutely essential because the only way to have a reasonable CI/CD system and build/test times is to do change analysis to predict what tests and other products are impacted. While I think that Pants, Buck [2], Bazel and other Google Blaze derivatives have made fundamental and perhaps undesirable complexity sacrifices in order to be polygot, they do add significant value to a large organization. Presently, I work on a much smaller Clojure project encompassing several microservices which communicate over Kafka. Each service is its own sub-project in a single repository. We coordinate modules using lein- modules [3]. For a variety of reasons, the majority of our interesting tests involve Kafka and potentially integrating against other services continually built out of the same repo. These tests are wall clock expensive due to a variety of system initialization overheads which are difficult to amortize. It has already proven very profitable for us to deploy a limited amount of test invalidation by using the inter-module dependency information lein-modules exposes to restrict test runs to those modules which have seen source changes or which according to topological sort order may depend on impacted modules. This is a correct but non-minimal heuristic which leaves time on the table. Our deployment artifacts are also fairly expensive to produce, and so I'm very interested in the possibility of a polygot tool which can capture dependency information both for test invalidation and build product invalidation. It is in theory possible to write a "macro" (function) for either Pants or Buck which defines a clojure_library or clojure_app target in terms of simply generating a java_library which happens to have your clj(c) files for resources and depend on Clojure. I got this working for Buck at one point, but Buck doesn't support Maven dependencies and requires that you hand-manage all your jars which made the ergonomics unfortunate. I haven't taken a serious crack at getting Pants wired up that way. I worked with the pants developers at one point to understand what they thought it would take to get a clojure_library target integrated "the right way" and it turns out to be a mess because of how pants' JVM model is coupled to Ivy, Scala's incremental compiler. I've been sketching at Katamari [4] on and off, the thought being that the fundamental dependency and invalidation concerns are well enough understood [7] that maybe by trying to build a framework or fire customers it's possible to achieve a meaningful complexity reduction. I haven't managed that yet. Of particular frustration is notions of when to build classpaths and resolve dependencies - although forcing dependency pinning fixes this which is Buck's answer.There's also Juxt's mach [5] (not to be confused with Mozilla's build tool of the same name), krei.alpha [6] which has some of the same goals as katamari and I've seen some sketches at multi-module boot. In short, I do think that more sophisticated build tools make sense in the Clojure space. Sure Clojure itself doesn't have traditional compilation needs in the sense of say C++ or Scala, but notions of products and static dependency information is more generally valuable and can help with whole applications or systems. After spending a fair bit of time evaluating the options, I concur with Colin. If lein-modules or lein-monolith doesn't solve your problem Gradle is probably the most mature "off the shelf" solution. Reid
[1] https://pantsbuild.org/[1] [2] https://buckbuild.com/ [3] https://github.com/FundingCircle/lein-modules [4] https://github.com/arrdem/katamari [5] https://github.com/juxt/mach [6] https://github.com/SevereOverfl0w/krei.alpha [7] https://www.microsoft.com/en-us/research/uploads/prod/2018/03/build-systems.pdf On Mon, Jun 4, 2018, at 10:04 PM, Nathan Fisher wrote: > It's not something that as a user you'd be exposed to. The easiest way > to demonstrate the impact is to write a library and test target in two > different ways for a Java project.> > 1. using java_library target for the library. > 2. using genrule for the library that calls out to javac. > > Run the test target, introduce whitespace into the library, and run > the test target again. It should only do a full execution in the 2nd > example.> > On Sunday, 15 April 2018 17:09:12 UTC-3, Gregg Reynolds wrote: >> >> >> On Mon, Jan 29, 2018, 2:07 PM Nathan Fisher >> <nfi...@junctionbox.ca> wrote:>>> >> ... >>> In order to get the speed that the build tool promises you need the >>> ability to efficiently parse the ABI of each file and only build >>> its dependents when the ABI has changed.>> >> Can you please elaborate on this a bit? I've been using Bazel for a >> project that involve C and Java, with cross-compiles, and ABI parsing >> has never come up. It just works.>>> >>> >>> I’m not certain you can do that with Clojures compiler but someone >>> else might be able to chime in with a way that you could.>> >> I like boot for clojure stuff, not sure Bazel offers any advantage. >> Clojurescript may be a different story, tho.>> >> So far I cannot see a good reason to switch from boot to Bazel for >> 100% clojure projects. Mixed language - clojure, clojurescript, js, >> Java, kotlin, JNI,etc - may be a different story, still not sure.>> >> Then there's remote caching: >> https://docs.bazel.build/versions/master/remote-caching.html. a >> hyuuuuge win for many scenarios, not so sure about clojure.>> >> G >> G > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient > with your first post.> To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google > Groups "Clojure" group.> To unsubscribe from this group and stop receiving > emails from it, send > an email to clojure+unsubscr...@googlegroups.com.> For more options, visit > https://groups.google.com/d/optout. Links: 1. https://www.pantsbuild.org/ -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.