/// <summary> /// Runs this builder /// </summary> /// <param name="context"> </param> /// <returns>Returns a set of generated files, in target relative paths</returns> public override ISet <TargetRelativePath> Run(IBuildContext context) { // Collecting all the files already existing in 'targetdir/modulename' directories var targetDirs = new HashSet <string>(slnBuilder.Projects.Select(GetTargetDir)); var existingFiles = new Dictionary <TargetRelativePath, DateTime>(); var expectedOutputs = new HashSet <TargetRelativePath>(slnBuilder.Projects.SelectMany(GetExpectedProjectOutputs).Union(GetDependencyResults(context))); foreach (var targetDir in targetDirs) { var moduleTargetDir = targetRoot.GetChildDirectory(targetDir); if (moduleTargetDir != null) { foreach (var fileName in moduleTargetDir.Files) { existingFiles.Add(new TargetRelativePath(targetDir, fileName), moduleTargetDir.GetLastModifiedDate(fileName)); } } } msbuild.Run(targetRoot, slnPath); // Collecting all the files in 'targetdir/modulename' directories as results var outputs = new HashSet <TargetRelativePath>(); foreach (var targetDir in targetDirs) { var moduleTargetDir = targetRoot.GetChildDirectory(targetDir); if (moduleTargetDir != null) { moduleTargetDir.InvalidateCacheFileData(); foreach (var fileName in moduleTargetDir.Files) { var relativePath = new TargetRelativePath(targetDir, fileName); var lastModified = moduleTargetDir.GetLastModifiedDate(fileName); bool isNew = false; if (expectedOutputs.Contains(relativePath)) { isNew = true; } else { DateTime previousLastModified; if (existingFiles.TryGetValue(relativePath, out previousLastModified)) { if (lastModified != previousLastModified) { isNew = true; } } else { isNew = true; } } if (isNew) { outputs.Add(relativePath); } } } } foreach (var targetDir in targetDirs) { outputs.ExceptWith(context.GetAllResultsIn(new TargetRelativePath(targetDir, String.Empty))); } return(outputs); }