Перезаписать свойства с помощью MSBuild
Я хочу объявить три свойства в файле MSBuild и перезаписать одно свойство со значением другого (в зависимости от вызываемого объекта), но не могу понять, как это сделать. Мой файл сборки выглядит примерно так:
<PropertyGroup>
<DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST>
<DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE>
<DeployPath></DeployPath>
</PropertyGroup>
<Target Name="Deploy-TEST">
<PropertyGroup>
<DeployPath>$(DeployPath_TEST)</DeployPath>
</PropertyGroup>
<CallTarget Targets="Deploy-Sub"/>
</Target>
<Target Name="Deploy-LIVE">
<PropertyGroup>
<DeployPath>$(DeployPath_TEST)</DeployPath>
</PropertyGroup>
<CallTarget Targets="Deploy-Sub"/>
</Target>
<Target Name="Deploy-Sub">
<Message Text="Deploying to $(DeployPath)"/>
<MSBuild Projects="MySolution.csproj" Targets="Rebuild" />
<ItemGroup>
<MyFiles Include="**\*"/>
</ItemGroup>
<Copy SourceFiles="@(MyFiles)"
DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/>
</Target>
В настоящий момент я пытаюсь повторно объявить значение свойства, соответствующее его значению, но это не работает.
Ответы
Ответ 1
Mehmet прав насчет того, как установить значение свойства из другого свойства, но в MSBuild есть ошибка/функция, что означает, что , если вы вызываете CreateProperty и CallTarget в одном и том же Target, ваше новое свойство не будет глобально доступный для других целей (описанный здесь).
Итак, вот окончательное решение проблемы:
<PropertyGroup>
<DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST>
<DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE>
<DeployPath></DeployPath>
</PropertyGroup>
<Target Name="SetDeployPath-TEST">
<CreateProperty Value="$(DeployPath_TEST)">
<Output TaskParameter="Value" PropertyName="DeployPath"/>
</CreateProperty>
</Target>
<Target Name="Deploy-TEST">
<CallTarget Targets="SetDeployPath-TEST"/>
<CallTarget Targets="Deploy-Sub"/>
</Target>
<Target Name="Deploy-Sub">
<Message Text="Deploying to $(DeployPath)"/>
<MSBuild Projects="MySolution.csproj" Targets="Rebuild" />
<ItemGroup>
<MyFiles Include="**\*"/>
</ItemGroup>
<Copy SourceFiles="@(MyFiles)"
DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/>
</Target>
Ответ 2
Вы можете использовать CreateProperty для перезаписывания значения существующего свойства.
<Target Name="Deploy-LIVE">
<CreateProperty Value="$(DeployPath_LIVE)">
<Output PropertyName="DeployPath" TaskParameter="Value"/>
</CreateProperty>
<CallTarget Targets="Deploy-Sub"/>
</Target>
Ответ 3
Я обычно избегаю задачи CallTarget. Намного лучше использовать целевые зависимости.
Ответ 4
Кроме того, вы можете использовать следующий способ:
<PropertyGroup>
<DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST>
<DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE>
<DeployPath></DeployPath>
</PropertyGroup>
<Target Name="SetDeployPath-TEST">
<CreateProperty Value="$(DeployPath_TEST)">
<Output TaskParameter="Value" PropertyName="DeployPath"/>
</CreateProperty>
</Target>
<Target Name="Deploy-Sub" DependsOnTargets="SetDeployPath-TEST">
<Message Text="Deploying to $(DeployPath)"/>
<MSBuild Projects="MySolution.csproj" Targets="Rebuild" />
<ItemGroup>
<MyFiles Include="**\*"/>
</ItemGroup>
<Copy SourceFiles="@(MyFiles)"
DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/>
</Target>