Yeah, it is understandable that in some circumstances downloading may be easier (though installers, likewise, must be hosted somewhere). I just don’t understand how it can work for ports in a sensible way. (There is no argument that it can work for some very specific isolated thing demanded by many users.)
There are several thousands of ports. We would need to somehow guess what users want of that, at the same time minimizing installers size (no one will be happy to download 10 GB dmg for a 100 KB app). That must install into some location, not conflicting both with ports and stuff in user directory. Then, it is clearly impossible to have a single installer, otherwise it either gets ridiculously huge or cannot possibly include every app someone would want. So we will need multiple installers. Say, I want apps A and B. I will need to somehow find out whether they exist in some installer and if yes, which one specifically. Assume they happen to be in two different installers. Those either need to install in non-conflicting locations or will have conflicting components (each installer will need to have a set of basic typical dependencies like openssl and python). In result I need to a) effectively download same stuff multiple times, b) either waste disk space on separate installations or figure out which components to need to install and which to disable, c) assuming I do not want to download gigabytes of dmgs every time I need to re-install system, I also need to somehow keep a track of which app is where (in local copies of installers), or otherwise search for them every time. Now consider that installers are prepared in a given moment of time (it is like a snapshot of a subset of ports). Since they won’t be regenerated on every commit, at any given moment we can have installers with incompatible versions of libraries. So if someone suggests that “we can just overwrite older stuff with newer stuff, when using another installer”, no, that won’t work, because if something is built against an older dylib and you update that dylib, that thing can be broken and refuse to launch. Now consider this whole scenario from a point of view of a maintainer (or just someone trying to help someone else on a forum here). How to debug it? With ports you can a) always see the current state of code, b) always reproduce deterministic bugs, c) fix bugs once they are discovered and update ports, which in turn fixes those for end-users. What am I supposed to do if someone says some app is broken, being installed from one of multiple incoherent installers? It is not even possible to understand what environment a given user has (at least without analysis of all that mess). Say, you figure out what is wrong. How to fix it for a user?