Определите константы в файле csproj, если у меня есть ссылка на какую-то DLL - PullRequest
0 голосов
/ 05 июня 2018

Я хочу определить постоянную 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 голосов
/ 09 июня 2018

Это возможно, но вам нужно обойти ограничение, заключающееся в том, что условные выражения для элементов PropertyGroup и ItemGroup вне целей имеют некоторые ограничения при доступе к метаданным элемента.

Вы можете использовать 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

0 голосов
/ 05 июня 2018

См., Например, этот вопрос , чтобы узнать, как использовать условие типа «содержит ли моя группа товаров элемент X?».Однако, как уже отмечалось, это не работает при вызове в глобальной области видимости, это должно быть сделано в рамках цели.Поэтому вам нужно добавить такую ​​цель и запустить ее автоматически перед началом сборки:

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