2
0

AddArchiveReferences.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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 NuGet.Versioning;
  9. using RepoTasks.Utilities;
  10. namespace RepoTasks
  11. {
  12. public class AddArchiveReferences : Task
  13. {
  14. [Required]
  15. public string ReferencePackagePath { get; set; }
  16. [Required]
  17. public string MetaPackageVersion { get; set; }
  18. [Required]
  19. public ITaskItem[] BuildArtifacts { get; set; }
  20. [Required]
  21. public ITaskItem[] PackageArtifacts { get; set; }
  22. [Required]
  23. public ITaskItem[] ExternalDependencies { get; set; }
  24. public override bool Execute()
  25. {
  26. // Parse input
  27. var externalArchiveArtifacts = ExternalDependencies.Where(p => p.GetMetadata("LZMA") == "true");
  28. var externalArchiveTools = ExternalDependencies.Where(p => p.GetMetadata("LZMATools") == "true");
  29. var archiveArtifacts = PackageArtifacts.Where(p => p.GetMetadata("LZMA") == "true");
  30. var archiveTools = PackageArtifacts.Where(p => p.GetMetadata("LZMATools") == "true");
  31. var buildArtifacts = BuildArtifacts.Select(ArtifactInfo.Parse)
  32. .OfType<ArtifactInfo.Package>()
  33. .Where(p => !p.IsSymbolsArtifact);
  34. var xmlDoc = new XmlDocument();
  35. xmlDoc.Load(ReferencePackagePath);
  36. // Project
  37. var projectElement = xmlDoc.FirstChild;
  38. // Items
  39. var itemGroupElement = xmlDoc.CreateElement("ItemGroup");
  40. Log.LogMessage(MessageImportance.High, $"Archive will include the following packages");
  41. foreach (var package in archiveArtifacts)
  42. {
  43. var packageName = package.ItemSpec;
  44. var packageVersion = string.Equals(packageName, "Microsoft.AspNetCore.All", StringComparison.OrdinalIgnoreCase) ?
  45. MetaPackageVersion :
  46. buildArtifacts
  47. .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase))
  48. .PackageInfo.Version.ToString();
  49. Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
  50. var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
  51. packageReferenceElement.SetAttribute("Include", packageName);
  52. packageReferenceElement.SetAttribute("Version", packageVersion);
  53. itemGroupElement.AppendChild(packageReferenceElement);
  54. }
  55. foreach (var package in externalArchiveArtifacts)
  56. {
  57. var packageName = package.ItemSpec;
  58. var packageVersion = package.GetMetadata("Version");
  59. Log.LogMessage(MessageImportance.High, $" - Package: {packageName} Version: {packageVersion}");
  60. var packageReferenceElement = xmlDoc.CreateElement("PackageReference");
  61. packageReferenceElement.SetAttribute("Include", packageName);
  62. packageReferenceElement.SetAttribute("Version", packageVersion);
  63. itemGroupElement.AppendChild(packageReferenceElement);
  64. }
  65. foreach (var package in archiveTools)
  66. {
  67. var packageName = package.ItemSpec;
  68. var packageVersion = buildArtifacts
  69. .Single(p => string.Equals(p.PackageInfo.Id, packageName, StringComparison.OrdinalIgnoreCase))
  70. .PackageInfo.Version.ToString();
  71. Log.LogMessage(MessageImportance.High, $" - Tool: {packageName} Version: {packageVersion}");
  72. var packageReferenceElement = xmlDoc.CreateElement("DotNetCliToolReference");
  73. packageReferenceElement.SetAttribute("Include", packageName);
  74. packageReferenceElement.SetAttribute("Version", packageVersion);
  75. itemGroupElement.AppendChild(packageReferenceElement);
  76. }
  77. foreach (var package in externalArchiveTools)
  78. {
  79. var packageName = package.ItemSpec;
  80. var packageVersion = package.GetMetadata("Version");
  81. Log.LogMessage(MessageImportance.High, $" - Tool: {packageName} Version: {packageVersion}");
  82. var packageReferenceElement = xmlDoc.CreateElement("DotNetCliToolReference");
  83. packageReferenceElement.SetAttribute("Include", packageName);
  84. packageReferenceElement.SetAttribute("Version", packageVersion);
  85. itemGroupElement.AppendChild(packageReferenceElement);
  86. }
  87. projectElement.AppendChild(itemGroupElement);
  88. // Save updated file
  89. xmlDoc.AppendChild(projectElement);
  90. xmlDoc.Save(ReferencePackagePath);
  91. return true;
  92. }
  93. }
  94. }