如何使用MSBuildWorkspace获取引用的nuget包?

问题描述 投票:1回答:1

我正在使用MSBuildWorkspace加载解决方案,以使用OpenSolutionAsync进行分析,然后迭代项目。我看不到有关项目引用的nuget包的任何信息。有MetadataReferences,但这是dll的列表,没有明确的库版本-它位于路径中的某处,但要提取此文件,我必须从文本中提取它。另外有时此列表为空,因为在项目加载期间会出现一些错误。

有没有办法获得所引用库的名称和版本的简单列表?

.net msbuild roslyn packagereference
1个回答
0
投票

根据this question discussion,In MSBuildWorkspace不具有获取项目的NuGet引用的任何功能。但是,如果您使用项目sdk格式或packages.config,则可以解析.csproj文件。否则>

对于项目SDK,您可以使用以下代码:

void NugetPackages(Microsoft.CodeAnalysis.Project project)
{
    var csproj = new XmlDocument();
    csproj.Load(project.FilePath);
    var nodes = csproj.SelectNodes("//PackageReference[@Include and @Version]");
    foreach (XmlNode packageReference in nodes)
    {
        var packageName = packageReference.Attributes["Include"].Value;
        var packageVersion = Version.Parse(packageReference.Attributes["Version"].Value);
        // handle package
    }
}

对于旧的.csproj格式,您可以使用以下代码:

void NugetPackages(Microsoft.CodeAnalysis.Project project)
{
    var directory = Path.GetDirectoryName(project.FilePath);
    var packagesConfigPath = Path.Combine(directory, "packages.config");
    var packagesConfig = new XmlDocument();
    packagesConfig.Load(packagesConfigPath);
    var nodes = packagesConfig.SelectNodes("//package[@id and @version]");
    foreach (XmlNode packageReference in nodes)
    {
        var packageName = packageReference.Attributes["id"].Value;
        var packageVersion = Version.Parse(packageReference.Attributes["version"].Value);
        // handle package
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.