如果我有一些dll的引用,在csproj文件中的DefineConstants

时间:2018-06-05 07:18:31

标签: msbuild msbuild-task msbuild-4.0

我想用条件定义msbuild常量:

<DefineConstants Condition="if have a reference to MyTest.dll">TEST</DefineConstants>


    <ItemGroup>
      <Reference Include="System" />
      <Reference Include="System.Core" />
      <Reference Include="MyTest.dll" />
   </ItemGroup>

我该怎么做?

2 个答案:

答案 0 :(得分:0)

例如,请参阅this question,了解如何使用“我的项目组是否包含项目X?”等条件。但是,正如所指出的那样,在全局范围内调用时,它必须在目标内完成。因此,您必须添加此类Target并使其在构建开始之前自动运行:

<Target Name="AdjustDefineConstants" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <DefineConstants Condition="'%(Reference.Identity)' == 'Mytest.dll'">TEST</DefineConstants>
  </PropertyGroup>
  <Message Text="DefineConstants is now $(DefineConstants)"/>
</Target>

答案 1 :(得分:0)

这是可能的,但您需要解决限制,即在访问项元数据时,目标之外的PropertyGroupItemGroup元素上的条件表达式会有一些限制。

您可以通过简单地将项目组连接到标量属性来利用ItemGroup扩展。在这里,我基本上将_DefineConstants粘贴到DefineConstants

的背面
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <Reference Include="MyTest.dll" />
  </ItemGroup>

  <ItemGroup Condition="@(Reference->AnyHaveMetadataValue('Identity', 'MyTest.dll'))">
    <_DefineConstants Include="Test" />
  </ItemGroup>  

  <PropertyGroup>
    <DefineConstants>$(DefineConstants);@(_DefineConstants)</DefineConstants>
  </PropertyGroup>

  <Target Name="Build">  
    <Message Text="DefineConstants: $(DefineConstants)" />
  </Target>

</Project>

这将打印";Test"

enter image description here