💾 Archived View for silentcrescent.org › tech › software › language-package-managers.gmi captured on 2021-12-04 at 18:04:22. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-12-03)
-=-=-=-=-=-=-
Many languages today have their own package managers. Some notable examples include:
... and many others. They are extremely convenient tools to developers, as they allow you to specify all the dependencies needed for your software project, often automatically install and compile everything correctly and manage it over time. Compared to ecosystems that are based on Makefiles, autotools, CMake and other similar tools, they make life much easier for developers.
These tools, however, do not come without their annoyances. None of these are fundamental to language package managers and many can easily be addressed with some work and a change fo mindset. That being said, they have not been addressed and at the time of this writing, these problems remain one of the main detractors for adoption (at least when building systems software and considering deployment to many users).
When we combine all of these points together, we end up with an unmaintainable mess with outdated software that is just waiting to be exploited and end up in dependency hell. I like modern languages that help developers write their software more easily and in a safer way. However, this attitude of language designers having opinions on how software should be developed needs to go away. It has no basis in reality. You simply can't predict how someone might want to use your language, so make your deployment story flexible.
In case you wish to dive deeper into the story of packaging software written in such a language, take a look at what GNU Guix, a packaging system that aims to be both bootstrappable and reproducible in its builds and acts as a 'git repository for your system' does for Rust crates:
GNU Guix's crates-graphics.scm
Note how many duplicate entries of the same library exist. Now note that a lot of these libraries don't need to stay on the same version. In fact, a lot of them could just be squashed into one single library, as they are backwards compatible. cargo prevents this from happening because it vetos the decision on which library version is acceptable. The only options are roughly as described above:
A lot of these languages are great in many ways, but this is holding them back. The deployment story of these languages is anything but sensible, and it needs to be fixed.
-- tdg