private void ProcessNugetFiles(View filesView, string srcFilesRoot, string currentCondition) { currentCondition = Pivots.NormalizeExpression(currentCondition ?? ""); foreach (var containerName in filesView.GetChildPropertyNames()) { View container = filesView.GetProperty(containerName); if (containerName == "condition" || containerName == "*") { foreach (var condition in container.GetChildPropertyNames()) { ProcessNugetFiles(container.GetElement(condition), srcFilesRoot, condition); } continue; } // GS01 Workaround for bug in Values not caching the output set when a collection is added to ? var filemasks = container.Values.Distinct().ToArray(); var relativePaths = new Dictionary <string, string>(); foreach (var mask in filemasks) { if (string.IsNullOrEmpty(mask)) { continue; } var fileset = mask.FindFilesSmarterComplex(srcFilesRoot).GetMinimalPathsToDictionary(); if (!fileset.Any()) { Event <Warning> .Raise("ProcessNugetFiles", "WARNING: file selection '{0}' failed to find any files ", mask); continue; } foreach (var key in fileset.Keys) { relativePaths.Add(key, fileset[key]); } } var optionPackages = container.GetMetadataValuesHarder("output.package", currentCondition).Union(container.GetMetadataValuesHarder("output.packages", currentCondition)).ToArray(); if (optionPackages.Length == 0) { optionPackages = new [] { "default" }; } var optionExcludes = container.GetMetadataValues("exclude", container, false).Union(container.GetMetadataValues("excludes", container, false)).ToArray(); // var targets = package.GetTargetsProject(optionFramework); // determine the destination location in the target package var optionDestination = container.GetMetadataValueHarder("destination", currentCondition); var destinationFolder = string.IsNullOrEmpty(optionDestination) ? (filesView.GetSingleMacroValue("d_" + containerName) ?? "\\") : optionDestination; var optionFlatten = container.GetMetadataValueHarder("flatten", currentCondition).IsPositive(); var addEachFiles = container.GetMetadataValuesHarder("add-each-file", currentCondition).ToArray(); var addFolders = container.GetMetadataValuesHarder("add-folder", currentCondition).ToArray(); if (addFolders.Length > 0) { foreach (var addFolder in addFolders) { var folderView = filesView.GetProperty(addFolder.Replace("${condition}", currentCondition)); if (folderView != null) { var values = folderView.Values.ToList(); values.Add((filesView.GetSingleMacroValue("pkg_root") + destinationFolder).Replace("\\\\", "\\")); folderView.Values = values; } } } foreach (var optionPackage in optionPackages) { if (!_nugetPackages.Keys.Contains(optionPackage)) { FailAlways(Event <SourceError> .Raise("AP300", SourceLocation.Unknowns, "Unknown #output-package '{0}' in files section '{1}' ", optionPackage, containerName)); } var package = _nugetPackages[optionPackage]; foreach (var src in relativePaths.Keys) { if (optionExcludes.HasWildcardMatch(src)) { continue; } Event <Verbose> .Raise("ProcessNugetFiles (adding file)", "'{0}' + '{1}'", destinationFolder, relativePaths[src]); string target = Path.Combine(destinationFolder, optionFlatten ? Path.GetFileName(relativePaths[src]) : relativePaths[src]).Replace("${condition}", currentCondition).Replace("\\\\", "\\"); package.AddFile(src, target); if (addEachFiles.Length > 0) { foreach (var addEachFile in addEachFiles) { var fileListView = filesView.GetProperty(addEachFile.Replace("${condition}", currentCondition)); if (fileListView != null) { var values = fileListView.Values.ToList(); values.Add((filesView.GetSingleMacroValue("pkg_root") + target).Replace("${condition}", currentCondition).Replace("\\\\", "\\")); fileListView.Values = values; } } } } } } }
private void ProcessNugetFiles(View filesView, string srcFilesRoot, string currentCondition) { currentCondition = Pivots.NormalizeExpression(currentCondition ?? ""); foreach (var containerName in filesView.GetChildPropertyNames().ToArray()) { View container = filesView.GetProperty(containerName); if (containerName == "condition" || containerName == "*") { foreach (var condition in container.GetChildPropertyNames()) { ProcessNugetFiles(container.GetElement(condition), srcFilesRoot, condition); } continue; } // GS01 Workaround for bug in Values not caching the output set when a collection is added to ? var filemasks = container.Values.Distinct().ToArray(); var relativePaths = new Dictionary <string, string>(); var optionExcludes = container.GetMetadataValues("exclude", container, false).Union(container.GetMetadataValues("excludes", container, false)).ToArray(); foreach (var mask in filemasks) { if (string.IsNullOrEmpty(mask)) { continue; } var fileset = mask.FindFilesSmarterComplex(srcFilesRoot, optionExcludes).GetMinimalPathsToDictionary(); if (!fileset.Any()) { Event <Warning> .Raise("ProcessNugetFiles", "WARNING: file selection '{0}' failed to find any files ", mask); continue; } foreach (var key in fileset.Keys) { relativePaths.Add(key, fileset[key]); } } var optionRenames = container.GetMetadataValues("rename", container, false).Union(container.GetMetadataValues("renames", container, false)).Select(each => { var s = each.Split('/', '\\'); if (s.Length == 2) { return(new { search = new Regex(s[0]), replace = s[1] }); } return(null); }).Where(each => each != null).ToArray(); // determine the destination location in the target package var optionDestination = container.GetMetadataValueHarder("destination", currentCondition); var destinationFolder = string.IsNullOrEmpty(optionDestination) ? (filesView.GetSingleMacroValue("d_" + containerName) ?? "\\") : optionDestination; var optionFlatten = container.GetMetadataValueHarder("flatten", currentCondition).IsPositive(); var optionNoOverlay = container.GetMetadataValueHarder("overlay", currentCondition).IsNegative(); var addEachFiles = container.GetMetadataValuesHarder("add-each-file", currentCondition).ToArray(); var addFolders = container.GetMetadataValuesHarder("add-folder", currentCondition).ToArray(); var addAllFiles = container.GetMetadataValuesHarder("add-all-files", currentCondition).ToArray(); // add the folder to an Collection somewhere else in the PropertySheet if (addFolders.Length > 0 && relativePaths.Any()) { foreach (var addFolder in addFolders) { var folderView = filesView.GetProperty(addFolder, lastMinuteReplacementFunction: s => s.Replace("${condition}", currentCondition)); if (folderView != null) { folderView.AddValue((filesView.GetSingleMacroValue("pkg_root") + destinationFolder).FixSlashes()); } } } // add the folder+/** to an Collection somewhere else in the PropertySheet (useful for making <ItemGroup>s) if (addAllFiles.Length > 0 && relativePaths.Any()) { foreach (var addAllFile in addAllFiles) { var folderView = filesView.GetProperty(addAllFile, lastMinuteReplacementFunction: s => s.Replace("${condition}", currentCondition)); if (folderView != null) { // add the /** suffix on the path // so it can be used in an ItemGroup folderView.AddValue(((filesView.GetSingleMacroValue("pkg_root") + destinationFolder) + "/**").FixSlashes()); } } } foreach (var srcf in relativePaths.Keys) { var src = srcf; if (optionExcludes.HasWildcardMatch(src)) { continue; } Event <Verbose> .Raise("ProcessNugetFiles (adding file)", "'{0}' + '{1}'", destinationFolder, relativePaths[src]); string target = Path.Combine(destinationFolder, optionFlatten ? Path.GetFileName(relativePaths[src]) : relativePaths[src]).Replace("${condition}", currentCondition).FixSlashes(); if (optionRenames.Length > 0) { // process rename commands var dir = Path.GetDirectoryName(target); var filename = Path.GetFileName(target); foreach (var rename in optionRenames) { var newFilename = rename.search.Replace(filename, rename.replace); if (newFilename != filename) { // generate the new location for the renamed file var tmpFile = Path.Combine(FilesystemExtensions.TempPath, "renamedFiles", Guid.NewGuid().ToString(), newFilename); // derp. gotta create the target dir first. *sigh* Directory.CreateDirectory(Path.GetDirectoryName(tmpFile)); //copy the src file to the tmpFile location File.Copy(src, tmpFile); // remove it when we're done packaging _tempFiles.Add(tmpFile); // switch the src to use the temp file src = tmpFile; // and just use the dir as the target (instead of the whole path) target = dir; break; } } } // add the file under the configuration (unless it's marked for no overlay, in which case just put it in the base.) NugetPackage.AddFile(src, target, optionNoOverlay ? string.Empty : currentCondition); if (addEachFiles.Length > 0) { foreach (var addEachFile in addEachFiles) { var fileListView = filesView.GetProperty(addEachFile, lastMinuteReplacementFunction: s => s.Replace("${condition}", currentCondition)); if (fileListView != null) { fileListView.AddValue((filesView.GetSingleMacroValue("pkg_root") + target).Replace("${condition}", currentCondition).FixSlashes()); } } } } } }