78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Immutable;
 | |
| using System.Xml;
 | |
| 
 | |
| namespace UnrealSharpBuildTool.Actions;
 | |
| 
 | |
| public class UpdateProjectDependencies : BuildToolAction
 | |
| {
 | |
|     private string _projectPath = string.Empty;
 | |
|     private string _projectFolder = string.Empty;
 | |
|     private ImmutableList<string> _dependencies = ImmutableList<string>.Empty;
 | |
|     private HashSet<string> _existingDependencies = new HashSet<string>();
 | |
| 
 | |
|     public override bool RunAction()
 | |
|     {
 | |
|         _projectPath = Program.TryGetArgument("ProjectPath");
 | |
|         _projectFolder = Directory.GetParent(_projectPath)!.FullName;
 | |
|         _dependencies = Program.GetArguments("Dependency").ToImmutableList();
 | |
| 
 | |
|         Console.WriteLine($"Project Path: {_projectPath}");
 | |
|         Console.WriteLine($"Project Folder: {_projectFolder}");
 | |
| 
 | |
|         UpdateProject();
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     private void UpdateProject()
 | |
|     {
 | |
|         try
 | |
|         {
 | |
|             XmlDocument csprojDocument = new XmlDocument();
 | |
|             csprojDocument.Load(_projectPath);
 | |
| 
 | |
|             XmlNodeList itemGroups = csprojDocument.SelectNodes("//ItemGroup")!;
 | |
| 
 | |
|             _existingDependencies = itemGroups
 | |
|                     .OfType<XmlElement>()
 | |
|                     .Where(x => x.Name == "ItemGroup")
 | |
|                     .SelectMany(x => x.ChildNodes.OfType<XmlElement>())
 | |
|                     .Where(x => x.Name == "ProjectReference")
 | |
|                     .Select(x => x.GetAttribute("Include"))
 | |
|                     .ToHashSet();
 | |
| 
 | |
|             XmlElement? newItemGroup = itemGroups.OfType<XmlElement>().FirstOrDefault();
 | |
|             
 | |
|             if (newItemGroup is null)
 | |
|             {
 | |
|                 newItemGroup = csprojDocument.CreateElement("ItemGroup");
 | |
|                 csprojDocument.DocumentElement!.AppendChild(newItemGroup);
 | |
|             }
 | |
| 
 | |
|             foreach (string dependency in _dependencies)
 | |
|             {
 | |
|                 AddDependency(csprojDocument, newItemGroup, dependency);
 | |
|             }
 | |
| 
 | |
|             csprojDocument.Save(_projectPath);
 | |
|         }
 | |
|         catch (Exception ex)
 | |
|         {
 | |
|             throw new InvalidOperationException($"An error occurred while updating the .csproj file: {ex.Message}", ex);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     private void AddDependency(XmlDocument doc, XmlElement itemGroup, string dependency)
 | |
|     {
 | |
|         string relativePath = GenerateProject.GetRelativePath(_projectFolder, dependency);
 | |
|         
 | |
|         if (_existingDependencies.Contains(relativePath))
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         XmlElement generatedCode = doc.CreateElement("ProjectReference");
 | |
|         generatedCode.SetAttribute("Include", relativePath);
 | |
|         itemGroup.AppendChild(generatedCode);
 | |
|     }
 | |
| }
 |