Allow opt out of import embedded schema file (#11296)
* Introduce an opt-out options from the import of embedded schema files. * Moved the initialization of the static service provider into CoreRuntime as this runs before the IStartupFilters, and otherwise the static service provider is not available in hosted services. E.g. for migrations * fix build * Minor code tidy and naming alignment. * Update src/Umbraco.Web.UI/Umbraco.Web.UI.csproj * Removed default installation of starter kit. Co-authored-by: Andy Butland <abutland73@gmail.com>
This commit is contained in:
@@ -47,6 +47,7 @@ namespace JsonSchema
|
||||
public RichTextEditorSettings RichTextEditor { get; set; }
|
||||
public RuntimeMinificationSettings RuntimeMinification { get; set; }
|
||||
public BasicAuthSettings BasicAuth { get; set; }
|
||||
public PackageMigrationSettings PackageMigration { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
// Copyright (c) Umbraco.
|
||||
// See LICENSE for more details.
|
||||
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Umbraco.Cms.Core.Configuration.Models
|
||||
{
|
||||
/// <summary>
|
||||
/// Typed configuration options for package migration settings.
|
||||
/// </summary>
|
||||
[UmbracoOptions(Constants.Configuration.ConfigPackageMigration)]
|
||||
public class PackageMigrationSettings
|
||||
{
|
||||
private const bool StaticRunSchemaAndContentMigrations = true;
|
||||
private const bool StaticAllowComponentOverrideOfRunSchemaAndContentMigrations = true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether package migration steps that install schema and content should run.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// By default this is true and schema and content defined in a package migration are installed.
|
||||
/// Using configuration, administrators can optionally switch this off in certain environments.
|
||||
/// Deployment tools such as Umbraco Deploy can also configure this option to run or not run these migration
|
||||
/// steps as is appropriate for normal use of the tool.
|
||||
/// </remarks>
|
||||
[DefaultValue(StaticRunSchemaAndContentMigrations)]
|
||||
public bool RunSchemaAndContentMigrations { get; set; } = StaticRunSchemaAndContentMigrations;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether components can override the configured value for <see cref="RunSchemaAndContentMigrations"/>.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// By default this is true and components can override the configured setting for <see cref="RunSchemaAndContentMigrations"/>.
|
||||
/// If an administrator wants explicit control over which environments migration steps installing schema and content can run,
|
||||
/// they can set this to false. Components should respect this and not override the configuration.
|
||||
/// </remarks>
|
||||
[DefaultValue(StaticAllowComponentOverrideOfRunSchemaAndContentMigrations)]
|
||||
public bool AllowComponentOverrideOfRunSchemaAndContentMigrations { get; set; } = StaticAllowComponentOverrideOfRunSchemaAndContentMigrations;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,19 @@
|
||||
using System.ComponentModel;
|
||||
// Copyright (c) Umbraco.
|
||||
// See LICENSE for more details.
|
||||
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Umbraco.Cms.Core.Configuration.Models
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Typed configuration options for unattended settings.
|
||||
/// </summary>
|
||||
[UmbracoOptions(Constants.Configuration.ConfigUnattended)]
|
||||
public class UnattendedSettings
|
||||
{
|
||||
internal const bool StaticInstallUnattended = false;
|
||||
internal const bool StaticUpgradeUnattended = false;
|
||||
private const bool StaticInstallUnattended = false;
|
||||
private const bool StaticUpgradeUnattended = false;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether unattended installs are enabled.
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
public const string ConfigWebRouting = ConfigPrefix + "WebRouting";
|
||||
public const string ConfigUserPassword = ConfigPrefix + "Security:UserPassword";
|
||||
public const string ConfigRichTextEditor = ConfigPrefix + "RichTextEditor";
|
||||
public const string ConfigPackageMigration = ConfigPrefix + "PackageMigration";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,22 +4,22 @@ using System.ComponentModel;
|
||||
namespace Umbraco.Cms.Web.Common.DependencyInjection
|
||||
{
|
||||
/// <summary>
|
||||
/// INTERNAL Service locator. Should only be used if no other ways exist.
|
||||
/// Service locator for internal (umbraco cms) only purposes. Should only be used if no other ways exist.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// It is created with only two goals in mind
|
||||
/// 1) Continue to have the same extension methods on IPublishedContent and IPublishedElement as in V8. To make migration easier.
|
||||
/// 2) To have a tool to avoid breaking changes in minor versions. All methods using this should in theory be obsolete.
|
||||
/// 2) To have a tool to avoid breaking changes in minor and patch versions. All methods using this should in theory be obsolete.
|
||||
///
|
||||
/// Keep in mind, every time this is used, the code becomes basically untestable.
|
||||
/// </remarks>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
internal static class StaticServiceProvider
|
||||
public static class StaticServiceProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// The service locator.
|
||||
/// </summary>
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
internal static IServiceProvider Instance { get; set; }
|
||||
public static IServiceProvider Instance { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -72,7 +72,8 @@ namespace Umbraco.Cms.Core.DependencyInjection
|
||||
.AddUmbracoOptions<UnattendedSettings>()
|
||||
.AddUmbracoOptions<RichTextEditorSettings>()
|
||||
.AddUmbracoOptions<BasicAuthSettings>()
|
||||
.AddUmbracoOptions<RuntimeMinificationSettings>();
|
||||
.AddUmbracoOptions<RuntimeMinificationSettings>()
|
||||
.AddUmbracoOptions<PackageMigrationSettings>();
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ using Umbraco.Cms.Core.Services;
|
||||
using Umbraco.Cms.Core.Sync;
|
||||
using Umbraco.Cms.Core.Templates;
|
||||
using Umbraco.Cms.Core.Web;
|
||||
using Umbraco.Cms.Web.Common.DependencyInjection;
|
||||
using Umbraco.Extensions;
|
||||
|
||||
namespace Umbraco.Cms.Core.DependencyInjection
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
using System;
|
||||
using System.Xml.Linq;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Cms.Core.IO;
|
||||
using Umbraco.Cms.Core.PropertyEditors;
|
||||
using Umbraco.Cms.Core.Serialization;
|
||||
using Umbraco.Cms.Core.Services;
|
||||
using Umbraco.Cms.Core.Strings;
|
||||
using Umbraco.Cms.Infrastructure.Migrations;
|
||||
@@ -20,7 +21,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
MediaUrlGeneratorCollection mediaUrlGenerators,
|
||||
IShortStringHelper shortStringHelper,
|
||||
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
|
||||
IMigrationContext context)
|
||||
IMigrationContext context,
|
||||
IOptions<PackageMigrationSettings> options)
|
||||
: base(new ImportPackageBuilderExpression(
|
||||
packagingService,
|
||||
mediaService,
|
||||
@@ -28,7 +30,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
mediaUrlGenerators,
|
||||
shortStringHelper,
|
||||
contentTypeBaseServiceProvider,
|
||||
context))
|
||||
context,
|
||||
options))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,9 @@ using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.XPath;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Umbraco.Cms.Core;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Cms.Core.IO;
|
||||
using Umbraco.Cms.Core.Models;
|
||||
using Umbraco.Cms.Core.Packaging;
|
||||
@@ -25,7 +27,9 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
private readonly MediaUrlGeneratorCollection _mediaUrlGenerators;
|
||||
private readonly IPackagingService _packagingService;
|
||||
private readonly IShortStringHelper _shortStringHelper;
|
||||
private bool _executed;
|
||||
private readonly PackageMigrationSettings _packageMigrationSettings;
|
||||
|
||||
private bool _executed;
|
||||
|
||||
public ImportPackageBuilderExpression(
|
||||
IPackagingService packagingService,
|
||||
@@ -34,7 +38,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
MediaUrlGeneratorCollection mediaUrlGenerators,
|
||||
IShortStringHelper shortStringHelper,
|
||||
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
|
||||
IMigrationContext context) : base(context)
|
||||
IMigrationContext context,
|
||||
IOptions<PackageMigrationSettings> packageMigrationSettings) : base(context)
|
||||
{
|
||||
_packagingService = packagingService;
|
||||
_mediaService = mediaService;
|
||||
@@ -42,6 +47,7 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
_mediaUrlGenerators = mediaUrlGenerators;
|
||||
_shortStringHelper = shortStringHelper;
|
||||
_contentTypeBaseServiceProvider = contentTypeBaseServiceProvider;
|
||||
_packageMigrationSettings = packageMigrationSettings.Value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -59,6 +65,7 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
}
|
||||
|
||||
_executed = true;
|
||||
|
||||
Context.BuildingExpression = false;
|
||||
|
||||
if (EmbeddedResourceMigrationType == null && PackageDataManifest == null)
|
||||
@@ -67,6 +74,12 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
$"Nothing to execute, neither {nameof(EmbeddedResourceMigrationType)} or {nameof(PackageDataManifest)} has been set.");
|
||||
}
|
||||
|
||||
if (!_packageMigrationSettings.RunSchemaAndContentMigrations)
|
||||
{
|
||||
Logger.LogInformation("Skipping import of embedded schema file, due to configuration");
|
||||
return;
|
||||
}
|
||||
|
||||
InstallationSummary installationSummary;
|
||||
if (EmbeddedResourceMigrationType != null)
|
||||
{
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Cms.Core.IO;
|
||||
using Umbraco.Cms.Core.PropertyEditors;
|
||||
using Umbraco.Cms.Core.Services;
|
||||
using Umbraco.Cms.Core.Strings;
|
||||
using Umbraco.Cms.Infrastructure.Migrations;
|
||||
using Umbraco.Cms.Web.Common.DependencyInjection;
|
||||
|
||||
namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
{
|
||||
|
||||
public abstract class PackageMigrationBase : MigrationBase
|
||||
{
|
||||
private readonly IPackagingService _packagingService;
|
||||
@@ -15,6 +20,7 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
private readonly MediaUrlGeneratorCollection _mediaUrlGenerators;
|
||||
private readonly IShortStringHelper _shortStringHelper;
|
||||
private readonly IContentTypeBaseServiceProvider _contentTypeBaseServiceProvider;
|
||||
private readonly IOptions<PackageMigrationSettings> _packageMigrationsSettings;
|
||||
|
||||
public PackageMigrationBase(
|
||||
IPackagingService packagingService,
|
||||
@@ -23,7 +29,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
MediaUrlGeneratorCollection mediaUrlGenerators,
|
||||
IShortStringHelper shortStringHelper,
|
||||
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
|
||||
IMigrationContext context)
|
||||
IMigrationContext context,
|
||||
IOptions<PackageMigrationSettings> packageMigrationsSettings)
|
||||
: base(context)
|
||||
{
|
||||
_packagingService = packagingService;
|
||||
@@ -32,6 +39,29 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
_mediaUrlGenerators = mediaUrlGenerators;
|
||||
_shortStringHelper = shortStringHelper;
|
||||
_contentTypeBaseServiceProvider = contentTypeBaseServiceProvider;
|
||||
_packageMigrationsSettings = packageMigrationsSettings;
|
||||
}
|
||||
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
[Obsolete("Use ctor with all params")]
|
||||
public PackageMigrationBase(
|
||||
IPackagingService packagingService,
|
||||
IMediaService mediaService,
|
||||
MediaFileManager mediaFileManager,
|
||||
MediaUrlGeneratorCollection mediaUrlGenerators,
|
||||
IShortStringHelper shortStringHelper,
|
||||
IContentTypeBaseServiceProvider contentTypeBaseServiceProvider,
|
||||
IMigrationContext context)
|
||||
: this(
|
||||
packagingService,
|
||||
mediaService,
|
||||
mediaFileManager,
|
||||
mediaUrlGenerators,
|
||||
shortStringHelper,
|
||||
contentTypeBaseServiceProvider,
|
||||
context,
|
||||
StaticServiceProvider.Instance.GetRequiredService<IOptions<PackageMigrationSettings>>())
|
||||
{
|
||||
}
|
||||
|
||||
public IImportPackageBuilder ImportPackage => BeginBuild(
|
||||
@@ -42,7 +72,8 @@ namespace Umbraco.Cms.Infrastructure.Packaging
|
||||
_mediaUrlGenerators,
|
||||
_shortStringHelper,
|
||||
_contentTypeBaseServiceProvider,
|
||||
Context));
|
||||
Context,
|
||||
_packageMigrationsSettings));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Umbraco.Cms.Core;
|
||||
using Umbraco.Cms.Core.Composing;
|
||||
using Umbraco.Cms.Core.Configuration;
|
||||
using Umbraco.Cms.Core.Events;
|
||||
using Umbraco.Cms.Core.Exceptions;
|
||||
@@ -13,7 +13,9 @@ using Umbraco.Cms.Core.Notifications;
|
||||
using Umbraco.Cms.Core.Runtime;
|
||||
using Umbraco.Cms.Core.Services;
|
||||
using Umbraco.Cms.Infrastructure.Persistence;
|
||||
using Umbraco.Cms.Web.Common.DependencyInjection;
|
||||
using Umbraco.Extensions;
|
||||
using ComponentCollection = Umbraco.Cms.Core.Composing.ComponentCollection;
|
||||
|
||||
namespace Umbraco.Cms.Infrastructure.Runtime
|
||||
{
|
||||
@@ -29,6 +31,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime
|
||||
private readonly IEventAggregator _eventAggregator;
|
||||
private readonly IHostingEnvironment _hostingEnvironment;
|
||||
private readonly IUmbracoVersion _umbracoVersion;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private CancellationToken _cancellationToken;
|
||||
|
||||
/// <summary>
|
||||
@@ -44,7 +47,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime
|
||||
IUmbracoDatabaseFactory databaseFactory,
|
||||
IEventAggregator eventAggregator,
|
||||
IHostingEnvironment hostingEnvironment,
|
||||
IUmbracoVersion umbracoVersion)
|
||||
IUmbracoVersion umbracoVersion,
|
||||
IServiceProvider serviceProvider)
|
||||
{
|
||||
State = state;
|
||||
_loggerFactory = loggerFactory;
|
||||
@@ -56,9 +60,40 @@ namespace Umbraco.Cms.Infrastructure.Runtime
|
||||
_eventAggregator = eventAggregator;
|
||||
_hostingEnvironment = hostingEnvironment;
|
||||
_umbracoVersion = umbracoVersion;
|
||||
_serviceProvider = serviceProvider;
|
||||
_logger = _loggerFactory.CreateLogger<CoreRuntime>();
|
||||
}
|
||||
|
||||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||
[Obsolete]
|
||||
public CoreRuntime(
|
||||
ILoggerFactory loggerFactory,
|
||||
IRuntimeState state,
|
||||
ComponentCollection components,
|
||||
IApplicationShutdownRegistry applicationShutdownRegistry,
|
||||
IProfilingLogger profilingLogger,
|
||||
IMainDom mainDom,
|
||||
IUmbracoDatabaseFactory databaseFactory,
|
||||
IEventAggregator eventAggregator,
|
||||
IHostingEnvironment hostingEnvironment,
|
||||
IUmbracoVersion umbracoVersion
|
||||
):this(
|
||||
loggerFactory,
|
||||
state,
|
||||
components,
|
||||
applicationShutdownRegistry,
|
||||
profilingLogger,
|
||||
mainDom,
|
||||
databaseFactory,
|
||||
eventAggregator,
|
||||
hostingEnvironment,
|
||||
umbracoVersion,
|
||||
null
|
||||
)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the state of the Umbraco runtime.
|
||||
/// </summary>
|
||||
@@ -76,6 +111,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime
|
||||
{
|
||||
_cancellationToken = cancellationToken;
|
||||
StaticApplicationLogging.Initialize(_loggerFactory);
|
||||
StaticServiceProvider.Instance = _serviceProvider;
|
||||
|
||||
AppDomain.CurrentDomain.UnhandledException += (_, args) =>
|
||||
{
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
|
||||
namespace Umbraco.Cms.Web.Common.DependencyInjection
|
||||
{
|
||||
/// <summary>
|
||||
/// A <see cref="IStartupFilter"/> registered to automatically capture application services
|
||||
/// </summary>
|
||||
internal class UmbracoApplicationServicesCapture : IStartupFilter
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next) =>
|
||||
app =>
|
||||
{
|
||||
StaticServiceProvider.Instance = app.ApplicationServices;
|
||||
next(app);
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -123,10 +123,6 @@ namespace Umbraco.Extensions
|
||||
config,
|
||||
profiler);
|
||||
|
||||
// adds the umbraco startup filter which will call UseUmbraco early on before
|
||||
// other start filters are applied (depending on the ordering of IStartupFilters in DI).
|
||||
services.AddTransient<IStartupFilter, UmbracoApplicationServicesCapture>();
|
||||
|
||||
return new UmbracoBuilder(services, config, typeLoader, loggerFactory, profiler, appCaches, tempHostingEnvironment);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,5 +48,4 @@
|
||||
<_Parameter1>Umbraco.Tests.UnitTests</_Parameter1>
|
||||
</AssemblyAttribute>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
Reference in New Issue
Block a user