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