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); | |||
|  |     } | |||
|  | } |