這是可能,但需要一點MSBuild欺騙。引用的項目構建方式是,它們通過Microsoft.Common.targets文件中的操作最終放入@(ProjectReferenceWithConfiguration)項目數組中。現在,如果該項目被列入本項數組像這樣,在一個項目,但不能從其他
<!-- pseudo-code for what Microsoft.Common.targets creates -->
<ItemGroup>
<ProjectReferenceWithConfiguration Include="ReferencedProject.csproj">
<AdditionalProperties>DefineConstants=EDITOR</AdditionalProperties>
</ProjectReferenceWithConfiguration>
</ItemGroup>
...這將獲得建立你想要的方式。你怎麼設置它呢?那麼,你可以用你自己的自定義目標創建@(ProjectReferenceWithConfiguration)項目數組,並添加AdditionalProperties元數據值。事情是這樣的......
<!-- inside referencing project -->
<Target Name="AddEditorConstant"
AfterTargets="AssignProjectConfiguration"
BeforeTargets="_SplitProjectReferencesByFileExistence">
<ItemGroup>
<ProjectReferenceWithConfiguration
Condition="'%(Identity)' == 'ReferencedProject.csproj'>
<AdditionalProperties>DefineConstants=EDITOR</AdditionalProperties>
</ProjectReferenceWithConfiguration>
</ItemGroup>
</Target>
(請注意,我並沒有真正運行這個,有些實驗可能需要)
對於反轉定製的位置更通用的解決方案,把它放在裏面參考項目,而不是引用裏面,你可以改爲與基準爲自定義屬性到所有引用注入父項目,
<!-- somewhere common to all projects -->
<Target Name="InjectReferencingProject"
AfterTargets="AssignProjectConfiguration"
BeforeTargets="_SplitProjectReferencesByFileExistence">
<ItemGroup>
<ProjectReferenceWithConfiguration>
<AdditionalProperties>ReferencingProject=$(MSBuildProjectFile)</AdditionalProperties>
</ProjectReferenceWithConfiguration>
</ItemGroup>
</Target>
,然後在裏面ReferencedProject.csproj,修改此基礎上任何你想要的父母公關oject具有參考,
<!-- inside referenced project -->
<PropertyGroup>
<DefineConstants>default-constants</DefineConstants>
<DefineConstants
Condition="'$(ReferencingProject)' == 'SomeSpecialProject.csproj'"
>$(DefineConstants);EDITOR</DefineConstants>
</PropertyGroup>
很酷,我可以看到,可以工作。只是一個想法:引用的項目能否「繼承」引用項目的DefineConstants屬性? –
真的沒有這種繼承的東西。當引用的項目被構建時,它將與MSBuild任務以及所有其他引用的項目一起顯式構建。 AdditionalProperties元數據提供了一個選項,可以將額外的配置信息分別傳遞到項目中。 –
我希望有一個更優雅的解決方案,但似乎沒有一個。所以謝謝你的回覆:) –