Commercial stuff isn't that much better. Consider all the .NET bloat. That solves the above problem but now you have to keep a ton of bloated versions of .NET installed on everything, on the off-chance that some app uses some single component of some version of .NET. It's still dependency hell, except now you've front-loaded every possible dependency so you're never short. Open source could "fix" the issue of not having the required DLL, by doing what .NET does and bundle all possible DLLs to start with. But then who hasn't had the same issue of apps that won't work because you don't have the required versions of Microsoft's C Runtime or the right version of .NET installed?
Apple is worse, just gives a big "fuck you" if the version numbers of your software aren't the range supported by the exact version number of your operating system. I learned this the hard way trying to build for iOS. Specific version numbers of xCode are needed to build for specific ranges of iOS versions, and specific ranges of MacOS are needed for those specific versions of xCode. So you can't just do what you do on Windows, and boot up an old version of Visual Studio if you want and build for older C runtimes, everything has to match lockstep with everything else's version number. Yeah, so Apple solved the dependency problem by not letting anything run on anything except under very strict supervision. Instead of the "damn I have to download a DLL" issue, Apple just fixes it by going "run old software? Screw you, weirdo!"
However, Microsoft may have finally learned their lesson from the .NET bloat with the new .NET Core releases. These only package the needed dependencies for that particular program for the specific .NET Core version they were built for. So you don't have to have every single module of every variant of .NET Core on every machine.
The old .NET Framework system was like carrying no tools with you, except every work site you visit has all conceivable versions of all possible tools available at the site, then you move onto the next site, also carrying no tools, and that site also replicates every possible tool that anyone could possibly need, regardless of actual need. Like every job site has a rack of "hammers" with every possible type of hammer for you to select from, along with additional racks stretching into the horizon for all imaginable tool types.
Whereas .NET Core only compiles in the needed tools for the job, and carries its tools with it. If you didn't get the message, everyone should stop using old .NET and use .NET Core. Needing DLLs is a temporary nuisance while you get the DLLs you need. .NET bloat is permanent suckage, because so many apps use some small bit of each version number, so you can't get rid of any of it.