.net - 如何使用 MSBuildWorkspace 获取引用的 nuget 包?
问题描述
我正在使用 MSBuildWorkspace 加载解决方案以使用 OpenSolutionAsync 进行分析,然后对项目进行迭代。我看不到有关项目引用的 nuget 包的任何信息。有 MetadataReferences 但这是一个没有显式版本库的 dll 列表 - 它位于路径中的某个位置,但要提取它,我必须从文本中提取它。有时这个列表也是空的,因为项目加载过程中出现了一些错误。
有什么方法可以获取引用库的名称和版本的简单列表?
解决方案
在根据这个问题的讨论中,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
}
}
推荐阅读
- mysql - 带有 RDS 的 SELECT DISTINCT 语句的奇怪行为
- typescript - 具有索引签名属性的 Typescript 通用对象强类型
- reactjs - 即使在更新状态后反应状态图也不显示数据 - 反应 js
- html - CSS 重叠菜单导航链接
- java - 在java中执行进程以调用外部python程序,但程序不向控制台打印任何内容
- microservices - 如何消费聊天消息,由与服务器实例 S1 连接的用户 A 发送到队列/主题,由与另一个实例 S2 连接的另一个用户 B
- python - Selenium 安装从 anaconda 重定向到 pycharm
- python - 如何使用for循环分别读取目录中的Json文件并执行计算
- swift - 快速将带有对象的 Firestore 数组解包到模型中
- python - linux fast-colorthief 库没有安装