in src/WebJobs.Script/ScriptHostBuilderExtensions.cs [74:170]
public static IHostBuilder AddScriptHost(this IHostBuilder builder,
ScriptApplicationHostOptions applicationOptions,
Action<IWebJobsBuilder> configureWebJobs = null,
IMetricsLogger metricsLogger = null)
=> builder.AddScriptHost(applicationOptions, null, metricsLogger, configureWebJobs);
public static IHostBuilder AddScriptHost(this IHostBuilder builder,
ScriptApplicationHostOptions applicationOptions,
ILoggerFactory loggerFactory,
IMetricsLogger metricsLogger,
Action<IWebJobsBuilder> configureWebJobs = null)
{
loggerFactory = loggerFactory ?? NullLoggerFactory.Instance;
builder.SetAzureFunctionsConfigurationRoot();
// Host configuration
builder.ConfigureLogging((context, loggingBuilder) =>
{
loggingBuilder.AddDefaultWebJobsFilters();
string loggingPath = ConfigurationPath.Combine(ConfigurationSectionNames.JobHost, "Logging");
loggingBuilder.AddConfiguration(context.Configuration.GetSection(loggingPath));
loggingBuilder.Services.AddSingleton<IFileWriterFactory, DefaultFileWriterFactory>();
loggingBuilder.Services.AddSingleton<ILoggerProvider, HostFileLoggerProvider>();
loggingBuilder.Services.AddSingleton<ILoggerProvider, FunctionFileLoggerProvider>();
loggingBuilder.AddConsoleIfEnabled(context);
loggingBuilder.ConfigureTelemetry(context);
})
.ConfigureAppConfiguration((context, configBuilder) =>
{
if (!context.Properties.ContainsKey(ScriptConstants.SkipHostJsonConfigurationKey))
{
configBuilder.Add(new HostJsonFileConfigurationSource(applicationOptions, SystemEnvironment.Instance, loggerFactory, metricsLogger));
}
// Adding hosting config into job host configuration
configBuilder.Add(new FunctionsHostingConfigSource(SystemEnvironment.Instance));
var hostingEnvironmentConfigFilePath = SystemEnvironment.Instance.GetFunctionsHostingEnvironmentConfigFilePath();
if (!string.IsNullOrEmpty(hostingEnvironmentConfigFilePath))
{
configBuilder.AddJsonFile(hostingEnvironmentConfigFilePath, optional: true, reloadOnChange: false);
}
IConfiguration scriptHostConfiguration = applicationOptions.RootServiceProvider.GetService<IConfiguration>();
if (scriptHostConfiguration != null)
{
configBuilder.AddConfiguration(scriptHostConfiguration.GetSection(ScriptConstants.FunctionsHostingConfigSectionName));
}
});
// WebJobs configuration
builder.AddScriptHostCore(applicationOptions, configureWebJobs, loggerFactory);
// Allow FunctionsStartup to add configuration after all other configuration is registered.
builder.ConfigureAppConfiguration((context, configBuilder) =>
{
// Pre-build configuration here to load bundles and to store for later validation.
var config = configBuilder.Build();
var extensionBundleOptions = GetExtensionBundleOptions(config);
FunctionsHostingConfigOptions configOption = new FunctionsHostingConfigOptions();
var optionsSetup = new FunctionsHostingConfigOptionsSetup(config);
optionsSetup.Configure(configOption);
var extensionRequirementOptions = applicationOptions.RootServiceProvider.GetService<IOptions<ExtensionRequirementOptions>>();
var bundleManager = new ExtensionBundleManager(extensionBundleOptions, SystemEnvironment.Instance, loggerFactory, configOption);
var metadataServiceManager = applicationOptions.RootServiceProvider.GetService<IFunctionMetadataManager>();
var locator = new ScriptStartupTypeLocator(applicationOptions.ScriptPath, loggerFactory.CreateLogger<ScriptStartupTypeLocator>(), bundleManager, metadataServiceManager, metricsLogger, extensionRequirementOptions);
// The locator (and thus the bundle manager) need to be created now in order to configure app configuration.
// Store them so they do not need to be re-created later when configuring services.
context.Properties[BundleManagerKey] = bundleManager;
context.Properties[StartupTypeLocatorKey] = locator;
// If we're skipping host initialization, this key will not exist and this will also be skipped.
if (context.Properties.TryGetValue(DelayedConfigurationActionKey, out object actionObject) &&
actionObject is Action<IWebJobsStartupTypeLocator> delayedConfigAction)
{
context.Properties.Remove(DelayedConfigurationActionKey);
delayedConfigAction(locator);
// store the snapshot for validation later, but only if there
// are any registered external configuration startups.
if (locator.HasExternalConfigurationStartups())
{
context.Properties[ConfigurationSnapshotKey] = config;
}
}
});
return builder;
}