File: GetNonExecutableReferences.cs
Web Access
Project: src\src\Aspire.Hosting.Tasks\Aspire.Hosting.Tasks.csproj (Aspire.Hosting.Tasks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Xml.Linq;
using Microsoft.Build.Framework;
 
namespace Aspire.Hosting.Tasks;
 
/// <summary>
/// Gets the references in 'AppProjectTargetFramework' that aren't executable projects.
/// </summary>
public sealed class GetNonExecutableReferences : Microsoft.Build.Utilities.Task
{
    /// <summary>
    /// The project target frameworks to check.
    /// </summary>
    [Required]
    public ITaskItem[] AppProjectTargetFramework { get; set; } = [];
 
    /// <summary>
    /// The output containing non-executable references.
    /// </summary>
    [Output]
    public ITaskItem[] NonExecutableReferences { get; set; } = [];
 
    public override bool Execute()
    {
        var nonExecutableReferences = new HashSet<ITaskItem>();
 
        try
        {
            foreach (var appProject in AppProjectTargetFramework)
            {
                var additionalProperties = appProject.GetMetadata("AdditionalPropertiesFromProject");
                if (string.IsNullOrEmpty(additionalProperties))
                {
                    // Skip any projects that don't contain the right metadata
                    Log.LogMessage(MessageImportance.Low, $"Skipping project '{appProject.ItemSpec}' because it does not contain AdditionalPropertiesFromProject metadata.");
                    continue;
                }
 
                var additionalPropertiesXml = XElement.Parse(additionalProperties);
                foreach (var targetFrameworkElement in additionalPropertiesXml.Elements())
                {
                    var isExe = targetFrameworkElement.Element("_IsExecutable");
                    if (isExe is null || !string.Equals(isExe.Value, "true", StringComparison.OrdinalIgnoreCase))
                    {
                        nonExecutableReferences.Add(appProject);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Log.LogWarning($"Failed to validate Aspire host project resources: {ex.Message}. To disable this validation, set the MSBuild property 'SkipValidateAspireHostProjectResources' to 'true'.");
        }
 
        NonExecutableReferences = [.. nonExecutableReferences];
        return true;
    }
}