枚举.csproj(dotnet核心)中的文件

时间:2018-10-30 18:46:25

标签: c# msbuild .net-core csproj common-project-system

我正在使用C#构建工具,该工具应与Visual Studio / MSBuild一起使用。 我想枚举C#项目中的所有文件。项目格式是新的(.NET Core).csproj。

描述Project System的文档指向使用MSBuild(文件格式)或Common Project System(项目树)的信息。我不熟悉这两个API。查看这些项目的文档并没有立即帮助。

正如专家可能知道的那样,新的.csproj文件不会列出隐式属于项目的每个文件。另一方面,它可能会列出项目文件夹外部的“链接”文件。我想确保获得所有被视为项目一部分的文件。

最终,我想专注于特定的文件类型(.json),但我认为一般问题值得一问。

总结:我如何编写一个C#库,利用适当的程序包(希望很容易)枚举csproj中的所有文件?

2 个答案:

答案 0 :(得分:1)

您可以使用Roslyn Analyzer库加载csproject并访问其内容以及程序中的属性。您可以按照this previous SO post中的说明进行操作,也可以使用OpenProjectAsync(projectFilePath)方法在Microsoft.CodeAnalysis命名空间中加载Project类的实例。

using Microsoft.CodeAnalysis.MSBuild;

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

您可以在Github上找到有关roslyn的更多信息。

答案 1 :(得分:0)

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链接到相关资源。