Пропуск папок с решениями в сценарии автоматизации TT - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть фрагмент текстового шаблона, который генерирует класс Solution со свойством Assemblies для вывода списка всех сборок проектов в решении Visual Studio для помощи в настройке контейнера IoC ( GitHub , NuGet ).Это терпит неудачу, когда проекты помещены в папки решения все же.Как сделать папки решений прозрачными для этого скрипта?Проблемный код:

<#+

    class SolutionAssemblyNames : IEnumerable<string>
    {
        public SolutionAssemblyNames(ITextTemplatingEngineHost host)
        {
            Host = host;
        }

        public IEnumerator<string> GetEnumerator() => Assemblies.GetEnumerator();
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
        IEnumerable<string> Assemblies => Projects
            .Select(p => p?.Properties?.Item("AssemblyName")?.Value as string)
            .Distinct().Where(a => !string.IsNullOrWhiteSpace(a));

        IEnumerable<Project> Projects => VisualStudio.Solution.Projects.OfType<Project>();
        DTE VisualStudio => (Host as IServiceProvider).GetService(typeof(DTE)) as DTE;
        ITextTemplatingEngineHost Host { get; }
    }
#>

1 Ответ

0 голосов
/ 25 сентября 2018

DTE не возвращает плоский список проектов, поэтому вам нужно предварительно проверять папки решений, а затем рекурсивно читать его подпроекты (поскольку вы можете иметь папки решений внутри папок решений и т. Д.)

    IEnumerable<string> Assemblies => Projects
        .SelectMany(GetProjectAndSubProjects) // ################# Flatten the list of projects
        .Select(p => p?.Properties?.Item("AssemblyName")?.Value as string)
        .Distinct()
        .Where(a => !string.IsNullOrWhiteSpace(a));

    IEnumerable<Project> Projects => VisualStudio.Solution.Projects.OfType<Project>();

    private static IEnumerable<EnvDTE.Project> GetProjectAndSubProjects(EnvDTE.Project project)
    {
        if (project.Kind == VsProjectKindSolutionFolder)
        {
            return project.ProjectItems
                .OfType<EnvDTE.ProjectItem>()
                .Select(p => p.SubProject)
                .Where(p => p != null)
                .SelectMany(GetProjectAndSubProjects);
        }

        return new[] { project };
    }

    // Copied from EnvDTE80.ProjectKinds.vsProjectKindSolutionFolder
    private const string VsProjectKindSolutionFolder = "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}";
...