sbt, the interactive build tool
Go to file
Alexandre Archambault d33ab9da26 Output better `sbt.ModuleReport`s 2015-12-30 01:34:32 +01:00
bootstrap/src/main/java/coursier JDK 1.7 friendliness 2015-11-28 18:19:42 +01:00
cache/src/main/scala/coursier Move TermDisplay to cache module, remove dependency of plugin towards cli 2015-12-30 01:34:32 +01:00
cli/src/main Move TermDisplay to cache module, remove dependency of plugin towards cli 2015-12-30 01:34:32 +01:00
core Output better `sbt.ModuleReport`s 2015-12-30 01:34:32 +01:00
doc Add tut support 2015-12-30 01:34:32 +01:00
fetch-js/src/main/scala/coursier Move scala js custom Task to coursier namespace 2015-12-30 01:34:32 +01:00
notes Update release notes 2015-06-28 18:14:53 +02:00
plugin/src/main/scala/coursier Output better `sbt.ModuleReport`s 2015-12-30 01:34:32 +01:00
project Add tut support 2015-12-30 01:34:32 +01:00
tests Output better `sbt.ModuleReport`s 2015-12-30 01:34:32 +01:00
web/src/main Add support for attributes 2015-12-30 01:34:32 +01:00
.gitignore Initial commit 2015-06-16 20:32:17 +02:00
.travis.yml Run CI on OS X 2015-12-19 15:26:46 +01:00
README.md Add Maven badge 2015-12-19 18:28:48 +01:00
USAGE.md Update USAGE 2015-06-26 18:16:04 +02:00
appveyor.yml Move things around 2015-11-29 20:35:21 +01:00
build.sbt Move TermDisplay to cache module, remove dependency of plugin towards cli 2015-12-30 01:34:32 +01:00
coursier Update launcher 2015-12-13 12:17:15 +00:00
version.sbt Set version to 1.0.0-SNAPSHOT 2015-12-30 01:34:32 +01:00

README.md

Coursier

Pure Scala Artifact Fetching

A pure Scala substitute for Aether

Build Status Build status (Windows) Join the chat at https://gitter.im/alexarchambault/coursier Maven Central

coursier is a dependency resolver / fetcher à la Maven / Ivy, entirely rewritten from scratch in Scala. It aims at being fast and easy to embed in other contexts. Its very core (core module) aims at being extremely pure, and should be approached thinking algebraically.

The files module handles caching of the metadata and artifacts themselves, and is less so pure than the core module, in the sense that it happily does IO as a side-effect (although it naturally favors immutability for all that's kept in memory).

It handles fancy Maven features like

It happily resolves dependencies involving modules from the Hadoop ecosystem (Spark, Flink, etc.), that make a heavy use of these.

It can be used either from the command-line, via its API, or from the browser.

It downloads the metadata or the artifacts in parallel (usually, 6 parallel downloads).

Command-line

Download and run its laucher with

$ curl -L -o coursier https://git.io/vBSmI && chmod +x coursier && ./coursier --help

Note that the launcher itself weights only 8 kB and can be easily embedded as is in other projects. The first time it is run, it will download the artifacts required to launch coursier. You'll be fine the next times :-).

The cache of this default launcher defaults to a directory named .coursier, in the same directory as the launcher. This can be changed by manually adjusting the COURSIER_CACHE variable in the first lines of the launcher.

$ ./coursier --help

lists the available coursier commands. The most notable ones are launch, fetch, and classpath. Type

$ ./coursier command --help

to get a description of the various options the command command (replace with one of the above command) accepts.

launch

The launch command fetches a set of Maven coordinates it is given, along with their transitive dependencies, then launches the "main main class" from it if it can find one (typically from the manifest of the first coordinates). The main class to launch can also be manually specified with the -M option.

For example, it can launch:

$ ./coursier launch com.lihaoyi:ammonite-repl_2.11.7:0.5.0

along with the REPLs of various JVM languages like

  • Frege,
$ ./coursier launch -r central -r https://oss.sonatype.org/content/groups/public \
    org.frege-lang:frege-repl-core:1.3 -M frege.repl.FregeRepl
  • clojure,
$ ./coursier launch org.clojure:clojure:1.7.0 -M clojure.main
  • jruby,
$ wget https://raw.githubusercontent.com/jruby/jruby/master/bin/jirb && \
  ./coursier launch org.jruby:jruby:9.0.4.0 -M org.jruby.Main -- -- jirb
  • jython,
$ ./coursier launch org.python:jython-standalone:2.7.0 -M org.python.util.jython
  • Groovy,
$ ./coursier launch org.codehaus.groovy:groovy-groovysh:2.4.5 -M org.codehaus.groovy.tools.shell.Main \
    commons-cli:commons-cli:1.3.1

etc.

and various programs, like

  • Proguard and its utility Retrace,
$ ./coursier launch net.sf.proguard:proguard-base:5.2.1 -M proguard.ProGuard
$ ./coursier launch net.sf.proguard:proguard-retrace:5.2.1 -M proguard.retrace.ReTrace

fetch

The fetch command simply fetches a set of dependencies, along with their transitive dependencies, then prints the local paths of all their artefacts.

Example

$ ./coursier fetch org.apache.spark:spark-sql_2.11:1.5.2
...
/path/to/.coursier/cache/0.1.0-SNAPSHOT-2f5e731/files/central/io/dropwizard/metrics/metrics-jvm/3.1.2/metrics-jvm-3.1.2.jar
/path/to/.coursier/cache/0.1.0-SNAPSHOT-2f5e731/files/central/javax/servlet/javax.servlet-api/3.0.1/javax.servlet-api-3.0.1.jar
/path/to/.coursier/cache/0.1.0-SNAPSHOT-2f5e731/files/central/javax/inject/javax.inject/1/javax.inject-1.jar
...

classpath

The classpath command transitively fetches a set of dependencies like fetch does, then prints a classpath that can be handed over directly to java, like

$ java -cp "$(./coursier classpath com.lihaoyi:ammonite-repl_2.11.7:0.5.0 | tail -n1)" ammonite.repl.Repl
Loading...
Welcome to the Ammonite Repl 0.5.0
(Scala 2.11.7 Java 1.8.0_60)
@

API

This gist by Lars Hupel illustrates how the API of coursier can be used to get transitives dependencies and fetch the corresponding artefacts.

More explanations to come :-)

Scala JS demo

coursier is also compiled to Scala JS, and can be tested in the browser via its demo.

To do / missing

  • Snapshots metadata / artifacts, once in cache, are not automatically updated for now. #41
  • File locking could be better (none for metadata, no re-attempt if file locked elsewhere for artifacts) #71
  • Handle "configurations" like Ivy does, instead of just the standard (hard-coded) Maven "scopes" #8
  • SBT plugin #52, requires Ivy-like configurations #8

See the list of issues.

Contributors

  • Your name here :-)

Don't hesitate to pick an issue to contribute, and / or ask for help for how to proceed on the Gitter channel.

Projects using coursier

  • Lars Hupel's libisabelle fetches some of its requirements via coursier,
  • jupyter-scala should soon allow to add dependencies in its sessions with coursier (initial motivation for writing coursier),
  • Your project here :-)

Released under the Apache license, v2.