Change Mod Version and Artifact Title #2367
Comments
I really really welcome the changes regarding the SpongeAPI versioning, as it will greatly simplify Ore dependency requirements, and education of users. That said, I'm not sure how difficult it is to actually implement it gradle wise. As long as stable and bleeding remain separate, I don't foresee any issues with the versioning string confusing dependency resolvers either. The only difference I would potentially make, is label Experimental/Bleeding builds more aggressively. spongeforge-1.12.2.2705-8.0.0.23-PRERELEASE.jar would represent API8 on bleeding, before any recommended builds, using PRERELEASE as opposed to snapshot, for end users benefit. If problems occur regarding needing SNAPSHOT for dependencies, maybe this could only be exposed this way on the downloads page, and the repo's would continue to use SNAPSHOT, and SNAPSHOT for the actual versioning. |
Maybe from least changing values to most changing? |
I think this is reasonable. Thoughts are below (I don't know how I can write so much about versioning...)
Yep - I'm trying to work out where we might use a patch version, other than JD clarifications and deprecations I don't see it. Besides, having yet more release branches is just going to sap even more of our limited time. I am completely for this change. Would this work its way back to the API versioning too, or is this just SF (and probably SV)?
It's fine as is, though I do wonder if people are going to see 7.1.5.20 as more recommended than 7.1.5.0 which we actually mark as recommended. Not sure I have a specific change to propose with that though, I don't really think we want to start adding This thought is probably better solved by making recommended builds more prominent on the Downloads page (and latest builds less prominent), that's a separate issue that I know is having separate discussions.
One thought I had on the bleeding branch is to just not give it a version number (somehow) to further discourage its use as a bleeding version. I'm not completely sure as to how to do that, maybe just replace the API + Recommended version number with
The more we can discourage those builds, the better. I've seen plugin authors actively advertise their plugins for the as of writing unreleased and hugely unstable API 8 which really, given the state it's in, they shouldn't be doing. They are giving the idea that API 8 is ready when it is far from it (their plugins are going to break so much when our big changes land), based on the number of people suggesting they are using 8.0.0 builds anything we can do will help in the long run. |
I think it's worth bearing in mind that the -SNAPSHOT suffix isn't arbitrary* * edit to clarify that this is obviously when the artefact is available via a maven repo. |
|
Sorry @ryantheleach I didn't see your reply. |
I discussed this with @gabizou yesterday and we have already established that the new versioning scheme requires marking recommended builds before they are built, not some time later, e.g. by bumping the recommended build number in As for how to determine
|
Why can't the bleeding branch have tags? Isn't it being changed to |
@phase No reason it can't it would just be slightly (but not very) unorthodox, and would either require automation, or strict adherence to remember to tag.
Was mentioned by Minecrell. Also, unless Bleeding has a separate versioning thing that is kept separate, having those extra tags could also potentially interfere with the bleeding versioning numbers? Or at the least 2 solutions would be required? That's how I understand it anyway, Minecrell could probably refute or validate it. |
Bleeding as the work-in-progress branch of the next API version shouldn't have any releases. That doesn't mean it cannot have tags though, as those don't have to be releases. |
@Minecrell any luck on getting some of the versioning we discussed working? If I recall correctly, we have it where it's |
@gabizou Haven't really worked on it. We still need to make a final decision for one of the options I posted above, all of them have disadvantages so we just need to pick one of them. Right now the one that looks easiest to implement is the A Maven snapshot compatible versioning was my favorite, but after additional investigation of possible options and the Gradle/Maven source code, I haven't really found any nice way to integrate it properly. |
How about we make it so the user doesn't have to visit the docs to figure out what they're looking at? MC version first (user cares most), Sponge RB and build number (whether builds-since or total-builds, that's separate from my proposal) next, and finally anything extra (like forge version).
Users should not need to care about API version. Simplify it down to MC version and RB number, with API versions released on RB release. |
while I like this format from a userfriendliness perspective, what happens when a mc version has multiple api versions? |
"...with API versions released on RB release."
Educate users that a plugin only runs on the latest RB. |
okay that doesn't really answer my question, sorry I wasn't quite clear |
I don't really have a solution to that problem :D The first post in this issue also seems to just include the RB number regardless of being the recommended build or not. Perhaps using a builds-since-RB strategy would better clarify, with build 0 (or build number removed) as recommended build and then counting up on something that communicates it's after the RB. |
How will that work for plugins and third party implementations, such as Lantern? The reason we have an API version is so that we can say “this plugin runs anywhere that implements API 7”. I get this is about implementation, but the SpongeAPI is wider than just SpongeForge and SpongeVanilla (that might see different RB numbers depending on how the impl matures). By educating users that the plugin only runs on a particular RB might indicate incorrectly that it only runs on SF or SV, or even just one of these. It might also encourage users to stay with an outdated RB. Lantern could implement API 7 on the 1.13 protocol if it so chooses (though I seriously doubt they would) - an API version is (theoretically) separate from the version it runs on. It’s also important to note that it isn’t necessarily one-for-one with major API releases and Minecraft versions. We may need to break the API and release a new major version mid Minecraft version cycle - how would be convey that then? I get that this sucks with API versioning and impl versioning and I understand comments about users caring more about MC version over SpongeAPI version, but I’m not sure that we should hide the API version altogether because it’s that what guarantees compatibility, NOT the minecraft version. If we can find a way forward that encompasses the entire SpongeAPI ecosystem, great! |
IMO the API version has to be part of the name/version suffix. Example:
This has the following advantages over referencing the last released version. The version numbering is more consistent with new major versions. Lets assume we would be working on API 8.0 right now. How would the SF jar be named? After the last released API version (=7.1.0)? But 7.x and 8.0 are incompatible (otherwise we wouldn't have to use a new major version in the first place). So we have to stick to 8.0 as an identifier. But 8.0 hasn't been released yet so we need to clarify that (by using a special prefix like As for the other parts: @gabizou 's suggestion looks good to me. |
To summarize the issue: Since we can't get maven publishing to auto increment builds, but we can get some git-fu tasks to "calculate" the amount of builds since a recommended, we could very well keep with having RB in the name to signify whether this is based on a recommended build yet or not, so for example: gradle.properties {
recommended-version=3.0-SNAPSHOT
} Artifact name: What we could even do is if we wanted to keep build numbers relative in the string for artifacts (only because recommended builds are recommended and could very well be tagged and made formal releases by maven), the build number can be included in the recommended build string like so:
What we also gain the benefit of is that if we need to make a bug fix release of a recommended build, we can bump the minor version of the recommended version (so I feel with this approach, we could very well preemptively define recommended builds on a normalized release schedule (not that we'd keep to it anyways) without having to mark older builds as recommended after the fact. @Minecrell let me know if this seems feasible as I want to get this issue sorted and implemented for 1.13's development and quite possibly start 1.12 builds on the new format. It won't be a flip of the switch, we'll have PSA's on the forums etc., but it's something I'd rather we get done instead of letting the issue get tossed back and forth for months. |
@gabizou Your latest reply seems ambiguous to whether 7.1 represents a released API version, or the current 'snapshot' version. This is arguably the most important point to me, and plugin devs being nagged by server admins on Ore.
I would go as far as saying that the current way of referencing the API is terrible, causes undue pressure on plugin authors to 'update' to bleeding API before it's released, releasing plugins which, will break, should API be adjusted before release. This is the root issue to all the plugins depending on the latest snapshots, falsely believing that this makes them 'compatible' with the latest Sponge builds, as opposed to releasing test builds. |
I'd say what I said before (I wrote my example as |
I want to back this up with the Ore perspective. Ore is flooded with people using snapshot APIs, and it's greatly in part to how we market our API versions. This is bad for server owners who are wanting to look for something that matches their setup. An API & MC Version filter will be coming soon, but having people depend on these unstable APIs is inherently bad! |
Posting here again with some additional refinements and clarifications regarding recommended builds of implementation (and resolves versioning sponge common to be maven usable and ore definable): Currently, we have the following (all projects versioning currently): SpongeAPI:Maven style version, Currently at SpongeCommon:Maven versioned based on the API target, not versioned in any other way to artifacts. This needs changing. Currently, we have a cycling release of API 7.1.0 builds of SpongeCommon as bugs are fixed towards the next Recommended Build. Current:
Changes:
SpongeForge:The whole kaboodle of information.... This needs to be clear from an artifact name and from in game version string presented that we can pinpoint which version is being used. Current
Problems with thisFor starters, we have to manually promote recommended builds after the fact, and there's little way of knowing if a spongeforge is a recommended build or not just by running it or looking at the version string. People know recommended builds by build number. Changes
The point I'd like to emphasize here is the Recommended Build idea: RecommendedVersion=4 Leading to the following version string: Alternatively, if it's not a recommended build, it'd be like so: RecommendedVersion=4-SNAPSHOT Leading to the following version string: `1.12.2-2705-7.1-RB4.3447-SNAPSHOT The build number MUST be included, since that is still a definition for a lot of people about bug Likewise, this will further identify bleeding builds as the 1.12.2-2705-8.0-RB0.3447-SNAPSHOT Which brings the visibilty that the API has not been released, nor has there been a recommended build Note that |
@SpongePowered/developers @SpongePowered/docs @SpongePowered/ore Updated the original description of the issue for a more finalized proposal. Please bring up any issues or comments for changes as the format will be final very soon. |
Having discussed it with Zidane, we're deciding the issue description in OP is the final format. To summarize, the new format is:
With the following latest recommended and latest bleeding builds (and future release builds).
Naturally, we cannot change previous artifacts in any way, nor their versions, so this format change will still need documentation on the old format just to read legacy builds (?), depending on @Inscrutable's consideration. I'd very much like for our current stable and bleeding branches to adopt the new format (API 8 builds will adopt new format, API 7 will keep old format, just API, not common or sponge forge). So we'll still have API We should very well close this issue with a commit that officially starts the version change in |
SpongeDocs can expand the current versioning page to include the new version formatting, retaining an explanation of the old style "Legacy format" and it's deprecation date. Probably also including the first and last builds of each so users can easily see where the change took place. |
I have a minor quibble with the UX of the terms RC vs RB, and was in mixed feelings of using the term Preview, Pre Release, to represent RC instead, On one hand it would match the semantics of minecraft pre release / experimental builds but apply to us instead, On the other hand confusion could be had as users believe it's related to the mojang pre releases. Overall I am extremely pleased with the result (if this is the final version) and I know I've been irritating to talk to about this issue during SPAM and that is IS/will be a monstrous effort to change something that seems rather small. This should make versioning a ton easier for new users to our platform, and stress removed from plugin developers. |
This now allows for SpongeCommon to be represented as a PluginContainer with it's own versioning separate from the actual implementation packages. What this gains is the ability for plugins to depend on the 'sponge' implementation while gaining versioning capabilities separate from the API. The downside is that the implementation must now provide such PluginContainers for 'sponge' separately from their own PluginContainers, such as 'spongeforge' or 'spongevanilla'. This is related to SpongePowered/SpongeForge#2367. Signed-off-by: Gabriel Harris-Rouquette <gabizou@me.com>
We've reached a point where it's time to clean up our versioning scheme, not just for SpongeForge, but for SpongeAPI, SpongeCommon, SpongeVanilla, and SpongeForge. Since the issue originally started with SpongeForge needing a version string improvement, the discussion illuminated that version schemes all across the board need to be fixed.
What we have right now
We have versions based heavily on the most current SpongeAPI mentioned in the implementation, which usually is whatever is the latest commit on stable branches.
Latest
7.2.0-SNAPSHOT
7.1.0
1.12.2-2705-7.1.0-BETA-3447
1.12.2-7.1.0-BETA-117
Recommended
7.1.0
7.1.0
1.12.2-2705-7.1.0-BETA-3361
1.12.2-7.1.0-BETA-59
Why is this a problem
Where to start....
3361
, and SpongeVanilla has59
. Nothing really else to tell us something different for either project, how many recommended builds we've had.7.2.0-SNAPSHOT
.7.2.0
is actually released compared to when7.2.0
is still in development. Implementation is "implementing" whatever the API is at the commit, but those additions can not only be mostly ignored from a server admin perspective, it complicates the issue of saying that an implementation supports a particular API release in it's fullest compared to previous builds referencing the snapshot version of said api (A SpongeForge build using SpongeAPI 7.1.0-SNAPSHOT from three months ago will be missing some API additions we have made within those three months, and therefor violate the contract that it's not actually implementing SpongeAPI 7.1.0).BETA
?sponge
. SpongeCommon needs to start dictating not just the SpongeAPI version, but also the recommended common build version. If we're making modifications to SpongeVanilla or SpongeForge that is irrelevant on SpongeCommon, that's where build numbers can come in to play, and of course, a recommended build would be bumped in common.With these issues, it has made it incredibly difficult to not only teach users to read versions, but also to make it clear when experimental versions are really experimental in comparison.
What do I propose
I'll put up the format equivalent as above for easier comparison:
Format
{APIMajor}.{APIMinor}(-SNAPSHOT)
{MC}-{LatestAPIMajorRelease}.{LatestAPIMinorRelease}.{RecommendedVersion}(-SNAPSHOT)
{MC}-{ForgeBuild}-{APIMajor}.{APIMinor}.{RecommendedVersion(-RC{BuildNumber})}
-SNAPSHOT
with-RC{BuildNumber}
{MC}-{APIMajor}.{APIMinor}.{RecommendedVersion(-RC{BuildNumber})}
Example
7.2-SNAPSHOT
7.1
1.12.2-7.1.5-SNAPSHOT
1.12.2-7.1.4
1.12.2-2705-7.1.5-RC3447
(RC: Release Candidate)1.12.2-2705-7.1.4
1.12.2-7.1.5-RC117
1.12.2-7.1.4
Wait, so SpongeAPI is changing?
Partially... Since we're going to be dropping the patch version from implementation versions, SpongeAPI version 8 may as well drop the patch version officially (since SpongeAPI has releases with the patch version currently, we have to break it on the major version).
Ok, what's this RC stuff and snapshot?
Glad you asked. RC stands for Release Candidate. If we have a Recommended Build, we'll be actively committing a build as a recommended version, with the actual recommended version bump being made to SpongeCommon. How this changes from current workflows is that we have several builds of both implementations, SpongeForge and SpongeVanilla, which could be considered candidates for recommendation, but when we do make the conscious decision to mark a build as recommended, we do it after the fact. Because we are doing the marking after the fact, we don't have a chance to rename the files any differently, make any tags, commits, etc. except some manual labor of writing some posts and release notes, but no actual version changes for developers to use.
So, instead, we're making the conscious decision that SpongeCommon is comfortable and has enough bug fixes etc. since the last Recommended Build, we'll change the
RecommendedVersion
in a settings file, and then make the necessary commits bumping the references in SpongeForge and SpongeVanilla. This way, it's very clear that a new build is a recommended build after some testing. In combination with the actual versioning of SpongeCommon, plugin developers will be able to *actually depend on a particular SpongeCommon version that would be shared between SpongeVanilla and SpongeForge! But wait! There's more!! Because SpongeCommon is now being versioned, SpongeCommon is now represented with aPluginContainer
, and therefor a valid checked dependency to both Sponge implementations, Forge, (pending these versioning changes) Lantern, and Ore!Wait, two things: What does SpongeCommon get as an id? And what's this snapshot and RC number for SpongeForge and SpongeVanilla?
Valid pair of questions, I didn't get to really finish talking about the complete
PluginContainer
aspect of SpongeCommon, but I can now.SpongeCommon as a project is a bulk of the implementation of SpongeAPI targeting a particular version of Minecraft. What the project originally started as was the Forge implementation of SpongeAPI, at which, the original project's name was just Sponge. Because of this legacy, we've listed SpongeForge and by default, SpongeVanilla as
sponge
plugin containers. Being that implementation dependent plugins were being written to use the only plugin id to say they depended on wassponge
, which brings the problem with Ore, where plugins can't be determined if they depend only on SpongeCommon, SpongeForge, or SpongeVanilla, or a combination of the three (multi-module). Since 90% of our implementation is defaulted by SpongeCommon at this point, and most all implementation dependent plugins already target SpongeCommon, it's safe to just say that SpongeCommon being represented with aPluginContainer
with the idsponge
is the best option. Likewise, having SpongeCommon having aPluginContainer
, the version provided by the examples above makes the version that plugin authors have to reference being platform independent! They don't care if you're running SpongeForge or SpongeVanilla! They only care that you are runningsponge
with version7.1.4
, because that's what they built on.And the RC numbers?
Wrong question. Here's the thought process so far:
Recommended Version
with full-SNAPSHOT
support for dependency resolutionPluginContainer
due to versioningsponge
The better question is:
What does this change for SpongeForge or SpongeVanilla
?Answer:
SpongeForge and SpongeVanilla will always have referenced build numbers in between recommended builds, so we need a way to represent that clearly, given that SpongeCommon already tells us what the current core version (
7.1.5-SNAPSHOT
as an example), while keeping build numbers in play for determining what bugs were fixed between which builds, etc. Because Maven replaces-SNAPSHOT
with a timestamp by default, we can't rely on-SNAPSHOT
being usable for versions, let alone for build numbers. So, we do some fancy "is this a snapshot or release" detection and boil down the results to this:Leading to the ability to say just from reading a version string: Is this build recommended?
1.12.2-2705-7.1.5-RC3447
1.12.2-2705-7.1.4
Wait, what about API versions that haven't been released? How does this resolve that issue?
Ah yes, almost forgot. Unreleased APIs are a little troublesome. Since we only take the
{APIMajor}
and{APIMinor}
version as a partial version for showing what SpongeAPI is supported (fully), we have to somehow show that a major SpongeAPI version is still incubating (bleeding) and hasn't been released. To do that, we consider the SpongeAPI version reference I made in the format above,{LatestAPIMinorRelease}
. Since in-development major versions of SpongeAPI have never had a release, let alone a minor version release, the implementation is equally still in development. That being said, the solution is to simply "reset" theRecommendedVersion
back down to0-SNAPSHOT
, leading to the following SpongeCommon version:1.12.2-8.0.0-SNAPSHOT
, which leads to this example from a pre-existing SpongeForge version:1.12.2-2705-8.0.0-RC3449
.Hold on, if unreleased API versions have
0-SNAPSHOT
, how do we know when there's an official release of the implementation supporting the just released8.0
SpongeAPI?Yep, I know, it's a little quirk, but remember, we use
-SNAPSHOT
to represent a goal towards next release of that target number. The workflow when a new SpongeAPI major release occurs, and SpongeCommon, SpongeForge, and SpongeVanilla are recommended for use of the full API available with that major release version, we can just make a formal release without the-SNAPSHOT
identifier. This would lead to (as an example again): the first release of SpongeCommon supporting the full release of SpongeAPI having the version1.12.2-8.0.0
. Here's a table example:8.0-SNAPSHOT
8.0
8.1-SNAPSHOT
1.12.2-8.0.0-SNAPSHOT
1.12.2-8.0.0
1.12.2-8.0.1-SNAPSHOT
1.12.2-2705-8.0.0-RC3449
1.12.2-2705-8.0.0
1.12.2-2705-8.0.1-RC3453
1.12.2-8.0.0-RC117
1.12.2-8.0.0
1.12.2-8.0.1-RC120
From this table, we can now easily see what the first major release will look like, what in-between releases will look like, how recommended builds will be versioned, and lastly, make recommended builds easily identifiable.
Summary
SpongeAPI Changes
7.2.0
may well be the last one to have such a number (if we don't choose to change it after this issue is settled)+
Useless feature that previously just occupied an extra two characters-
Incompatible with previous regex version strings. Other projects may need to drop support of features for older versions.+
Because this is still a new version, it's a simple range detection.SpongeCommon Changes
{MinecraftVersion}-{APIMajor}.{LatestAPIMinorRelease}.{RecommendedVersion}
+
SpongeCommon becomes a properly versioned dependency for plugins+
Maven support. Releases are easily detected, and likewise snapshots are updatable.+
{RecommendedVersion} reset on {APIMajor} bumps (bumping from SpongeAPI 7.x to 8.x will need to have the {RecommendedVersion} set back to0-SNAPSHOT
).+
Plugins depending onsponge
will be able to depend on a particular recommended version or higher, as supported by Maven+
Platforms like Lantern can easily detect if a plugin is depending on SpongeCommon's implementation before attempting to load the plugin.+
Ore can tag plugins automatically for platform support.-
Plugins believingsponge
being SpongeForge and using forge related classes will now fail, but who cares? They need to update anyways.-
Previous dependency references for a SpongeCommon version will break, but who cares?SpongeForge Changes
+
Was a useless tag anyways.-SNAPSHOT
with-RC{BuildNumber}
. If it's a release, don't change the version.+
Still showing what Forge version we depend on+
Easy viewing of whether someone is running a recommended build or not-
Each build is still considered a maven release since the version string is unique.+
Can filter builds for being recommended or release candidate builds.spongeforge
as an id to represent SpongeForge'sPluginContainer
. This is out of necessity since we already have to represent SpongeCommon, we need to present an equally appropriatePluginContainer
for SpongeForge+
Plugins can specifically depend on SpongeForge, and particular version ranges.+
Ore can tag plugin releases for platform dependencies just by the contained plugin containers-
One morePluginContainer
representation to implementSpongeVanilla Changes
+
Was a useless tag anyways.+
Similar to SpongeForge, except the missing Forge build number dependency.+
Aside from the build number, the version will match SpongeCommon exactly on releases.I've encouraged the discussion to get to this finalized version. I would encourage any issues with the new format to be brought up soon before the final decision is made.
The text was updated successfully, but these errors were encountered: