![](/img/trans.png)
[英]Adding a ProjectReference to a project that is not in the same solution
[英]Conditional ProjectReference based on solution configuration
是否可以根據解決方案中加載的項目有條件地包含 ProjectReference? 我們有一個插件系統,它在調試器下掃描應用程序中的所有程序集以查找插件入口點。 這在開發周期中非常方便,因此我們可以將插件項目包含在同一解決方案中,並輕松調試應用程序和插件代碼。
但是,這要求所有插件都是使用 ProjectReference 的主應用程序中的引用(條件是僅在調試配置時執行此操作)並強制加載每個插件項目以允許在 Visual Studio 中構建。 如果您可以自由卸載插件項目而無需觸及 ProjectReference 的主要項目以改進解決方案的打開時間,這將很有幫助。
我似乎找不到任何關於解決方案配置的 MSBuild 屬性可以用作新條件的文檔。
更新:為卸載的項目報告的診斷錯誤代碼是 NU1105。 因此,我開始深入研究報告的來源,並發現了VsSolutionRestoreService.cs 。 從它的外觀來看,它直接從 VisualStudio 讀取,甚至可能不是 MSBuild 的一部分,最終無法使用單個解決方案文件執行此操作。
它有助於理解在基礎構建引擎上分層的是 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 中構建解決方案的每個項目。
有一組包含解決方案信息的屬性: SolutionDir
、 SolutionExt
、 SolutionFileName
、 SolutionName
和SolutionPath
。 這些屬性記錄在“ 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.