Why no curl 8
daniel.haxx.se
daniel.haxx.se
1. Thought through the application/library from the beginning so that new features and changes are binary compatible.
2. Is considerate of the distribution/repository world we live in, doesn't just say "ain't my problem"
3. Doesn't just add numbers to do it.
Good work sir, stay strong curl 7
It tries to force different protocols like HTTP and FTP into a single API, making for lots of combinations of switches that sometimes do and sometimes do not work together.
I could go on, but it's all stuff like this. It's not a bad API, just very archaic.
so we couldn't go from 9365 to 0001. So we just went to 9366 and so we had 999-366 days to sort out a better version numbering system.
This is definitely the weirdest example of the Y2K problem I've seen.
At the end of the day when the version number isn't really known to the end user it makes little difference if you bump up the major version number or the minor.
Also I love how quickly we get new features now. Firefox has improved more in the past year than it did in the past several years before the shift to a 6 week release cycle. It isn't suited to all software I admit but for a browser it is perfect. None of this "This site only works with Firefox XX or Chrome XX". Thank god!
This is more caused by Firefox stopping to break the compatibility all the time. The plugin API in Firefox used to be just the internals, exposed to JS, so everytime something changed, it broke extensions. These days, they stopped doing that quite as often plus they published the Jetpack SDK which promises a stable API at the cost of less possibilities to change the browsers behaviour.
I think that what Chrome (and later Firefox) ended up doing is a pretty good compromise. The major version of Chrome is basically "Chrome" - if they ever break compatibility in any kind of major way, it probably will be as a different project. Firefox is the same way.
I know that it'd be great if you could derive deep secrets about the changes in each release from just the version number, but that just doesn't scale to complex projects. Use SemVer and similar schemes where they're appropriate, but don't treat them like they're the only right choice.
Where is the meaning? At least for Chrome/Firefox you know x+1 means another six weeks are over...
> These distributions only want one version of the lib, so when an ABI bump is made all the applications that use the lib will be rebuilt and have to be updated.
This is not true, at least on Archlinux. Currently I have 5 different versions of libpng installed:
local/lib32-libpng 1.5.14-1
local/lib32-libpng12 1.2.50-2
local/lib32-libpng14 1.4.11-2
local/libpng 1.5.14-1
local/libpng12 1.2.50-2
Imagine for example, a rather classical stack. Let's take KDE cause they are on the top of the news.
we have libpng 1.2.x With headers in include/libpng/. ( This is wrong, very acute of you to notice. ) We link kdelibs to libpng-1.2 ( independent use, inherited link ) We link kicker to libpng-1.2 ( kicker uses some things from libpng as well. Yey )
New version of libpng is installed, 1.4. Breaking ABI but not API in the process! If this version is installed in "include/libpng/" You'll link future versions of kicker against this. This gives the chain:
kdelibs : libpng 1.2.x kicker : libpng 1.2.x libpng 1.4.x Oh, what just happened? You say that the ABI collides at run-time and nothing loads .png files anymore?
So, what if we instead make /include/libpng link to /dev/null, and only explicitly install headers into libpng-1.2 and libpng-1.4? Sure! Lets go that way.
kicker now links properly against 1.2 for both. The krita comes along. Krita wants to use a new fancy feature in libpng 1.5. cool. Let's just link that.
Wait. did we just collide the public API again? Crap.
So, in practice. It doesn't work quite as well as hoped. Function resolving when several libraries provide the same function is. Messy. Especially when they aren't perfectly interchangeable.
That's... a big deal?
Relative to everything else that goes on in making a distribution, it seems pretty trivial.
There's no automated pipeline of code -> build -> distro package -> testing happening, because almost everyone is still stuck in the bad old days of "download the tarball and compile it" and if you're really lucky you get a checksum on the tarball.
Ideally, we'd move to some automated means of putting together software. Imagine if there was GitHub/TravisCI style automatic process that spit out packages for Linux/BSD/Solaris/OS X/etc. on every checkin. That's where we need to go.
The problem is, unless the upstream dev uses Debian, why should he care?
More modern languages solve this by having their own formats - java/maven is particularly impressive, but python/ruby/node all have their own ways to specify dependencies and package libraries - which not only work crossplatform, but also make it much easier to have compatible or incompatible version bumps.
Maybe it's time for a virtualenv/bundler-like solution for C. Or time to stop using it for anything outside the base OS.
Also, how would you specify a cross-language dependency, for example from a Python application to a Ruby application to a Ruby library? Should the Python-installer know how to handle "Ruby-dependencies" and what little piece of software to call to install said dependency?
I guess it would be better to have a cross-language VM - something that the CLR and the JVM are trying to do. Or it's possible to treat virtualization images (e.g. AMIs) as your execution environment and use a package manager inside that (although there are still no good package managers for C in terms of handling dependencies on conflicting versions of the same libraries). The point is that the "native" system is too inconsistent.
>Also, how would you specify a cross-language dependency, for example from a Python application to a Ruby application to a Ruby library?
I don't think that actually happens; you can only have a dependency where you have a common interface. If you were running the programs in Jython and JRuby you could have such a dependency, but in that case you would be able to use a JVM-oriented package manager for both.
You're right though; there's no reason a package manager should be language-specific. A virtualenv/bundler-like piece of software that managed the installation of libraries in any language would be a very good thing.
There is always the OS as a common interface. For example, I don’t see why some application should not require a mailserver to be installed, i.e. a ‘mail’ binary to be present, even if said binary might be a native C binary rather than a Python script.
I guess it all depends on what you want to do: If there is little to no interaction/overlap between applications, either because you want to keep them separate anyways[0] or because there is only one application running on a system, deploying a VM for each application makes perfect sense. On the other hand, if I had to install every library required by each application separately for said application[1], my system that currently fits nicely into 6 GB would probably require at least a few gigabytes more, and likely also more RAM.
[0] Because you don’t necessarily trust the authors, for example, as appears to be the case with all the Markets/Playstore/insert-fancy-name-here.
[1] This btw already exists, it’s called ‘static linking’.
[1] http://nixos.org
I agree, though, that it does look like an interesting project, but also have to admit that I’m quite happy with the state of package management in Debian – including the idea to force everything into the dpkg/APT framework.
See http://semver.org/ for more details.
Edit: others have pointed out that this is more important for libraries and less so for user-facing applications. For user-facing applications I'd recommend two version numbers so you can distinguish between feature releases and bugfix-only releases, which can be a useful indicator to the end user.
I realize they follow semver (at least unofficially), which I think is great. What I want to know is if there any good reasons why others don't do it?