sbt 0.12.1 addresses several issues with dependency management. These fixes were made possible by specific, reproducible examples, such as a situation where the resolution cache got out of date (gh-532). A brief summary of the current work flow with dependency management in sbt follows.
update resolves dependencies according to the settings in a build
file, such as libraryDependencies and resolvers. Other tasks use the
output of update (an UpdateReport) to form various classpaths. Tasks
that in turn use these classpaths, such as compile or run, thus
indirectly depend on update. This means that before compile can run,
the update task needs to run. However, resolving dependencies on every
compile would be unnecessarily slow and so update must be particular
about when it actually performs a resolution.
update task (as opposed to a task that
depends on it) will force resolution to run, whether or not
configuration changed. This should be done in order to refresh
remote SNAPSHOT dependencies.
offline := true, remote SNAPSHOTs will not be updated by a
resolution, even an explicitly requested update. This should
effectively support working without a connection to remote
repositories. Reproducible examples demonstrating otherwise are
appreciated. Obviously, update must have successfully run before
going offline.
skip in update := true will tell sbt
to never perform resolution. Note that this can cause dependent
tasks to fail. For example, compilation may fail if jars have been
deleted from the cache (and so needed classes are missing) or a
dependency has been added (but will not be resolved because skip is
true). Also, update itself will immediately fail if resolution has
not been allowed to run since the last clean.
update explicitly. This will typically fix problems with out
of date SNAPSHOTs or locally published artifacts.
last update contains more information about the most recent
resolution and download. The amount of debugging output from Ivy is
high, so you may want to use lastGrep (run help lastGrep for usage).
clean and then update. If this works, it could indicate a
bug in sbt, but the problem would need to be reproduced in order to
diagnose and fix it.
~/.ivy2/cache related to problematic dependencies. For example, if
there are problems with dependency "org.example" % "demo" % "1.0",
delete ~/.ivy2/cache/org.example/demo/1.0/ and retry update. This
avoids needing to redownload all dependencies.
~/.ivy2/cache, especially if the first four steps have been
followed. If deleting the cache fixes a dependency management issue,
please try to reproduce the issue and submit a test case.
These troubleshooting steps can be run for plugins by changing to the build definition project, running the commands, and then returning to the main project. For example:
> reload plugins
> update
> reload return
offline := true in ~/.sbt/0.13/global.sbt. A command that does this for
the user would make a nice pull request. Perhaps the setting of
offline should go into the output of about or should it be a warning
in the output of update or both?
~/.ivy2/cache. Before doing this with 0.12.1, be sure to
follow the steps in the troubleshooting section first. In
particular, verify that a clean and an explicit update do not solve
the issue.
changing()
because sbt configures Ivy to know this already.