/// <summary> /// Processes single build dependency defined in template /// </summary> /// <param name="solutionInfo">Information about current solution</param> /// <param name="buildDependency">Build dependency definition</param> /// <param name="solutionBuild">Visual Studio build wrapper for current solution</param> private void ProcessBuildDependency(SolutionInfo solutionInfo, BuildDependency buildDependency, SolutionBuild solutionBuild) { ThreadHelper.ThrowIfNotOnUIThread(); Package.Output($" Processing build dependency {buildDependency}..."); //get applicable projects (the projects the dependency is to be se on) var applicableProjects = GetBuildDependencyApplicableProjects(solutionInfo, buildDependency); if (applicableProjects.Count > 0) { var applicableProjectsStr = string.Join(", ", applicableProjects.Select(p => { ThreadHelper.ThrowIfNotOnUIThread(); return(p.Name); })); Package.Output($" Applicable projects: {applicableProjectsStr}"); //find required project (the project that the applicable project depends on) var dependsOn = buildDependency.DependsOnProjectName.Trim(); var dependsOnProject = solutionInfo.ExistingProjects.FirstOrDefault(p => { ThreadHelper.ThrowIfNotOnUIThread(); return(p.Name == dependsOn); }); if (dependsOnProject != null) { SetBuildDependency(solutionBuild, applicableProjects, dependsOnProject); } else { Package.Output($" Required project (depends on) not found"); } } else { Package.Output($" No applicable projects found"); } Package.Output($" Processed build dependency {buildDependency}"); }
/// <summary> /// Gets the lists of projects the <paramref name="buildDependency"/> should be applied to /// </summary> /// <param name="solutionInfo">Information about current solution</param> /// <param name="buildDependency">Build dependency definition</param> /// <returns></returns> private static List <Project> GetBuildDependencyApplicableProjects(SolutionInfo solutionInfo, BuildDependency buildDependency) { // * means all projects // *-project1,project2 means all projects but the ones defines in list split by "," // other strings represent the project names split by "," var projectsRaw = buildDependency.ProjectName.Trim(); var allProjects = projectsRaw == "*" || projectsRaw.StartsWith("*-"); if (projectsRaw == "*") { projectsRaw = ""; } if (projectsRaw.StartsWith("*-")) { projectsRaw = projectsRaw.Substring(2); } var projects = projectsRaw.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); var applicableProjects = new List <Project>(); foreach (var project in solutionInfo.ExistingProjects.Where(p => { ThreadHelper.ThrowIfNotOnUIThread(); return(!SolutionInfo.IsProjectSolutionItems(p) && p.Name != "Miscellaneous Files" && p.Kind != Constants.vsProjectItemsKindMisc); })) { var isInList = projects.Any(p => { ThreadHelper.ThrowIfNotOnUIThread(); return(p == project.Name); }); if (allProjects && !isInList || !allProjects && isInList) { applicableProjects.Add(project); } } return(applicableProjects); }