Practicalli Clojure CLI Configurationλ︎
Practicalli Clojure CLI Config is a user configuration for Clojure CLI tools providing a range of community tools via meaningful aliases, supporting Clojure and ClojureScript development.
Alias names are designed with qualified keywords that provide context for the use of an alias (env, inspect, project, repl, search test). These keywords help with discovery and reduce cognitive load required to remember their purpose.
Commonly used arguments are included in many alias via :main-opts or :exec-args which can be overridden on the command line.
Minimum Clojure CLI Version - 1.10.3.1040
Clojure CLI version 1.10.3.1040 is the minimum version, although the latest available version is recommended.
Check the version of Clojure CLI currently installed via clojure --version or clojure -Sdescribe
Remote Environments or Continuous Integration
For remote environments or Continuous Integration services, include Practicalli Clojure CLI Config) in the environment build or copy specific aliases to the Clojure project deps.edn configuration.
Practicalli Clojure CLI Config
Installλ︎
Fork or clone Practicalli Clojure CLI Config GitHub repository, first removing the $XDG_CONFIG_HOME/clojure or $HOME/.clojure directory if they exist.
Check Clojure CLI configuration location
Check the location of your Clojure configuration directory by running clojure -Sdescribe and checking the :user-config value.
If XDG_CONFIG_HOME environment variable is set, clone the repository to $XDG_CONFIG_HOME/clojure
Community Toolsλ︎
The Clojure configuration directory contains a deps.edn file containing a substantial :aliases section with a long list of aliases. These aliases are described in the README of the project.
All tools are provided via libraries and are only installed on first use. Unused aliases will therefore not install their libraries.
Aliases to start with
Start with the following aliases to keep things simple
clojure -T:project/create :name domain/project-name to create a new clojure project
clojure -M:repl/reloaded to run a fully loaded REPL and rich terminal UI (which can be connected to from Clojure editors)
clojure -X:test/watch to run tests on file save (or :test/run to manually run tests once)
Use Clojure tools.build to create jar and uberjar packages of the project.
REPL experienceλ︎
Rebel REPL terminal UI provides a feature rich REPL prompt experience, far beyond the basic clj command.
| Command | Description |
|---|---|
clojure -M:repl/rebel |
Rebel terminal UI |
clojure -M:env/dev:repl/rebel |
Rebel including deps & path from :env/dev alias to configure REPL start |
clojure -M:repl/reloaded |
Rebel with dev & test paths, library hotload, namespace reload, portal data inspector |
clojure -M:repl/rebel-cljs |
Run a ClojureScript REPL using Rebel Readline |
:repl/help in the REPL for help and available commands. :repl/quit to close the REPL.
Clojure Projectsλ︎
- Create Clojure CLI specific projects using deps-new
- Create projects from deps, leiningen and boot templates with clj-new
| Command | Description |
|---|---|
clojure -T:project/create |
library project called playground |
clojure -T:project/create :template app :name practialli/service |
Clojure CLI project from app template |
clojure -T:project/new :template luminus :name practicalli/full-stack-app +http-kit +h2 |
Luminus project with given name and template options |
Run projectsλ︎
Run project with or without an alias:
The
-Mflag is required even if an alias is not included in the running of the application. A warning will be displayed if the-Moption is missing.
In the project deps.edn file it could be useful to define an alias to run the project, specifying the main namespace, the function to run and optionally any default arguments that are passed to that function.
Then the project can be run using clojure -X:project/run and arguments can optionally be included in this command line, to complement or replace any default arguments in exec-args.
Project dependenciesλ︎
| Command | Description |
|---|---|
clojure -M:project/errors |
detailed report of compilation errors for a project |
clojure -M:search/libraries library-name |
fuzzy search Maven & Clojars |
clojure -M:search/libraries -F:merge library-name |
fuzzy search Maven & Clojars and save to project deps.edn |
clojure -M:search/outdated |
report newer versions for maven and git dependencies |
clojure -M:search/unused-vars |
search and remove unused vars |
Project Deploymentλ︎
Deploy a project archive file locally or to Clojars.org
Package projects into jars using tools.build
Clojure tools.build is the recommended way to create library jar files and application Uberjar files.
| Command | Description |
|---|---|
clojure -X:deps mvn-install project.jar |
[NEW] deploy jar file to local maven repository, i.e. ~/.m2/repository |
clojure -M:project/clojars project.jar |
deploy jar file to Clojars |
clojure -M:project/clojars-signed project.jar |
deploy signed jar file to Clojars |
Set Clojars username/token in CLOJARS_USERNAME and CLOJARS_PASSWORD environment variables.
Set fully qualified artifact-name and version in project pom.xml file
Path to project.jar can also be set in alias to simplify the Clojure command.
clojure -X:deps mvn-install project.jarfor local deployment of jars is part of the 1.10.1.697 release of the Clojure CLI tools in September 2020.
Java Sourcesλ︎
Include Java source on the classpath to look up Java Class and method definitions, e.g. cider-find-var in Emacs
Requires: Java sources installed locally (e.g. "/usr/lib/jvm/openjdk-11/lib/src.zip")
:lib/java17-source
Use the aliases with either -M or -X flags on the Clojure command line.
Format toolsλ︎
Use formatting tools to support a consistent code style across all Clojure projects
| Command | Description |
|---|---|
clojure -M:format/cljstyle check / fix |
Check or fix code style (cljstyle) |
clojure -M:format/cljfmt check / fix |
Check or fix code style (cljfmt) |
clojure -M:format/zprint filename |
Format file using zprint |
Include
:lib/pprint-sortedwhen starting a REPL to pretty print data with sorted keys and set values
Databases and driversλ︎
Databases and drivers, typically for development time inclusion such as embedded databases
:database/h2- H2 embedded database library and next.jdbclib/next.jdbc- include the next.jdbc library
clojure -M:database/h2 - run a REPL with an embedded H2 database and next.jdbc libraries
https://cljdoc.org/d/seancorfield/next.jdbc/CURRENT/doc/getting-started#create--populate-a-database
Use the aliases with either -M or -X flags on the Clojure command line.
Data Scienceλ︎
lib/clerk- Clerk Notebooks
Visualizing projectsλ︎
Create Graphviz graphs of project and library dependencies
Morpheus creates grahps of project vars and their relationships
:graph/vars- generate graph of vars in a project as a .dot file:graph/vars-png- generate graph of vars in a project as a .png file usingsrcandtestpaths:graph/vars-svg- generate graph of vars in a project as a .svg file usingsrcandtestpaths
Install Graphviz to generate PNG and SVG images. Or use the Edotor website to convert .dot files to PNG or SVG images and select different graph layout engines.
Vizns creates graphs of relationships between library dependencies and project namespaces
:graph/deps:graph/deps-png- generate a single deps-graph png image
Other options:
- clojure -M:graph/deps navigate # navigable folder of SVGs
- clojure -M:graph/deps single # deps-graph.dot file
- clojure -M:graph/deps single -o deps-graph.png -f png
- clojure -M:graph/deps single -o deps-graph.svg -f svg
- clojure -M:graph/deps single --show # View graph without saving
Data Inspectorλ︎
Portal Navigate data in the form of edn, json and transit
Practicalli Clojure - data browsers section - portal
| Command | Description |
|---|---|
clojure -M:inspect/portal-cli |
Clojure REPL with Portal dependency |
clojure -M:inspect/portal-web |
ClojureScript web browser REPL with Portal dependency |
clojure -M:inspect/portal-node |
ClojureScript node.js REPL with Portal dependency |
Using Portal once running
(require '[portal.api :as portal]) once the REPL starts. For inspect/portal-web use (require '[portal.web :as portal]) instead
(portal/open) to open the web based inspector window in a browser.
(portal/tap)to add portal as a tap target (add-tap)
(tap> {:accounts [{:name "jen" :email "jen@jen.com"} {:name "sara" :email "sara@sara.com"}]}) to send data to the portal inspector window (or any other data you wish to send)
(portal/clear) to clear all values from the portal inspector window.
(portal/close) to close the inspector window.
Clojure Specificationλ︎
Clojure spec, generators and test.check
:lib/spec-test- generative testing with Clojure test.check:lib/spec2- experiment with the next version of Clojure spec - alpha: design may change
Unit Testing frameworksλ︎
Unit test libraries and configuration. The Clojure standard library includes the clojure.test namespace, so no alias is required.
:test/env- addtestdirectory to classpath:lib/expectations-clojure.testwith expectations:lib/expectations-classic- expectations framework
Use expectations in a project clojure -M:test:expectations or from the command line with a test runner, e.g. clojure -M:lib/expectations:test/runner
Test runners and Test Coverageλ︎
Tools to run unit tests in a project which are defined under test path.
Run clojure with the specific test runner alias: clojure -M:test-runner-alias
| Command | Description |
|---|---|
clojure -M:test/run |
Kaocha test runner for Clojure |
clojure -M:test/watch |
Kaocha: watch for changes |
clojure -M:test/cljs |
Kaocha test runner for ClojureScript |
Lint toolsλ︎
Static analysis tools to help maintain code quality and suggest Clojure idioms.
| Command | Description |
|---|---|
clojure -M:lint/clj-kondo |
comprehensive and fast static analysis lint tool |
clojure -M:lint/eastwood |
classic lint tool for Clojure |
clojure -M:lint/idiom |
Suggest idiomatic Clojure code |
Performance testingλ︎
:performance/benchmark alias includes the Criterium library for performance testing of Clojure expressions.
Use the aliases with either -M or -X flags on the Clojure command line.
:dev/reloadedand:repl/reloadedboth include criterium library
Start a REPL using the :repl/reloaded alias, or by including the :performance/benchmark in a Clojure command to start a REPL.
```shell clojure -M:repl/reloaded
```
```shell clojure -M:performance/benchmark:repl/basic
```
Require the Criterium quick-bench function
Performance test a project in the REPL
clojure -M:performance/benchmark:repl/rebel
(require '[practicalli/namespace-name]) ; require project code
(in-ns 'practicalli/namespace-name)
(quick-bench (project-function args))
Use the aliases with either -M or -X flags on the Clojure command line.
In the REPL: