How does mix handle partial dependency caching? (CircleCI)

CircleCI provides partial dependency caching by allowing their cache keys to match from specific to general. Let’s say most specific being a checksum of mix.lock and least specific being a branch name.

If it does not have a cache for the current mix.lock, but does have one for the branch then the restored dependencies will be partial. Does mix deps.get handle this gracefully or will it re-fetch everything?

Same question if we apply the strategy to the _build directory.

Thanks!

In my experience on Circle CI this works just fine. Here are my caching keys:

            - v1-build-cache-{{ .Branch }}-{{ checksum "mix.lock" }}
            - v1-build-cache-{{ .Branch }}
            - v1-build-cache

The v1 bit is just a handy thing to increment incase you want to intentionally blow away the cache. I haven’t had to do that often.

2 Likes

Great. Thanks!

That’s the recommended setup for Circle and I’m glad to hear it works as expected for Elixir. Circle has this warning in their docs…

“In the above example, if a dependency tree is partially restored by the second or third cache keys, some dependency managers will incorrectly install on top of the outdated dependency tree.”

And then they go on to list various dependency managers’ compatibility with partial dependency caching…

Bundler: Yes, with caution
Gradle: Yes
Maven: Yes
Leiningen: Yes
Npm: Yes, with npm 5+
Pip: Yes, with pip-env

No mix listed… so i wanted to see if i was wasting my time caching on the branch.

Thanks again