Я не против случайного повторения чего-то, когда это необходимо, но в MSBuild я действительно не знаю, как избежать повторения. Он не предлагает «функции» в обычном смысле; цель может быть вызвана только один раз, даже через CallTarget
, а <Import>
работает только на уровне Project
.Как избежать повторения в MSBuild?
Вот конкретный пример, который я пытаюсь Де- "repetize":
<Target Name="Tgt1">
<PropertyGroup><Conf1>Twiddle</Conf1><Conf2>Thing</Conf2></PropertyGroup>
<PropertyGroup><xxxxxxxxxxExePath>$(xxxxxxxBuildRoot)\$(Conf1)Console-xxxxxxxxed</xxxxxxxxorExePath></PropertyGroup>
<MSBuild Projects="$(BuildSingleProj)" Targets="Build;Merge"
Properties="Configuration=$(Conf1)$(Conf2);Platform=$(Platform);CompiledFileName=$(CompiledFileName);ProjectName=$(ProjectName);SolutionFile=$(SolutionFile);Root=$(Root);Caller=$(MSBuildProjectFullPath)"/>
<MakeDir Directories="$(xxxxxxxxorExePath)" />
<WriteLinesToFile File="$(xxxxxxxxorExePath)\xxxxxxx.IsPortable.txt" />
<WriteLinesToFile File="$(xxxxxxxxorExePath)\xxxxxxx.Global.Settings.xml" Lines="@(xxxxxxxLicense)" Overwrite="true" />
<Exec Command='$(xxxxxxxxorExePath)\xxxxxxx.exe -a "$(xxxxxxxBuildRoot)\$(Conf1)$(Conf2)-Merged\xxxxxxx.exe" "$(xxxxxxxBuildRoot)\$(Conf1)$(Conf2)-xxxxxxxxed\xxxxxxx.exe"'/>
</Target>
У меня есть четыре таких целей, Tgt1
, Tgt2
, Tgt3
, Tgt4
. только вещь, которая отличается от этих четырех целей, - это первая строка, которая определяет Conf1
и Conf2
.
Единственная более или менее работоспособная идея устранения дублирования, о которой я знаю, заключается в перемещении общего кода на новую цель и вызове его с помощью задачи MSBuild
. Это, к сожалению, требует строку свойств свойств, которые должны быть вручную переданы, и эта задача использует несколько (я посчитал 11 свойств и 1 группу элементов).
Дополнительным требованием является то, что я могу вызвать скрипт с произвольным подмножеством этих целей, например. \t:Tgt2,Tgt3
.
Есть ли разумная альтернатива просто копированию/вставке этого фрагмента кода - это не связано с копированием вокруг огромных списков свойств?
Но это означает, что я больше не могу строить только один или два из них, правильно? Любой способ сохранить эту способность? –
Вы можете установить условия на предметы. Я отвечу на пример. –
Спасибо, хотя я вижу, что условия становятся довольно сложными, если я хочу включить любые _two_ сборки. В настоящее время я склоняюсь к сохранению повторения, потому что я хочу сохранить возможность указывать '/ t: Tgt1, Tgt2' - у реального скрипта действительно есть еще несколько целей, и мы полагаемся на способность выбирать произвольные подмножества как это. –