Version Control
Dividing the API into several versions is necessary for improvement without compromising backward compatibility. On one hand, new needs constantly arise and changes must be made; on the other hand, any change to the interface can break the functionality of existing plugins. To resolve this dilemma, the history of API development is divided into versions: at a certain point, the development of the next version is halted, the interface is fixed, and further development continues within the next version. Whatever changes are made in the future, the plugin developed for the fixed version will function properly until that version is no longer supported.
Version Lifecycle
Large LTS versions (from Long-Term Support) are released approximately every two years and are supported for about four years. Between them, intermediate preview versions are released every three months and are supported for 3 versions of SyrveRMS. Thus, at any given time, the two most recently released LTS versions, the three most recently released preview versions (or two if an LTS version was released in the previous 9 months), and a developing LTS version available for review are supported.
LTS versions are numbered sequentially with whole numbers — V1, V2, V3, V4, V5, V6, and so on. Preview versions are interim states of the developing LTS version, so they contain the number of the developing LTS version in their name and are numbered sequentially with the prefix “Preview”, for example, during the development of V9, versions V9Preview1, V9Preview2, and so on will be released until V9Preview7, after which V9 itself will be released.
Release Schedule
After the release of the next LTS version, roles are redistributed as follows:
- support for the deprecated version is discontinued;
- the version that was stable is declared deprecated;
- the version whose development has been completed is fixed and becomes stable;
- a new developing version appears.
The cycle of preview versions is slightly simpler:
- support for the deprecated preview version is discontinued;
- the current preview version is declared deprecated. If there were two current preview versions, the older one is declared deprecated;
- the interim state of the developing LTS version is released as the new current preview version.
Choosing a Version
By default, it is recommended to use the stable LTS version, as this will minimize the effort required for migration to new API versions. If new features that are not yet available in LTS versions are needed, it is recommended to use the current preview version; in this case, migration between preview versions will be necessary every 3-6 months until the next LTS version is released. It is better not to start development for versions declared deprecated, as this is unpromising; these versions are supported only for backward compatibility during the period when a new API version has already been released, but plugins have not yet transitioned to it. Using the developing version is not recommended, as its interface is not yet fixed, backward compatibility is not guaranteed, and any changes are possible. This version is available for exploring new features and for early plugin development for the future API version, so that by the time it is released, a ready or nearly ready plugin providing new capabilities is available.
The API version for which the plugin is developed is determined by the version of the interface IFrontPlugin that it implements.
For example, if the plugin references the assembly Resto.Front.Api.V6.dll and implements the IFrontPlugin interface from this assembly, it is a V6 plugin.
It is assumed that the V6 plugin uses the API interface of version V6.
However, if necessary, the plugin can simultaneously use all supported API versions.
Considering that starting from V6, the namespaces do not contain the API version number, to avoid collisions between types with the same name from different assemblies, it will be necessary to use extern alias.
For example, to access an operation that appeared only in V7Preview2 from a V6 plugin, in addition to the usual reference to V6, it is necessary to add a reference to V7Preview2 with the alias V7Preview2, and then extract the service V7Preview2::Resto.Front.Api.IOperationService from PluginContext.Services.
The PackageReference mechanism supports extern alias starting from Visual Studio 2019 16.7.
Important: do not implement interfaces IFrontPlugin of different versions simultaneously; such a plugin will not be loaded.
Compatibility of SyrveRMS Versions and API Versions
| Version | Release | Removal |
|---|---|---|
| V1 | 3.1 | 3.8 |
| V2 | 3.3 | 4.3 |
| V3 | 3.8 | 5.4 |
| V4 | 4.3 | 7.0 |
| V5 | 5.4 | 8.0 |
| V6Preview4 | 6.41 | 7.0 |
| V6Preview5 | 6.4 | 7.1 |
| V6 | 7.0 | |
| V7Preview1 | 7.1 | 7.4 |
| V7Preview2 | 7.3.52 | 7.4 |
| V7Preview3 | 7.3 | 7.5 |
| V7Preview4 | 7.4 | 7.6 |
| V7Preview5 | 7.5 | 7.7 |
| V7Preview6 | 7.6 | 7.9 |
| V7Preview7 | 7.7 | 8.53 |
| V7 | 7.9 | 9.5 |
| V8Preview1 | 8.0 | 8.2 |
| V8Preview2 | 8.1 | 8.3 |
| V8Preview3 | 8.2 | 8.4 |
| V8Preview44 | 8.3 | 8.6 |
| V8Preview5 | 8.4 | 8.7 |
| V8Preview6 | 8.5 | 8.8 |
| V8Preview7 | 8.6 | 8.9 |
| V8 | 8.7 | 10.3 |
| V9Preview1 | 8.8 | 9.1 |
| V9Preview2 | 8.9 | 9.2 |
| V9Preview3 | 9.0 | 9.3 |
| V9Preview4 | 9.1 | 9.4 |
| V9Preview5 | 9.2 | 9.5 |
| V9Preview6 | 9.3 | 9.6 |
| V9Preview7 | 9.4 | 9.7 |
| V9 | 9.5 | |
| V10Preview1 | 9.6 | 9.9 |
| V10Preview2 | 9.7 | 10.0 |
| V10Preview3 | 9.8 | 10.1 |
| V10Preview4 | 9.9 | 10.2 |
| V10Preview5 | 10.0 | 10.3 |
| V10Preview6 | 10.1 | 10.4 |
| V10Preview7 | 10.2 | 10.5 |
| V10 | 10.3 |
1 Version V6Preview4 was experimental, released at the beginning of the SyrveRMS 6.4 development cycle. Additionally, V6Preview6 and V6Preview7 were skipped, and the LTS version V6 was released instead. 2 Version V7Preview2 was released late as 7.3.5 (instead of 7.2). 3 Support for version V7Preview7 was extended to 8.6 inclusive due to issues with auto-updating plugins from V7Preview7 to V7. 4 The lifespan of Preview versions starting from V8Preview4 has been extended by one SyrveRMS version.
Starting from SyrveRMS version 8.5, the support cycle for Preview versions is extended: version V8Preview4, which was released in 8.3, will only be removed in 8.6, i.e., it is supported in 8.3, 8.4, 8.5.
Backward Compatibility
Backward compatibility guarantees that a plugin developed for a specific API version will work the same with any versions of SyrveRMS that support that API version.
Software Compatibility
Software compatibility prohibits changes to the public interface — data structures, method signatures, and so on must be fixed. It is clear that if a public class or method is removed, the plugin will fail to compile with the new SDK, and a plugin compiled under the old SDK will crash during runtime (TypeLoadException, MissingMethodException, etc.). There can also be less obvious violations of backward compatibility. However, if we disregard exotic cases, in practice, adding a new class, property, or method can be quite safe. This allows for the use of new features without waiting for the next release. With this in mind, the current policy is:
- in LTS versions, no changes after release, because every public change is a breaking change,
- in preview versions, almost certainly backward-compatible changes to the public interface are possible.
Changes in Behavior
In general, changes in the behavior of released API versions are not allowed. If a function worked under certain conditions, it will continue to work, and if it did not work, it will continue not to work. The exception is destructive API usage scenarios, where the consequences are worse than violating backward compatibility. For example, if due to a vulnerability in the API, erroneous actions by the plugin could lead to data corruption or stop the operation of the SyrveFront application, then the API will include appropriate protection. This will not be considered a change in behavior, as correctly functioning plugins will not notice any changes.
Support Duration
The duration of support for a specific API version refers to the period during which updates to SyrveRMS are released that support that API version. There is no calendar limitation in the SyrveRMS product on the ability to use a particular API version. All API versions supported by a specific build of SyrveRMS are supported indefinitely. Thus, if a SyrveRMS user does not update, they can theoretically continue to use old plugins for as long as they want. However, in practice, users are forced to update SyrveRMS for compliance with changes in legislation, new features, and bug fixes, which means that plugin developers must timely release updates compatible with new API versions.