| # Aries versioning policy |
| |
| The Aries project aims to implement OSGi semantic versioning as described [here](http://www.osgi.org/wiki/uploads/Links/SemanticVersioning.pdf). |
| |
| The implementation of semantic versioning has a number of practical implications for managing a project. These are |
| outlined in this section. |
| |
| |
| ## Package versions |
| |
| ### Exported packages |
| Versions are usually specified in packageinfo files with the source code. The default-parent pom is |
| configures (in the build resources section) to expect packageinfo files. If your pom has a build |
| resources section it replaces what is inherited from the default-parent, so you may need to reproduce |
| the section which specifies where packageinfo can be found. |
| |
| Developers **must** increment the versions in packageinfo files in strict accordance with OSGi |
| semantic versioning when they make changes to a package. The version should relate to the **most |
| recent release of the package** and not to the version found in trunk. For example: |
| |
| #### Scenario 1, making changes to a package with released version a.b.c |
| |
| * Developer A fixes a bug in the package and increments it's version to a.b.c+1 |
| * Developer B fixes another bug in the package but leaves the version at a.b.c+1 |
| |
| |
| #### Scenario 2, making changes to a package with released version a.b.c |
| |
| * Developer A adds a method to an interface in the package and increments it's version to a.b+1.0 |
| * Developer B fixes a bug in the package, leaves its version at a.b+1.0 |
| |
| |
| #### Scenario 3, making changes to a package with released version a.b.c |
| |
| * Developer A fixes a bug in the package, and increments its version to a.b.c+1 |
| * Developer B deletes a method from an interface and increases the package version to a+1.0.0. Note the final '0' here, developer B's change is more significant |
| so there is no need to reflect Developer A's change with a micro version of '1'. Indeed, a version of a+1.0.1 would imply a bug fix to version a+1.0.0. |
| |
| |
| |
| |
| ### Importing packages |
| The bnd default version range policy for imports is the consumer policy (==, +). Implementers of interfaces will need to |
| override this. For example as an implementer of an interface the version range |
| would be the provider policy (==,=+). |
| The policy can be set by using the Maven property <aries.osgi.version.policy>, see the default-parent |
| pom for an example. |
| |
| ## Bundle versions |
| |
| **Note: Bundle versions are changed at release time and only by the release manager. Bundle versions are not updated during development.** |
| |
| OSGi semantic versioning applies to bundles as well as packages. When releasing a new version of a bundle |
| the change in the bundle version should give some indication of nature of the changes to the bundle. |
| In Aries the bundle version is the same as version of the Maven artifact version. |
| During development, in trunk, the Maven artifact version will be: |
| |
| * x.y.(z+1)-SNAPSHOT |
| |
| Where x.y.z is the most recent release of the bundle |
| |
| During the release process the Maven release plugin asks for a the subsequent version to use in the module's pom after the release has taken place. The default is to increment the last digit and add -SNAPSHOT. |
| |
| For example, if proxy is released at version 1.0.0, the development version of proxy in trunk will become 1.0.1-SNAPSHOT. |
| |
| In addition, after a release, modules dependencies should refer to the lowest |
| released version providing enough exported functionality the bundle |
| requires. This ensures the import version is automatically set correctly |
| to allow for loose coupling supported by OSGi. |
| |
| For example, bundles which depend on proxy (e.g. blueprint) will be set to depend on the released version of proxy. Immediately after |
| a release of proxy at say 1.0.0 and a release of blueprint at 1.2.0, the development version of blueprint in trunk will be 1.2.1-SNAPSHOT |
| but the version of proxy that it depends on will be 1.0.0. |
| |
| |
| ###Assigning a bundle version number at release time |
| |
| At release time the release version of the bundle must be assigned by the release manager after reviewing |
| the changes to the bundle's package versions since the last release. This is not a particularly time consuming task as long as |
| packageinfo files are used for versioning packages. |
| |
| So, for example, if proxy has a version of 1.0.1-SNAPSHOT in trunk but one of the API's that is exported by proxy |
| has changed its package version from 1.3.4 to 2.0.0 in trunk, the bundle version would be incremented |
| to 2.0.0 on release to indicate an incompatible change in (at least) one of its packages. |
| |
| |
| Bundles that don't export any packages will still change version when bugs are fixed. In this case |
| the new release version will be x.y.(z+1) if the last release was x.y.z. |
| |
| |
| |
| |