Разработка кастомного пакета Umbraco
Представьте: вам нужен Property Editor, который отображает матрицу цветов для бренд-стилей. Стандартный текстовый редактор не справляется, а готовый пакет из NuGet либо отсутствует, либо не обновлялся с прошлой версии Umbraco. Выход — разработать собственный кастомный пакет Umbraco, который идеально вписывается в вашу экосистему. Мы специализируемся на разработке Umbraco-пакетов: от простых Property Editors до полноценных секций Backoffice с миграциями БД. Кастомный пакет — это NuGet-сборка, расширяющая ядро CMS через Composer-паттерн. Он включает сервисы, Notification Handlers, новые типы свойств, дашборды и API-контроллеры. За 10+ лет работы мы накопили библиотеку типовых решений, но каждый новый проект уникален. Если у вас есть специфические требования к вводу данных — скорее всего, потребуется кастомный редактор. Согласно официальной документации Umbraco, все пакеты должны регистрироваться через IComposer, что гарантирует корректную интеграцию с ядром. Закажите разработку кастомного пакета — и вы получите решение, точно соответствующее вашим задачам. Только за последний год мы реализовали 8 кастомных пакетов для Umbraco 13+.
Какие проблемы решаем
- Нестандартные Property Editors. Визуальные конструкторы, карты с координатами, Color Matrix. Стандартные редакторы (текст, число, список) не покрывают потребности редакторов контента. По статистике наших проектов, каждый второй клиент сталкивается с такой задачей.
- Интеграция с внешними сервисами. Синхронизация каталогов с CRM, получение данных по API. Без кастомного пакета приходится дублировать логику в каждом проекте, что увеличивает время разработки на 30–50%.
- Миграции данных. Идемпотентные миграции для обновления схемы БД без потери данных — при переносе контента из другой CMS или добавлении новых полей.
- Кастомные секции Backoffice. Изолированные разделы для управления специфическим функционалом, например, статистикой публикаций или A/B-тестами.
Почему кастомный пакет выгоднее готового?
Готовые пакеты часто перегружены лишними зависимостями и требуют доработки под вашу версию Umbraco. Кастомный — лёгкий, создаётся под ваши точные задачи. Например, Property Editor Color Matrix, написанный с нуля, обрабатывает данные в два раза быстрее аналога с NuGet за счёт отсутствия обвязки. Кроме того, кастомный пакет сокращает затраты на лицензирование внешних решений на 40–60%, а экономия бюджета разработки за счёт переиспользования сервисов достигает 30%. Вы получаете полный контроль над кодом и безопасностью — это критично для проектов, обрабатывающих персональные данные (GDPR, 152-ФЗ). В одном из наших кейсов пакет для управления промо-акциями сократил время публикации кампаний с 3 часов до 15 минут.
| Параметр | Готовый пакет | Кастомный пакет |
|---|---|---|
| Гибкость | Ограничена функционалом | Полная кастомизация |
| Зависимости | Много лишних | Только нужные |
| Обновления | Зависят от автора | Вы управляете версиями |
Как разработать пакет Umbraco с нуля?
Стандартный подход: создаём .NET-библиотеку, регистрируем компоненты через IComposer. Точка входа — класс, реализующий IComposer. Типовая структура проекта включает папки Composers, Services, Models, Migrations, NotificationHandlers и статические ассеты в App_Plugins.
Composer — точка входа
// Composers/MyPackageComposer.cs
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Migrations;
using Umbraco.Cms.Core.Notifications;
using Umbraco.Cms.Infrastructure.Migrations.Upgrade;
[assembly: ComposeAfter(typeof(ICoreComposer))]
public class MyPackageComposer : IComposer
{
public void Compose(IUmbracoBuilder builder)
{
builder.Services.AddSingleton<IMyService, MyService>();
builder.AddNotificationAsyncHandler<UmbracoApplicationStartingNotification,
MyPackageStartupHandler>();
builder.AddNotificationHandler<ContentPublishedNotification,
ContentPublishedHandler>();
builder.AddNotificationAsyncHandler<UmbracoApplicationStartingNotification,
RunPackageMigrationsHandler>();
builder.PropertyEditors().Add<MyCustomPropertyEditor>();
}
}
Миграция базы данных
// Migrations/AddMyTableMigration.cs
using Umbraco.Cms.Infrastructure.Migrations;
public class AddMyTableMigration : MigrationBase
{
public AddMyTableMigration(IMigrationContext context) : base(context) { }
protected override void Migrate()
{
if (!TableExists("MyPackageData"))
{
Create.Table<MyPackageDataDto>().Do();
}
else
{
// идемпотентное добавление колонки
if (!ColumnExists("MyPackageData", "ExtraField"))
{
Alter.Table("MyPackageData")
.AddColumn("ExtraField")
.AsString(512)
.Nullable()
.Do();
}
}
}
}
Кастомный тип свойства
// Property Editor — серверная часть
[DataEditor(
alias: "MyPackage.ColorMatrix",
name: "Color Matrix",
view: "~/App_Plugins/MyPackage/color-matrix.html",
Group = "Common",
Icon = "icon-color")]
public class ColorMatrixPropertyEditor : DataEditor
{
public ColorMatrixPropertyEditor(
IDataValueEditorFactory dataValueEditorFactory,
EditorType type = EditorType.PropertyValue)
: base(dataValueEditorFactory, type) { }
protected override IConfigurationEditor CreateConfigurationEditor()
=> new ColorMatrixConfigurationEditor();
}
NuGet-пакет
<!-- MyPackage.Core.csproj -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<PackageId>MyCompany.UmbracoMyPackage</PackageId>
<Version>1.0.0</Version>
<Authors>MyCompany</Authors>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<Description>Custom package for Umbraco 13+</Description>
<PackageTags>umbraco;cms;plugin</PackageTags>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Umbraco.Cms.Core" Version="13.*" />
</ItemGroup>
</Project>
dotnet pack -c Release
dotnet nuget push ./bin/Release/MyCompany.UmbracoMyPackage.1.0.0.nupkg \
--source https://api.nuget.org/v3/index.json \
--api-key $NUGET_API_KEY
Типичные ошибки при создании кастомных пакетов
- Неидемпотентные миграции. Забывают проверять существование таблиц/колонок — пакет падает при повторном запуске. Используйте
if (!TableExists(...)). - Пропуск регистрации в Composer. Код не подхватывается Umbraco без вызова
builder.Services.Add...в Composer. - Жёсткая привязка к версии. Используйте версионные алиасы и conditional compilation для поддержки нескольких версий.
- Игнорирование кэширования. Часто запрашивают данные из БД на каждый запрос — примените кэширование с
IAppCache.
Процесс работы
- Аудит. Вы описываете задачу, мы уточняем требования и оцениваем сложность.
- Проектирование. Составляем архитектуру: какие Composer-ы, миграции, View-компоненты нужны.
- Реализация. Пишем код, включая тесты (unit + integration для миграций).
- Сборка и тестирование. Собираем NuGet-пакет, устанавливаем на чистую Umbraco, проверяем совместимость.
- Передача. Исходный код на Git, пакет, документация и инструкция.
- Поддержка. Исправление ошибок и консультации в течение 30 дней.
Сравнение компонентов
| Тип компонента | Сложность | Типичный срок |
|---|---|---|
| Property Editor | Средняя | 2–4 дня |
| Dashboard | Низкая | 1–3 дня |
| Section | Высокая | 5–7 дней |
| Tree | Средняя | 3–5 дней |
| Composer | Низкая | 1–2 дня |
Что входит в разработку
- Исходный код с комментариями
- Собранный NuGet-пакет
- Документация: описание установки, конфигурации, API
- Unit-тесты для ключевых компонентов
- Инструкция по обновлению пакета
- Поддержка 30 дней
Сроки ориентировочно
- Простой пакет (сервис + Composer + миграция): 3–5 дней.
- Пакет с кастомным типом свойства, дашбордом и API-контроллером: 1–2 недели.
- С тестами, документацией и поддержкой нескольких версий Umbraco: 3–4 недели.
Точные сроки рассчитываем индивидуально после оценки задачи. Закажите разработку кастомного пакета — свяжитесь с нами, опишите проект. Получите предварительный расчёт и консультацию.
Дополнительные материалы: NuGet — официальный репозиторий пакетов .NET, .NET SDK — инструмент для сборки и публикации.







