繁体   English   中英

基于解决方案配置的条件 ProjectReference

[英]Conditional ProjectReference based on solution configuration

是否可以根据解决方案中加载的项目有条件地包含 ProjectReference? 我们有一个插件系统,它在调试器下扫描应用程序中的所有程序集以查找插件入口点。 这在开发周期中非常方便,因此我们可以将插件项目包含在同一解决方案中,并轻松调试应用程序和插件代码。

但是,这要求所有插件都是使用 ProjectReference 的主应用程序中的引用(条件是仅在调试配置时执行此操作)并强制加载每个插件项目以允许在 Visual Studio 中构建。 如果您可以自由卸载插件项目而无需触及 ProjectReference 的主要项目以改进解决方案的打开时间,这将很有帮助。

我似乎找不到任何关于解决方案配置的 MSBuild 属性可以用作新条件的文档。

更新:为卸载的项目报告的诊断错误代码是 NU1105。 因此,我开始深入研究报告的来源,并发现了VsSolutionRestoreService.cs 从它的外观来看,它直接从 VisualStudio 读取,甚至可能不是 MSBuild 的一部分,最终无法使用单个解决方案文件执行此操作。

以解决方案配置为条件的 ProjectReference

它有助于理解在基础构建引擎上分层的是 C# 构建框架。 当您使用 Visual Studio 或dotnet工具创建项目时,生成的项目会导入许多其他 MSBuild 文件。

就基本构建引擎而言, ProjectReference只是一个ItemGroup ProjectReference作为当前项目所依赖的一组项目的特殊含义,是在导入的文件中实现的。

ProjectReference是一个Item元素,Items 支持Condition属性。 是的, ProjectReference可以是有条件的。

当前配置在名为Configuration的属性中可用。 Configuration属性记录在“ Common MSBuild project properties ”中。

  <ItemGroup>
    <ProjectReference Include="..\..\some\other\project.csproj" Condition="'$(Configuration)' == 'Debug'" />
  </ItemGroup>

在 Visual Studio 的“构建”菜单中,选择“配置管理器...”以查看解决方案配置如何映射到项目配置。 除非已自定义,否则在 Debug 中构建解决方案将在 Debug 中构建解决方案的每个项目。

ProjectReference 以解决方案中的项目为条件

有一组包含解决方案信息的属性: SolutionDirSolutionExtSolutionFileNameSolutionNameSolutionPath 这些属性记录在“ MSBuild 命令和属性的通用宏”中的 C++ 文档中。 这是提供给项目的有关解决方案的信息的范围。 在传统风格的项目中,当直接而不是通过解决方案构建项目时,这些属性将是未定义的。

在 Visual Studio 解决方案资源管理器窗口中卸载项目时,解决方案文件不会更改。 项目的加载或卸载状态不是解决方案文件的一部分。 它由 IDE 存储在别处。

您可以创建一组解决方案过滤器文件,而不是卸载项目。 解决方案过滤器文件是列出“已加载”项目的 JSON。 请参阅“ Visual Studio 中的筛选解决方案”。 不幸的是, Solution*属性仍将为基础解决方案定义,不会为您提供正在使用的解决方案过滤器文件,并且解决方案过滤器文件没有任何属性。

您可以在解决方案文件中创建不同的配置,并为构建禁用不同的项目集。 除了“Debug”之外,您还可以添加“Debug-Plugin1”、“Debug-Plugin2”等。 您可以编写一个自定义 MSBuild 任务来读取解决方案文件,并针对当前配置返回已启用项目的列表。 自定义任务可以使用Microsoft.Build包来读取和解析解决方案文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM