簡體   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