| File: AssignLinkMetadata.cs | Web Access |
| Project: src\msbuild\src\Tasks\Microsoft.Build.Tasks.csproj (Microsoft.Build.Tasks.Core) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; #nullable disable namespace Microsoft.Build.Tasks { /// <summary> /// Task to assign a reasonable "Link" metadata to the provided items. /// </summary> [MSBuildMultiThreadableTask] public class AssignLinkMetadata : TaskExtension { /// <summary> /// The set of items to assign metadata to /// </summary> public ITaskItem[] Items { get; set; } /// <summary> /// The set of items to which the Link metadata has been set /// </summary> [Output] public ITaskItem[] OutputItems { get; set; } /// <summary> /// Sets "Link" metadata on any item where the project file in which they /// were defined is different from the parent project file to a sane default: /// the relative directory compared to the defining file. /// /// Does NOT overwrite Link metadata if it's already defined. /// </summary> public override bool Execute() { var outputItems = new List<ITaskItem>(); if (Items != null) { foreach (ITaskItem item in Items) { try { string definingProject = item.GetMetadata(ItemSpecModifiers.DefiningProjectFullPath); string definingProjectDirectory = item.GetMetadata(ItemSpecModifiers.DefiningProjectDirectory); string fullPath = item.GetMetadata(ItemSpecModifiers.FullPath); if ( String.IsNullOrEmpty(item.GetMetadata("Link")) && !String.IsNullOrEmpty(definingProject) && fullPath.StartsWith(definingProjectDirectory, StringComparison.OrdinalIgnoreCase)) { string link = fullPath.Substring(definingProjectDirectory.Length); ITaskItem outputItem = new TaskItem(item); outputItem.SetMetadata("Link", link); outputItems.Add(outputItem); } } catch (InvalidOperationException e) { // can happen if the item is not a proper path Log.LogWarningFromException(e); } } } OutputItems = outputItems.ToArray(); return !Log.HasLoggedErrors; } } }