AddRSReferences.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright (c) .NET Foundation. All rights reserved.
  2. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  3. using System;
  4. using System.Linq;
  5. using System.Xml;
  6. using Microsoft.Build.Framework;
  7. using Microsoft.Build.Utilities;
  8. using RepoTasks.Utilities;
  9. namespace RepoTasks
  10. {
  11. public class AddRSReferences : Task
  12. {
  13. [Required]
  14. public string ReferencePackagePath { get; set; }
  15. [Required]
  16. public ITaskItem[] BuildArtifacts { get; set; }
  17. [Required]
  18. public ITaskItem[] PackageArtifacts { get; set; }
  19. [Required]
  20. public ITaskItem[] ExternalDependencies { get; set; }
  21. public override bool Execute()
  22. {
  23. // Parse input
  24. var runtimeStoreArtifacts = PackageArtifacts.Where(p => p.GetMetadata("RuntimeStore") == "true");
  25. var externalArtifacts = ExternalDependencies.Where(p => p.GetMetadata("RuntimeStore") == "true");
  26. var buildArtifacts = BuildArtifacts.Select(ArtifactInfo.Parse)
  27. .OfType<ArtifactInfo.Package>()
  28. .Where(p => !p.IsSymbolsArtifact);
  29. var xmlDoc = new XmlDocument();
  30. xmlDoc.Load(ReferencePackagePath);
  31. // Project
  32. var projectElement = xmlDoc.FirstChild;
  33. // Items
  34. var itemGroupElement = xmlDoc.CreateElement("ItemGroup");
  35. Log.LogMessage(MessageImportance.High, $"Runtime store will include the following packages");
  36. foreach (var package in runtimeStoreArtifacts)
  37. {
  38. var packageName = package.ItemSpec;
  39. var packageVersion = buildArtifacts
  40. .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase))
  41. .PackageInfo.Version.ToString();
  42. Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
  43. var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
  44. packageReferenceElement.SetAttribute("Include", packageName);
  45. packageReferenceElement.SetAttribute("Version", packageVersion);
  46. packageReferenceElement.SetAttribute("PrivateAssets", "None");
  47. itemGroupElement.AppendChild(packageReferenceElement);
  48. }
  49. foreach (var package in externalArtifacts)
  50. {
  51. var packageName = package.ItemSpec;
  52. var packageVersion = package.GetMetadata("Version");
  53. Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
  54. var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
  55. packageReferenceElement.SetAttribute("Include", packageName);
  56. packageReferenceElement.SetAttribute("Version", packageVersion);
  57. packageReferenceElement.SetAttribute("PrivateAssets", "None");
  58. itemGroupElement.AppendChild(packageReferenceElement);
  59. }
  60. projectElement.AppendChild(itemGroupElement);
  61. // Save updated file
  62. xmlDoc.AppendChild(projectElement);
  63. xmlDoc.Save(ReferencePackagePath);
  64. return true;
  65. }
  66. }
  67. }