No me importa una repetición ocasional de algo cuando es necesario, pero en MSBuild realmente no sé cómo alguna vez evitar la repetición. No ofrece "funciones" en el sentido habitual; un objetivo solo puede recibir una llamada una vez, incluso a través de CallTarget
, y <Import>
solo funciona en el nivel Project
.¿Cómo evitar la repetición en MSBuild?
Aquí está un ejemplo específico que estoy tratando de- "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>
Tengo cuatro de estos objetivos, Tgt1
, Tgt2
, Tgt3
, Tgt4
. El único que difiere entre estos cuatro objetivos es la primera línea, la que define Conf1
y Conf2
.
La única idea de deduplicación más o menos viable de la que soy consciente es moviendo el código compartido a un nuevo objetivo y llamándolo a través de la tarea MSBuild
. Desafortunadamente, esto requiere una cadena de propiedades loooooong para pasarlas manualmente, y esta tarea usa algunas (conté 11 propiedades y 1 grupo de elementos).
Un requisito adicional es que puedo invocar el script con un arbitrario subconjunto de estos objetivos, p. \t:Tgt2,Tgt3
.
¿Existe alguna alternativa sensata a la simple copia/pegado de este trozo de código, que no implique copiar enormes listas de propiedades en su lugar?
Pero esto significa que ya no puedo construir solo uno o solo dos de ellos, ¿correcto? Cualquier forma de preservar esa habilidad? –
Puede poner condiciones en los artículos. Actualizaré la respuesta con un ejemplo. –
Gracias, aunque puedo ver que las condiciones se vuelven bastante complicadas si quiero incluir cualquier _dos_ compilaciones. Actualmente, me inclino por mantener la repetición porque me gustaría mantener la capacidad de especificar '/ t: Tgt1, Tgt2'; el guión real en realidad tiene algunos objetivos más, y confiamos en la capacidad de seleccionar subconjuntos arbitrarios. Me gusta esto. –