Проблема, с которой вы сталкиваетесь, заключается в том, что вы ссылаетесь на метаданные в списке.%(Layout.PartnerCode)
перебирает ItemGroup «Layout», которая в этом случае возвращает 2 элемента.Даже с 1 это приводит к нежелательным, неожиданным результатам, так как вы указываете на список.MSBuild возвращает два метатега и не знает, какой из них вы хотели бы иметь.В результате вместо этого он выбирает ничего ... или ... ну, MSBuild заканчивает тем, что устанавливает его в ничто.
Я бы предложил установить определение элемента по умолчанию, как это (MSBuild 3.5)
<ItemDefinitionGroup>
<Layout>
<PartnerCode>%(Identity)</PartnerCode>
<Suffix>%(PartnerCode)</Suffix>
<Destination Condition="'$(LayoutENV)'=='Preprod'">..\Compile\layout\pre\</Destination>
</Layout>
</ItemDefinitionGroup>
А затем определите их так, как вы бы хотели.
<ItemGroup>
<Layout Include="Bla" />
<Layout Include="Bli" />
<Layout Include="Bloop">
<PartnerCode>B2</PartnerCode>
<Suffix>%(PartnerCode)</Suffix>
</Layout>
</ItemGroup>
Sidenotes
Примечание .Кажется, что метаданные анализируются только один раз для каждой группы определений / группы элементов, поэтому, если вы устанавливаете PartnerCode, вам также придется сбросить суффикс, как показано во втором примере. Я не знаком с поведением в MSBuild 3.5, но это так в MSBuild 4.0.
Примечание .Я предполагаю, что вы хотите, чтобы ваше имя файла использовалось в качестве суффикса, Identity
добивается цели, см. Здесь «Метаданные общеизвестных элементов MSBuild»: (https://msdn.microsoft.com/en-us/library/ms164313.aspx),, если это не так, вы всегда можете следоватьПользовательский пример переопределения или написать свою собственную функцию на его основе. Подробнее о подобных вещах можно прочитать здесь: «Функции свойств MSBuild»: (https://msdn.microsoft.com/en-us/library/dd633440.aspx)