Перечислять файлы в .csproj (ядро dotnet) - PullRequest
0 голосов
/ 30 октября 2018

Я работаю над инструментом сборки в C #, который должен работать с Visual Studio / MSBuild. Я хочу перечислить все файлы, которые являются частью проекта C #. Формат проекта - новый (.NET Core) .csproj.

Документация, описывающая Система проектов , указывает на использование MSBuild (формат файла) или Common Project System (дерево проекта). Я не знаком с обоими API. Просмотр документации по соответствующим проектам не сразу полезен.

Как эксперт, вероятно, знает, новый файл .csproj не перечисляет все файлы, которые неявно являются частью проекта. С другой стороны, в нем может быть указан «связанный» файл, который находится вне папки проекта. Я хочу убедиться, что я получаю все файлы, которые считаются частью проекта.

В конечном итоге я хочу сосредоточиться на конкретном типе файла (.json), но я подумал, что общий вопрос стоит задать.

Подводя итог: Как я могу написать библиотеку C #, которая использует соответствующие пакеты для (надеюсь, легко) перечислить все файлы в csproj?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Buildalyzer - самый простой в использовании пакет, предназначенный для .NETStandard 2.0, что делает его кроссплатформенным. (Omnisharp в настоящее время не предлагает пакет NuGet для работы с рабочей областью. И Microsoft.CodeAnalysis создает проблему для получения правильных ссылок на месте и ограничен net46.)

using Buildalyzer;

private static IList<string> InlcudedProjectKeys = new[] { "None", "Compile", "Content", "EmbeddedResource" };

private static IEnumerable<string> EnumerateProjectFiles(string projectPath)
{
    AnalyzerManager manager = new AnalyzerManager();
    ProjectAnalyzer analyzer = manager.GetProject(projectPath);
    AnalyzerResults results = analyzer.Build();
    AnalyzerResult result = results.Single();

    // If only interested in C# files, check out:
    //string[] sourceFiles = result.SourceFiles;

    IReadOnlyDictionary<string, ProjectItem[]> items = result.Items;
    foreach (var item in items)
    {
        // Skip keys like ProjectReference that aren't for files
        if (!InlcudedProjectKeys.Contains(item.Key))
            continue;
        ProjectItem[] projectItems = item.Value;
        foreach (var projectItem in projectItems)
        {
            // The item spec for files will be the path relative to the project directory
            yield return projectItem.ItemSpec;
        }
    }
}

А для получения бонусных баллов нужно получить только *.json файлов:

var jsonFiles = EnumerateProjectFiles(projectPath)
    .Where(path => path.EndsWith(".json"))
    .ToArray();

Спасибо Hitesh за ссылки на соответствующие ресурсы.

0 голосов
/ 30 октября 2018

Вы можете использовать библиотеки Roslyn Analyzer для загрузки csproject и доступа к его содержимому, а также свойствам в программе. вы можете следовать инструкциям этого предыдущего поста SO или использовать OpenProjectAsync (projectFilePath) для загрузки экземпляра класса Project в пространстве имен Microsoft.CodeAnalysis.

using Microsoft.CodeAnalysis.MSBuild;

AnalyzerManager manager = new AnalyzerManager();
ProjectAnalyzer analyzer = manager.GetProject(@"C:\MyCode\MyProject.csproj");

Вы можете найти больше информации о Roslyn на Github .

...