|
|
||
|---|---|---|
| bootstrap/src/main/java/coursier | ||
| cache/src/main/scala/coursier | ||
| cli/src/main | ||
| core | ||
| doc | ||
| fetch-js/src/main/scala/coursier | ||
| notes | ||
| plugin/src/main/scala/coursier | ||
| project | ||
| tests | ||
| web/src/main | ||
| .gitignore | ||
| .travis.yml | ||
| README.md | ||
| USAGE.md | ||
| appveyor.yml | ||
| build.sbt | ||
| coursier | ||
| version.sbt | ||
README.md
Coursier
Pure Scala Artifact Fetching
A pure Scala substitute for Aether
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:
- Ammonite (enhanced Scala REPL),
$ ./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.