|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text.Json;
using Aspire.Hosting.ApplicationModel;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace Aspire.Hosting.Publishing;
internal class ManifestPublisher(ILogger<ManifestPublisher> logger,
IOptions<PublishingOptions> options,
IHostApplicationLifetime lifetime,
DistributedApplicationExecutionContext executionContext) : IDistributedApplicationPublisher
{
private readonly ILogger<ManifestPublisher> _logger = logger;
private readonly IOptions<PublishingOptions> _options = options;
private readonly IHostApplicationLifetime _lifetime = lifetime;
private readonly DistributedApplicationExecutionContext _executionContext = executionContext;
public Utf8JsonWriter? JsonWriter { get; set; }
public async Task PublishAsync(DistributedApplicationModel model, CancellationToken cancellationToken)
{
await PublishInternalAsync(model, cancellationToken).ConfigureAwait(false);
_lifetime.StopApplication();
}
protected virtual async Task PublishInternalAsync(DistributedApplicationModel model, CancellationToken cancellationToken)
{
if (_options.Value.OutputPath == null)
{
throw new DistributedApplicationException(
"The '--output-path [path]' option was not specified even though '--publisher manifest' argument was used."
);
}
using var stream = new FileStream(_options.Value.OutputPath, FileMode.Create);
using var jsonWriter = JsonWriter ?? new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true });
await WriteManifestAsync(model, jsonWriter, cancellationToken).ConfigureAwait(false);
var fullyQualifiedPath = Path.GetFullPath(_options.Value.OutputPath);
_logger.LogInformation("Published manifest to: {ManifestPath}", fullyQualifiedPath);
}
protected async Task WriteManifestAsync(DistributedApplicationModel model, Utf8JsonWriter jsonWriter, CancellationToken cancellationToken)
{
var manifestPath = _options.Value.OutputPath ?? throw new DistributedApplicationException("The '--output-path [path]' option was not specified even though '--publisher manifest' argument was used.");
var context = new ManifestPublishingContext(_executionContext, manifestPath, jsonWriter, cancellationToken);
await context.WriteModel(model, cancellationToken).ConfigureAwait(false);
}
}
|