1

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

描述项目系统的文档指向使用 MSBuild(文件格式)或通用项目系统(项目树)。我对这两个 API 都不熟悉。查看这些各自项目的文档并没有立竿见影的帮助。

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

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

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

4

2 回答 2

2

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

于 2018-10-31T01:13:38.307 回答
1

您可以使用 Roslyn Analyzer Libraries 加载 csproject 并访问它的内容以及程序中的属性。您可以按照之前的 SO 帖子中的说明进行操作,或者使用OpenProjectAsync(projectFilePath)方法在 Microsoft.CodeAnalysis 命名空间中加载 Project 类的实例。

using Microsoft.CodeAnalysis.MSBuild;

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

你可以在Github找到更多关于 roslyn 的信息。

于 2018-10-30T19:01:03.527 回答