Configurar destinos y tareas
Las tareas de MSBuild seleccionadas se pueden establecer para ejecutarlas en el entorno de destino si el equipo de desarrollo admite el entorno de destino. Por ejemplo, si se utiliza un equipo Windows de 64 bits para compilar una aplicación destinada a una arquitectura de Windows de 32 bits, las tareas seleccionadas se ejecutan en un proceso de 32 bits.
Nota
Si una tarea de compilación se escribe en un lenguaje .NET, como Visual C# o Visual Basic, y no utiliza recursos o herramientas nativos, se ejecutará en cualquier contexto de destino sin adaptación.
Atributos UsingTask y parámetros de tareas
Los siguientes atributos de UsingTask
afectan a todas las operaciones de una tarea en un proceso de compilación determinado:
El atributo de
Runtime
, si está presente, establece la versión de Common Language Runtime (CLR), y puede tomar cualquiera de estos valores:CLR2
,CLR4
,CurrentRuntime
o*
(cualquier tiempo de ejecución).El atributo de
Architecture
, si está presente, establece la plataforma y el valor de bits, y puede tomar cualquiera de estos valores:x86
,x64
,CurrentArchitecture
o*
(cualquier arquitectura).El atributo de
TaskFactory
, si está presente, establece el generador de tareas que crea y ejecuta la instancia de tarea, y únicamente toma el valorTaskHostFactory
. Para obtener más información, vea Generadores de tareas más adelante en este documento.
<UsingTask TaskName="SimpleTask"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />
También puede utilizar los parámetros MSBuildRuntime
y MSBuildArchitecture
para establecer el contexto de destino de una invocación de tarea individual.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
Antes de que MSBuild ejecute una tarea, busca un valor UsingTask
coincidente que tenga el mismo contexto de destino. Los parámetros que se especifican en UsingTask
pero no en la tarea correspondiente se consideran coincidentes. Los parámetros que se especifican en la tarea pero no en el valor UsingTask
correspondiente también se consideran coincidentes. Si no se especifican valores de parámetros no se especifican en UsingTask
o la tarea, los valores se establecen de manera predeterminada en *
(cualquier parámetro).
Advertencia
Si existe más de un UsingTask
y todos tienen atributos TaskName
, Runtime
y Architecture
coincidentes, el primero que se evalúe reemplaza a los demás. Esto es diferente del comportamiento de los elementos Property
y Target
.
Si se definen parámetros en la tarea, MSBuild intenta encontrar un valor UsingTask
que coincida con estos parámetros o, al menos, que no esté en conflicto con ellos. Más de un UsingTask
puede especificar el contexto de destino de la misma tarea. Por ejemplo, una tarea que tiene archivos ejecutables diferentes para entornos de destino diferentes podría parecerse a esta:
<UsingTask TaskName="MyTool"
Runtime="CLR2"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="MyTarget">
<MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
</Target>
</Project>
Invalidación del valor predeterminado de UsingTasks
De forma predeterminada, MSBuild controla el elemento UsingTask priorizándolo según el concepto "el primero en llegar, gana". A partir de la versión 17.2, MSBuild admite la invalidación de este comportamiento a través del parámetro Override
. Un elemento UsingTask con el parámetro Override
establecido en true
tendrá prioridad sobre cualquier otro con el mismo atributo TaskName.
<UsingTask TaskName="MyTool"
Runtime="CLR4"
Architecture="x86"
Override="true"
AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />
Advertencia
Esto solo se puede hacer una vez por tarea. Las compilaciones que intenten agregar varias invalidaciones para la misma tarea recibirán el error de MSBuild MSB4275
.
Generadores de tareas
En la tabla siguiente se muestran las factorías de tareas proporcionadas por la instalación de MSBuild:
Fábrica de tareas | Descripción |
---|---|
AssemblyTaskFactory |
Este es el valor predeterminado. Ejecuta la tarea en proceso. |
TaskHostFactory |
Ejecuta la tarea fuera de proceso. |
RoslynCodeTaskFactory |
Para las tareas insertadas escritas en C# o Visual Basic y destinadas a .NET Standard; funciona con msbuild.exe y dotnet build . |
CodeTaskFactory |
Para las tareas insertadas escritas en C# o Visual Basic y destinadas a .NET Framework; funciona solo con msbuild.exe . |
El mecanismo de fábrica de tareas es extensible, por lo que también puede usar los creados por terceros o crear los suyos propios. Un motivo para crear uno sería admitir otro lenguaje para escribir tareas insertadas.
TaskHostFactory
Antes de ejecutar una tarea, MSBuild comprueba si está designada para ejecutarse en el contexto actual del software. De ser así, MSBuild la pasa a AssemblyTaskFactory
, que la ejecuta en el proceso actual; de lo contrario, MSBuild pasa la tarea a la TaskHostFactory
, que la ejecuta en un proceso que coincida con el contexto de destino. Incluso si el contexto actual y el contexto de destino coinciden, puede forzar que una tarea se ejecute fuera de proceso (por motivos de aislamiento, seguridad, o de otra índole) estableciendo TaskFactory
en TaskHostFactory
.
<UsingTask TaskName="MisbehavingTask"
TaskFactory="TaskHostFactory"
AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>
Cuando se especifica TaskHostFactory
explícitamente, el proceso que ejecuta la tarea es de corta duración. Esto permite que el sistema operativo limpie todos los recursos relacionados con la tarea inmediatamente después de que se ejecute. Por este motivo, especifique TaskHostFactory
al hacer referencia a las tareas integradas en el mismo proceso de compilación que su uso, para evitar errores de archivo en uso al actualizar el ensamblado de tareas después de una compilación.
RoslynCodeTaskFactory
RoslynCodeTaskFactory
proporciona un mecanismo por el que puede escribir código de C# o Visual Basic para una tarea en un archivo de proyecto para su uso inmediato. El código se compila durante el proceso de compilación para generar una tarea que se puede ejecutar en esa misma compilación. El código que escribe tiene como destino .NET Standard, por lo que se puede usar al ejecutar dotnet build
, que usa la versión de .NET Core (y .NET 5 y versiones posteriores) de MSBuild, así como msbuild.exe
, que usa .NET Framework. RoslynCodeTaskFactory
es mejor para la personalización que es un poco demasiado difícil de hacer en la lógica de MSBuild, pero no lo suficientemente compleja como para crear un proyecto independiente. Consulte Creación de una tarea insertada de MSBuild con RoslynCodeTaskFactory.
CodeTaskFactory
CodeTaskFactory
es una versión anterior de RoslynCodeTaskFactory
que está limitada a la versión de .NET Framework de MSBuild. Consulte Tareas insertadas de MSBuild. Esta factoría de tareas se admite, pero el código más reciente debe usar RoslynCodeTaskFactory
para una aplicabilidad más amplia.
Parámetros de tareas fantasma
Al igual que cualquier otro parámetro de tarea, MSBuildRuntime
y MSBuildArchitecture
se pueden establecer desde las propiedades de compilación.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FrameworkVersion>3.0</FrameworkVersion>
</PropertyGroup>
<Target Name="MyTarget">
<SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
</Target>
</Project>
A diferencia de otros parámetros de tarea, MSBuildRuntime
y MSBuildArchitecture
no son evidentes para la propia tarea. Para escribir una tarea que tenga en cuenta el contexto en el que se ejecuta, debe probar el contexto mediante una llamada a .NET Framework o bien debe usar propiedades de compilación para pasar información de contexto a través de otros parámetros de tarea.
Nota
Es posible establecer atributos UsingTask
desde las propiedades del conjunto de herramientas y del entorno.
Los parámetros MSBuildRuntime
y MSBuildArchitecture
proporcionan la manera más flexible de establecer el contexto de destino, pero también la manera más limitada en cuanto al ámbito. Por un lado, dado que se establecen en la propia instancia de tarea y no se evalúan hasta que la tarea está a punto de ejecutarse, pueden derivar su valor del ámbito completo de propiedades disponibles en tiempo de evaluación y tiempo de compilación. Por otro lado, estos parámetros solo se aplican a una instancia determinada de una tarea en un destino determinado.
Nota
Los parámetros de tareas se evalúan en el contexto del nodo primario, no en el del host de tareas. Las variables de entorno dependientes del tiempo de ejecución o de la arquitectura (por ejemplo, la ubicación Archivos de programa) se evalúan como el valor que coincide con el nodo primario. Pero si la tarea lee directamente la misma variable de entorno, se evaluará correctamente en el contexto del host de la tarea.