There is for sure something wrong going on with how dependencies are managed, and it's obviously breaking a lot of things, wasting a lot of time and making a lot of people angry:

  • Poorly maintained docker images breaking because of unpinned dependencies
  • Almost any package manager that allows native code bundling where you can have a system library that's either incompatible with the runtime or your system.

This also holds true for non-native code.

Why would you ever expect people to guess the requirements of your software?

Version pinning is no Whac-A-Mole game, it's about giving real meaning to versioning.

Most version control softwares insist on allowing semver as if it ever could possibly achieve its intended goal. A version number says nothing about a software integrity which is all anyone should care for, it's not a date (which would actually means something) and it's not a checksum either (which would say a lot about its integrity).

Do not fool yourself, dependencies do not auto-manage themselves and never will, all the elements that make up the stacks should be interoperable which can only be the result of careful testings.

Manifests are not just a mean to create automated builds, they are a mean for softwares to be platform-agnostic because no end user should ever be expected to reverse-engineer a stack in order to make things interoperable (again).

The (obvious) solution

Hard pin all your dependencies and make your requirements clear however you can.