From e2b6a1e0e246ef1b2620955ded45a8892e9401b2 Mon Sep 17 00:00:00 2001 From: berkansasmaz Date: Mon, 12 Jan 2026 14:49:26 +0300 Subject: [PATCH 1/2] Create a Versioning & Releases Document for ABP Platform --- docs/en/release-info/index.md | 137 ++++++++++++++++++++++++++++-- docs/en/release-info/upgrading.md | 2 + 2 files changed, 130 insertions(+), 9 deletions(-) diff --git a/docs/en/release-info/index.md b/docs/en/release-info/index.md index e3d3aa56cd..b7da966e43 100644 --- a/docs/en/release-info/index.md +++ b/docs/en/release-info/index.md @@ -1,16 +1,135 @@ ```json //[doc-seo] { - "Description": "Explore the latest ABP Framework release information, including notes, migration guides, and upgrading tips to enhance your development experience." + "Description": "Understand ABP Platform's versioning, release schedule, LTS support policy, and how we handle breaking changes to ensure smooth upgrades for your applications." } ``` -# Release Information +# Versioning & Releases -* [Release Notes](./release-notes.md) -* [Migration Guides](./migration-guides/index.md) -* [Road Map](./road-map.md) -* [Upgrading](./upgrading.md) -* [Preview Releases](./previews.md) -* [Nightly Releases](./nightly-builds.md) -* [Official Packages](https://abp.io/packages) \ No newline at end of file +ABP Platform follows a predictable release cycle aligned with .NET releases. This document explains our versioning strategy, release schedule, support policy, and how we handle breaking changes. + +## Our Commitment + +As a framework you build upon, ABP must be both reliable and evolving — stable enough to trust for long-term projects, yet continuously improving with new features and the latest .NET advancements. To achieve this balance, we commit to: + +* **Predictable releases**: Major versions annually, aligned with .NET releases +* **Long-term support**: Every major version receives 2 years of support +* **Smooth upgrades**: Comprehensive migration guides and tooling for version updates +* **Transparent communication**: Clear documentation of breaking changes and deprecations + +## ABP Versioning + +ABP version numbers indicate the level of changes that are introduced by the release. This use of [semantic versioning](https://semver.org/) helps you understand the potential impact of updating to a new version. + +ABP version numbers have three parts: `major.minor.patch`. For example, version 10.1.2 indicates major version 10, minor version 1, and patch level 2. + +The version number is incremented based on the level of change included in the release. + +| Level of change | Details | +| --- | --- | +| **Major release** | Contains significant new features. Aligned with the new major .NET release. Some developer assistance is expected. You should check the [migration guide](migration-guides/index.md) and possibly refactor code to adapt to new APIs. | +| **Minor release** | Contains new features and improvements. Minor releases are generally backward-compatible; minimal developer assistance is expected, but you can optionally modify your applications to begin using new APIs and features. | +| **Patch release** | Low risk, bug fix and security patch release. No developer assistance is expected. | + +> **Note:** ABP version is aligned with .NET version. For example, ABP 10.x runs on .NET 10, ABP 9.x runs on .NET 9. + +### Preview Releases + +We provide preview releases for each major and minor release so you can try new features before the stable release: + +| Pre-release type | Details | +| --- | --- | +| **Release Candidate (RC)** | A release that is feature complete and in final testing. RC releases are indicated by a release tag appended with the `-rc` identifier, such as `10.1.0-rc.1`. | +| **Nightly builds** | The latest development builds published every weekday night. Nightly builds allow you to try the previous day's development. | + +See the [Preview Releases](previews.md) and [Nightly Builds](nightly-builds.md) documents for more information. + +## Release Frequency + +We work toward a regular schedule of releases, so that you can plan and coordinate your updates with the continuing evolution of ABP and the .NET platform. + +> **Note:** Dates are offered as general guidance and are subject to change. + +In general, expect the following release cycle: + +* **A major release once a year**, typically in November, following the new major .NET release +* **2-4 minor releases** for each major version, released every ~3 months after the major release +* **Patch releases** as needed, typically every 2-4 weeks for the latest minor version + +This cadence of releases gives eager developers access to new features as soon as they are fully developed and tested, while maintaining the stability and reliability of the platform for production users. + +### Release Schedule + +| Version | Status | Released | Active Ends | LTS Ends | +| --- | --- | --- | --- | --- | +| ^10.0.0 | Active | 2025-11 | 2026-11 | 2027-11 | +| ^9.0.0 | LTS | 2024-11 | 2025-11 | 2026-11 | + + +See the [Release Notes](release-notes.md) for detailed information about each release. + +## Support Policy and Schedule (LTS) + +ABP Platform follows a **Long-Term Support (LTS)** policy to ensure your applications remain secure and stable over time. + +### Support Window + +Every major version has a **2-year lifecycle** with two distinct phases: + +| Support Stage | Duration | Details | +| --- | --- | --- | +| **Active** | ~1 year | The version is under active development. Regularly-scheduled updates and patches are released. New features and improvements are added in minor versions. | +| **Long-Term Support (LTS)** | ~1 year | Only critical fixes and security patches are released. No new features are added. | + +This means we actively develop a major version for about 1 year (until the next major .NET release), then provide LTS support for another year. + +### LTS Fixes + +As a general rule, a fix is considered for an LTS version if it resolves one of: + +* A newly identified security vulnerability +* A critical bug that significantly impacts production applications +* A regression caused by a 3rd party change, such as a new browser version or dependency update + +## Deprecation Policy + +When the ABP team intends to remove an API or feature, it will be marked as *deprecated*. This occurs when an API is obsolete, superseded by another API, or otherwise discontinued. Deprecated APIs remain available through their deprecated phase, which lasts a minimum of one major version (approximately one year). + +To help ensure that you have sufficient time and a clear path to update, this is our deprecation policy: + +| Deprecation Stage | Details | +| --- | --- | +| **Announcement** | We announce deprecated APIs and features in the [release notes](release-notes.md) and [migration guides](migration-guides/index.md). Deprecated APIs are typically marked with `[Obsolete]` attribute in the code, which enables IDEs to provide warnings if your project depends on them. We also announce a recommended update path. | +| **Deprecation period** | When an API or feature is deprecated, it is still present in at least the next major release. After that, deprecated APIs and features are candidates for removal. A deprecation can be announced in any release, but the removal of a deprecated API or feature happens only in major releases. | +| **NuGet/NPM dependencies** | We typically make dependency updates that require changes to your applications in major releases. In minor releases, we may update dependencies by expanding the supported versions, but we try not to require projects to update these dependencies until the next major version. | + +## Breaking Changes Policy + +Breaking changes require you to do work because the state after the change is not backward compatible with the state before it. Examples of breaking changes include the removal of public APIs, changes to method signatures, changing the timing of events, or updating to a new version of a dependency that includes breaking changes itself. + +### How We Handle Breaking Changes + +To support you in case of breaking changes: + +* We follow our [deprecation policy](#deprecation-policy) before we remove a public API +* We provide detailed [migration guides](migration-guides/index.md) when a version includes breaking changes + +### Update Path + +We recommend updating one major version at a time for a smoother upgrade experience. For example, to update from version 8.x to version 10.x: + +1. Update from version 8.x to version 9.x +2. Update from version 9.x to version 10.x + +See the [upgrading](upgrading.md) document for detailed instructions on how to upgrade your solutions. + +## Related Documents + +* [Release Notes](release-notes.md) - Detailed release notes for each version +* [Migration Guides](migration-guides/index.md) - Step-by-step guides for upgrading between versions +* [Road Map](road-map.md) - Upcoming features and planned releases +* [Upgrading](upgrading.md) - How to upgrade your ABP-based solutions +* [Preview Releases](previews.md) - Information about preview/RC releases +* [Nightly Builds](nightly-builds.md) - How to use nightly builds +* [Official Packages](https://abp.io/packages) - Browse all ABP packages diff --git a/docs/en/release-info/upgrading.md b/docs/en/release-info/upgrading.md index 88ce1249d8..974d7ef2d5 100644 --- a/docs/en/release-info/upgrading.md +++ b/docs/en/release-info/upgrading.md @@ -21,6 +21,8 @@ Run this command in the terminal while you are in the root folder of your soluti > If your solution has the Angular UI, you probably have `aspnet-core` and `angular` folders in the solution. Run this command in the parent folder of these two folders. +You can also specify a target version with `--version` parameter. See the [ABP CLI update command](../cli/index.md#update) for all available options. + ### Database Migrations > Warning: Be careful if you are migrating your database since you may have data loss in some cases. Carefully check the generated migration code before executing it. It is suggested to take a backup of your current database. From 18c78644901457fba9e3b1581909ed80040a8e2a Mon Sep 17 00:00:00 2001 From: berkansasmaz Date: Mon, 12 Jan 2026 15:02:12 +0300 Subject: [PATCH 2/2] docs: fix some typos --- docs/en/framework/ui/mvc-razor-pages/modals.md | 8 ++++---- docs/en/framework/ui/mvc-razor-pages/tag-helpers/index.md | 4 ++-- docs/en/framework/ui/mvc-razor-pages/theming.md | 2 +- docs/en/framework/ui/mvc-razor-pages/widgets.md | 2 +- docs/en/get-started/layered-web-application.md | 4 ++-- docs/en/get-started/microservice.md | 4 ++-- docs/en/get-started/pre-requirements.md | 6 +++--- docs/en/get-started/single-layer-web-application.md | 4 ++-- docs/en/testing/integration-tests.md | 6 +++--- docs/en/testing/overall.md | 2 +- docs/en/testing/unit-tests.md | 4 ++-- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/en/framework/ui/mvc-razor-pages/modals.md b/docs/en/framework/ui/mvc-razor-pages/modals.md index d37575cc26..6ad7ad421b 100644 --- a/docs/en/framework/ui/mvc-razor-pages/modals.md +++ b/docs/en/framework/ui/mvc-razor-pages/modals.md @@ -207,7 +207,7 @@ namespace MyProject.Web.Pages.Products public class ProductCreateModalModel : AbpPageModel { [BindProperty] - public PoductCreationDto Product { get; set; } + public ProductCreationDto Product { get; set; } public async Task OnGetAsync() { @@ -227,9 +227,9 @@ namespace MyProject.Web.Pages.Products * This is a simple `PageModal` class. The `[BindProperty]` make the form binding to the model when you post (submit) the form; The standard ASP.NET Core system. * `OnPostAsync` returns `NoContent` (this method is defined by the base `AbpPageModel` class). Because we don't need to a return value in the client side, after the form post operation. -**PoductCreationDto:** +**ProductCreationDto:** -`ProductCreateModalModel` uses a `PoductCreationDto` class defined as shown below: +`ProductCreateModalModel` uses a `ProductCreationDto` class defined as shown below: ````csharp using System; @@ -238,7 +238,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; namespace MyProject.Web.Pages.Products { - public class PoductCreationDto + public class ProductCreationDto { [Required] [StringLength(128)] diff --git a/docs/en/framework/ui/mvc-razor-pages/tag-helpers/index.md b/docs/en/framework/ui/mvc-razor-pages/tag-helpers/index.md index d986d65b43..e0be666b2c 100644 --- a/docs/en/framework/ui/mvc-razor-pages/tag-helpers/index.md +++ b/docs/en/framework/ui/mvc-razor-pages/tag-helpers/index.md @@ -7,7 +7,7 @@ # ABP Tag Helpers -ABP defines a set of **tag helper components** to simply the user interface development for ASP.NET Core (MVC / Razor Pages) applications. +ABP defines a set of **tag helper components** to simplify the user interface development for ASP.NET Core (MVC / Razor Pages) applications. ## Bootstrap Component Wrappers @@ -45,7 +45,7 @@ Here, the list of components those are wrapped by the ABP: ## Form Elements -**Abp Tag Helpers** add new features to standard **Asp.Net Core MVC input & select Tag Helpers** and wrap them with **Bootstrap** form controls. See [Form Elements documentation](form-elements.md) . +**Abp Tag Helpers** add new features to standard **ASP.NET Core MVC input & select Tag Helpers** and wrap them with **Bootstrap** form controls. See [Form Elements documentation](form-elements.md) . ## Dynamic Forms diff --git a/docs/en/framework/ui/mvc-razor-pages/theming.md b/docs/en/framework/ui/mvc-razor-pages/theming.md index ff73b3ad1b..138b52e3d2 100644 --- a/docs/en/framework/ui/mvc-razor-pages/theming.md +++ b/docs/en/framework/ui/mvc-razor-pages/theming.md @@ -437,7 +437,7 @@ In this way, applications or modules can have selectors based on the current lay ### RTL -To support Right-To-Left languages, the Layout should check the current culture and add `dir="rtl"` to the `html` tag and `rtl` CSS class the the `body` tag. +To support Right-To-Left languages, the Layout should check the current culture and add `dir="rtl"` to the `html` tag and `rtl` CSS class to the `body` tag. You can check `CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft` to understand if the current language is a RTL language. diff --git a/docs/en/framework/ui/mvc-razor-pages/widgets.md b/docs/en/framework/ui/mvc-razor-pages/widgets.md index ac9901733b..7e894027f6 100644 --- a/docs/en/framework/ui/mvc-razor-pages/widgets.md +++ b/docs/en/framework/ui/mvc-razor-pages/widgets.md @@ -42,7 +42,7 @@ namespace DashboardDemo.Web.Pages.Components.MySimpleWidget Inheriting from `AbpViewComponent` is not required. You could inherit from ASP.NET Core's standard `ViewComponent`. `AbpViewComponent` only defines some base useful properties. -You can inject a service and use in the `Invoke` method to get some data from the service. You may need to make Invoke method async, like `public async Task InvokeAsync()`. See [ASP.NET Core's ViewComponents](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components) document fore all different usages. +You can inject a service and use in the `Invoke` method to get some data from the service. You may need to make Invoke method async, like `public async Task InvokeAsync()`. See [ASP.NET Core's ViewComponents](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components) document for all different usages. **Default.cshtml**: diff --git a/docs/en/get-started/layered-web-application.md b/docs/en/get-started/layered-web-application.md index b2bd05454a..f4a383ff0b 100644 --- a/docs/en/get-started/layered-web-application.md +++ b/docs/en/get-started/layered-web-application.md @@ -142,11 +142,11 @@ In this step, you can choose which languages your application will support. * Click Add Custom Language if you want to add a language that is not listed. -You can change these settings later if needed. Thenk click the *Next* button for the *Additional Options* page: +You can change these settings later if needed. Then click the *Next* button for the *Additional Options* page: ![abp-studio-new-solution-dialog-additional-options](images/abp-studio-new-solution-dialog-additional-options_dark.png) -If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include or exclude the test projects from the solution. +If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, which includes the Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include or exclude the test projects from the solution. On the next screen, you can configure the modularity options for your solution: diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md index ee7e31bf85..56f275c258 100644 --- a/docs/en/get-started/microservice.md +++ b/docs/en/get-started/microservice.md @@ -118,7 +118,7 @@ Click the Next button to see *Additional Options* selection: ![abp-studio-new-solution-dialog-additional-options](images/abp-studio-new-solution-dialog-additional-options-microservice.png) -If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which include the Helm charts and other Kubernetes related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include the test projects in the solution. +If you unchecked the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files which includes the Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include the test projects in the solution. Click the Next button to see *Additional Services* screen: @@ -297,7 +297,7 @@ Clicking the *Connect* button will start a process that establishes the VPN conn ![abp-studio-microservice-kubernetes-services](images/abp-studio-microservice-kubernetes-services.png) -Now, you can access all the services inside the Kubernetes cluster, including the services those are not exposed out of the cluster. You can use the service name as DNS. For example, you can directly visit `http://cloudcrm-local-identity` in your Browser. You can also right-click to a service or application and select the Browse command to open it's UI in the built-in browser of ABP Studio: +Now, you can access all the services inside the Kubernetes cluster, including the services those are not exposed out of the cluster. You can use the service name as DNS. For example, you can directly visit `http://cloudcrm-local-identity` in your Browser. You can also right-click to a service or application and select the Browse command to open its UI in the built-in browser of ABP Studio: ![abp-studio-microservice-kubernetes-services-browse](images/abp-studio-microservice-kubernetes-services-browse.png) diff --git a/docs/en/get-started/pre-requirements.md b/docs/en/get-started/pre-requirements.md index 8aad4818ab..e17b9cd227 100644 --- a/docs/en/get-started/pre-requirements.md +++ b/docs/en/get-started/pre-requirements.md @@ -36,7 +36,7 @@ Visual Studio Code is a **free and cross-platform** lightweight code editor that ## .NET SDK -ABP is based on NET, so you need to install the .NET SDK. You can download the .NET SDK from the [.NET official website](https://dotnet.microsoft.com/en-us/download/dotnet/9.0). +ABP is based on .NET, so you need to install the .NET SDK. You can download the .NET SDK from the [.NET official website](https://dotnet.microsoft.com/en-us/download/dotnet/9.0). > Installing Visual Studio or JetBrains Rider may automatically install the .NET SDK. @@ -56,7 +56,7 @@ dotnet tool update --global dotnet-ef ## Node.js -ABP projects include some frontend resource packages, so you need to install Node.js/NPM manage these resource packages. You can download Node.js from the [official Node.js website](https://nodejs.org/). We recommend installing version v20.11+. +ABP projects include some frontend resource packages, so you need to install Node.js/NPM to manage these resource packages. You can download Node.js from the [official Node.js website](https://nodejs.org/). We recommend installing version v20.11+. ## Yarn (Required Only for Angular Projects) @@ -89,7 +89,7 @@ ABP startup solution templates and tools use some PowerShell scripts (`*.ps1`) t * [Install PowerShell on macOS](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos) * [Install PowerShell on Linux](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux) -## MicroService Solution +## Microservice Solution The following tools are only required to develop ABP's [microservice solution](../solution-templates/microservice/index.md) diff --git a/docs/en/get-started/single-layer-web-application.md b/docs/en/get-started/single-layer-web-application.md index 9ee87fd439..ef657722b0 100644 --- a/docs/en/get-started/single-layer-web-application.md +++ b/docs/en/get-started/single-layer-web-application.md @@ -66,7 +66,7 @@ Once your configuration is done, click the *Next* button to navigate to the *UI Here, you see all the possible UI options supported by that startup solution template. Pick the **{{ UI_Value }}**. -Notice that; Once you select a UI type, some additional options will be available under the UI Framework list. You can further configure the options or leave them as default and click the Next button for the *Database Provider* selection screen: +Notice that: Once you select a UI type, some additional options will be available under the UI Framework list. You can further configure the options or leave them as default and click the Next button for the *Database Provider* selection screen: {{ if DB == "EF" }} ![abp-studio-new-solution-dialog-database-provider](images/abp-studio-no-layers-new-solution-dialog-database-provider-efcore_dark.png) @@ -110,7 +110,7 @@ In this step, you can choose which languages your application will support. * Click Add Custom Language if you want to add a language that is not listed. -You can change these settings later if needed. Thenk click the *Next* button for the *Additional Options* page: +You can change these settings later if needed. Then click the *Next* button for the *Additional Options* page: ![abp-studio-no-layers-new-solution-additional-options](images/abp-studio-no-layers-new-solution-additional-options_dark.png) diff --git a/docs/en/testing/integration-tests.md b/docs/en/testing/integration-tests.md index c87d270747..d28ed5ca5b 100644 --- a/docs/en/testing/integration-tests.md +++ b/docs/en/testing/integration-tests.md @@ -34,13 +34,13 @@ The startup template is configured to use **in-memory SQLite** database for the Using in-memory SQLite database has two main advantages; * It is faster compared to an external DBMS. -* It create a **new fresh database** for each test case, so tests doesn't affect each other. +* It creates a **new fresh database** for each test case, so tests don't affect each other. > **Tip**: Do not use EF Core's In-Memory database for advanced integration tests. It is not a real DBMS and has many differences in details. For example, it doesn't support transaction and rollback scenarios, so you can't truly test the failing scenarios. On the other hand, In-Memory SQLite is a real DBMS and supports the fundamental SQL database features. ## The Seed Data -Writing tests against an empty database is not practical. In most cases, you need to some initial data in the database. For example, if you write a test class that query, update and delete the products, it would be helpful to have a few products in the database before executing the test case. +Writing tests against an empty database is not practical. In most cases, you need some initial data in the database. For example, if you write a test class that queries, updates and deletes the products, it would be helpful to have a few products in the database before executing the test case. ABP's [Data Seeding](../framework/infrastructure/data-seeding.md) system is a powerful way to seed the initial data. The application startup template has a *YourProject*TestDataSeedContributor class in the `.TestBase` project. You can fill it to have an initial data that you can use for each test method. @@ -401,7 +401,7 @@ public class EfCoreIssueAppService_Tests : IssueAppService_Tests By deriving from the related abstract classes, now we can see the all tests in the test explorers and run them. +> By deriving from the related abstract classes, now we can see all the tests in the test explorers and run them. ![unitest-efcore-mongodb](../images/unitest-efcore-mongodb.png) diff --git a/docs/en/testing/overall.md b/docs/en/testing/overall.md index 154c169d5b..15e9abf725 100644 --- a/docs/en/testing/overall.md +++ b/docs/en/testing/overall.md @@ -69,7 +69,7 @@ The startup solution has the following libraries already installed; * [NSubstitute](https://nsubstitute.github.io/) as the mocking library. * [Shouldly](https://github.com/shouldly/shouldly) as the assertion library. -While you are free to replace them with your favorite tools, this document and examples will be base on these tooling. +While you are free to replace them with your favorite tools, this document and examples will be based on these tooling. ## The Test Explorer diff --git a/docs/en/testing/unit-tests.md b/docs/en/testing/unit-tests.md index cfc63a4848..2e06a44efb 100644 --- a/docs/en/testing/unit-tests.md +++ b/docs/en/testing/unit-tests.md @@ -73,7 +73,7 @@ namespace MyProject.Issues Notice that the `IsClosed` and `CloseDate` properties have private setters to force some business rules by using the `Open()` and `Close()` methods: -* Whenever you close an issue, the `CloseDate` should be set to the [current time](../framework/infrastructure/virtual-file-system.md). +* Whenever you close an issue, the `CloseDate` should be set to the current time. * An issue can not be re-opened if it is locked. And if it is re-opened, the `CloseDate` should be set to `null`. Since the `Issue` entity is a part of the Domain Layer, we should test it in the `Domain.Tests` project. Create an `Issue_Tests` class inside the `Domain.Tests` project: @@ -160,7 +160,7 @@ public void Should_Not_Allow_To_ReOpen_A_Locked_Issue() `Assert.Throws` checks if the executed code throws a matching exception. -> See the [xUnit](https://xunit.net/#documentation) & [Shoudly](https://docs.shouldly.org/) documentation to learn more about these libraries. +> See the [xUnit](https://xunit.net/#documentation) & [Shouldly](https://docs.shouldly.org/) documentation to learn more about these libraries. ## Classes With Dependencies