| File: BuildMetadataGenerator.cs | Web Access |
| Project: src\src\Generators\Microsoft.Gen.BuildMetadata\Microsoft.Gen.BuildMetadata.csproj (Microsoft.Gen.BuildMetadata) |
// 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; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.Text; namespace Microsoft.Gen.BuildMetadata; /// <summary> /// Source generator that creates build metadata extensions from MSBuild properties. /// Supports both Azure DevOps and GitHub Actions build environments. /// </summary> [Generator] public sealed class BuildMetadataGenerator : IIncrementalGenerator { /// <inheritdoc/> public void Initialize(IncrementalGeneratorInitializationContext context) { var buildPropertiesPipeline = context.AnalyzerConfigOptionsProvider.Select((provider, ct) => { return CreateBuildMetadata(provider.GlobalOptions); }); context.RegisterSourceOutput(buildPropertiesPipeline, Execute); } private static BuildMetadata CreateBuildMetadata(AnalyzerConfigOptions globalOptions) { // Azure DevOps properties var azureBuildId = globalOptions.GetProperty("BuildMetadataAzureBuildId"); var azureBuildNumber = globalOptions.GetProperty("BuildMetadataAzureBuildNumber"); var azureSourceBranchName = globalOptions.GetProperty("BuildMetadataAzureSourceBranchName"); var azureSourceVersion = globalOptions.GetProperty("BuildMetadataAzureSourceVersion"); var isAzureDevOps = globalOptions.GetBooleanProperty("BuildMetadataIsAzureDevOps"); // GitHub Actions properties var gitHubRunId = globalOptions.GetProperty("BuildMetadataGitHubRunId"); var gitHubRunNumber = globalOptions.GetProperty("BuildMetadataGitHubRunNumber"); var gitHubRefName = globalOptions.GetProperty("BuildMetadataGitHubRefName"); var gitHubSha = globalOptions.GetProperty("BuildMetadataGitHubSha"); return new BuildMetadata( isAzureDevOps ? azureBuildId : gitHubRunId, isAzureDevOps ? azureBuildNumber : gitHubRunNumber, isAzureDevOps ? azureSourceBranchName : gitHubRefName, isAzureDevOps ? azureSourceVersion : gitHubSha); } private static void Execute(SourceProductionContext context, BuildMetadata buildMetadata) { var emitter = new Emitter(buildMetadata); var result = emitter.Emit(); context.AddSource("BuildMetadataExtensions.g.cs", SourceText.From(result, Encoding.UTF8)); } }