-
Notifications
You must be signed in to change notification settings - Fork 626
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Consider releasing as 1.0.0 #1934
Comments
Just as a meta note, there's been a bunch of breaking changes recently (just yesterday, in fact!), so I wouldn't exactly call Futures 0.3 stable. This is in contrast to Futures 0.1 which is stable. The pain of the breaking changes is small right now because few people use Futures 0.3, but once it gets promoted to 1.0 it will be much harder to make breaking changes. |
How so? As compared with releasing a final (non-alpha) 0.3.0, 1.x only adds the ability to release MINOR updates (e.g. 1.1.0) for things like new features or other changes considered a minor compatibly risk, reserving PATCH updates for safer changes. For some later, broadly breaking changes to public APIs, releasing futures 2.x is no more technically difficult or disruptive than releasing futures 0.4.x would be. |
@dekellum According to the semver spec, any The point of the Many dozens of breaking changes have already been made on the But If they don't, you get version conflicts, because a type defined in Unlike structural languages, breaking changes in nominal languages (like Rust) cause severe fragmentation and makes it very difficult (or impossible) to use those crates as dependencies. This causes a huge amount of pain, as we have seen in the past when other crates made breaking changes. I think you are underestimating how difficult it is to migrate a popular crate to a new major version. Because migrating to a new version can take months, it wouldn't make sense to release a new major version every week. But that's what is basically happening right now (we still have frequent breaking changes in The Rust community is not oblivious to semver, instead it's quite the opposite: Rust takes semver very seriously (more seriously than other languages in my opinion), and we follow it strictly (we even have official guidelines on how to follow semver correctly). That's precisely why we avoid releasing a Releasing a Of course we all want a |
It is the pre-release version ( Once 0.3.0 (not pre-release) is released, we will not make breaking changes until the next minor or major version. (The exception is when there is a security problem.) |
@taiki-e As semver.org says:
Pre-release is a separate concept, you can have pre-releases even for
Pre-release is intended as basically a "beta" of the next release, so people can try it out before the official release happens, and then later the pre-release is promoted to a proper release. It's not the same as It just so happens that
|
The semver spec documents a minimum set of requirements that a package must satisfy, you are allowed to guarantee more than it says. Because of how Cargo’s pre-1.0 default caret bounds work it is pretty much expected that Rust crates will treat |
The below agrees, and as a practical matter, has tended to allow some foundational crates to linger below 1.x for longer than SemVer (see first quote) intends. https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html
Releases ≥ 1.0.0 are both less confusing (per above, Rust norms/tools and SemVer being more in agreement) and more flexible/expressive, since both MINOR (1.1.0) and PATCH (1.0.1) releases are considered backward compatible. |
@dekellum I agree, production code should not rely on However I still don't agree with releasing On the other hand, I think it's perfectly fine to release some of the sub-crates as |
FWIW I would expect a This does causes extreme friction for companies. So it definitely doesn't seem like a goal right now. |
Totally agree, 1.0 should be considered as a long term support and consistent version over the time, I don't think current version should bump to 1.0, it just not ready. |
That is part of what I meant by "perceptual hurdle" in the OP. IMO, a less then perfectly stable "1.0.0" is a lesser evil than having the entire ecosystem have to depend on a "0.3.1", that will out of necessity end up making not-perfectly safe changes in PATCH releases (e.g. dependency and MSRV upgrades).
My proposal would allow/encourage a "1.1.0" release on the first MINOR compatibility change. At that point, because there is now room in the version scheme, bug fixes could be back-ported (by community contributors) and released as "1.0.1" or subsequent PATCH release. Would that not satisfy your expectation, @theduke? Is that not an entirely better situation than the ecosystem depending on 0.3.x? |
@dekellum That's not how semver works. If we make any breaking change, no matter how small, it must go into a major release, period. You are not allowed to make breaking changes in minor releases. That's not what minor releases are for. You keep mentioning some sort of benefit to releasing |
For people that have never released anything ≥1.0.0 in an open or closed source project, there is a very strong perceptual hurdle and sanctity associated with 1.0.0. I again suggest getting over that ASAP, simply for the purpose of having 3 version decimals and distinguishing MAJOR from MINOR from PATCH changes. |
@dekellum When using the On the other hand, releasing a new major version is a big deal, since it requires the entire ecosystem to upgrade. This is extremely painful, and takes a long time and a lot of effort from many thousands of people. Releasing new major versions on a regular basis is not good for the ecosystem, they need to be spread out to happen once every several months. This has nothing to do with "perception", it is a basic reality. There are real pragmatic costs to major version bumps. But right now major changes are happening on a regular basis, because |
This is very strong message. I think the reality is not exactly like that. If that would be followed verbatim there would be no production system written in Rust at all. (Impressive amount of crates from crates.io are still at 0.x.x while being used in production massively, |
@imp to begin with, Cargo is 0.42.0 and Clippy is 0.0.212 :) |
@imp Rust itself is If some people choose to take a risk and use In any case, even if some other crates are production ready (and thus should be At this point I'm just repeating myself, so I'll stop, but if anybody wants to argue this point they'll have to give a strong argument for why Of course after @MikailBag Cargo is shipped with Rust, so its version matches the Rust version (the same is true for clippy), so Cargo is currently at version |
To clarify slightly |
I prefer to do it in stages from more stable ones such as futures-core. see #2207 for the actual proposal to futures-core 1.0. |
We plan to release it as 1.0 in order from crate, which provides abstractions (traits) such as futures-core and futures-io. We have no plans to release the utility crates and façade as 1.0 at this time, but it basically doesn't provide any additional abstraction, so I don't think it's okay. Btw, one of the reasons why futures-* is difficult to release version 1.0 is that there are plans to add some of them to std. |
Discussions about If someone has any questions or opinions about the stability of individual futures-* crates, please open a new issue. |
Motivation
Releasing as 1.0.0 (instead of 0.3.0) would put the rust async ecosystem and futures maintainers in a better position to make changes going forward. Specifically it allows grouping subsequent changes into MINOR compatibility concerns (e.g. 1.1.0 for MSRV and other dependency upgrades and new features) as distinguished from PATCH-safe concerns (e.g. 1.0.1 for bug fixes, low-risk performance improvements, etc.). It also provides more versioning space for backporting fixes or other maintenance to older MAJOR or MINOR releases, as needed. This makes it easier to consume these updates downstream and should lead to a more stable ecosystem.
Perceived Drawbacks
Future MAJOR breaking changes would require versions 2.0.0, 3.0.0, etc. That should not be any more problematic to maintainers or downstream users than versions 0.4.0, 0.5.0, etc. would be.
Downstream dependencies will need editing. I would presume the next non-alpha release will again be called futures, not futures-preview, so all downstream projects will be editing their futures Cargo.toml dependencies to move off 0.2 or some futures-preview 0.3.0-alpha.
The Rust ecosystem at large has frequently been reluctant to make 1.x releases. Some 0.x crate maintainers feel their crate is insufficiently mature, e.g. having planned one more additional feature for 1.x. Others, conversely and ironically, have not had a major enough change to warrant the MAJOR version increase from 0.x to 1.0.0.
Meanwhile, many heavily used, foundational crates have made 1.x or subsequent major releases (tempfile 3, proc-macro2 1, lazy_static 1, etc.), and there is no evidence of those maintainers regretting the 1.x release. Thus the 1.x release appears to be more of a perceptual hurdle than a practical concern.
Further Reading
https://semver.org/#how-do-i-know-when-to-release-100
Rust ecosystem and tooling departures from Semantic Versioning are a more complex subject, but narrowly, is this next release of futures not intended for production? There is plenty of evidence of futures 0.1 being in production already.
The text was updated successfully, but these errors were encountered: