Nel precedente script #169 si è visto come è possibile sfruttare le capacità di msbuild per eseguire task e differenziare il config da utilizzare a seconda della configurazione di compilazione. I task però sono un set limitato e in alcune circostanze questi non bastano per coprire tutte le esigenze. Fortunatamente i task sono classi del .NET Framework perciò è consentito sviluppare nuove funzionalità semplicemente creando una nuova classe.
In questo script si vuole creare un task che esegue una trasformazione XSLT in base ad un file di progetto e scrive il risultato in un file. Questa caratteristica viene sfruttata poi per fornire un unico file di configurazione che al suo interno contiene solo le differenze in base ad un parametro, come visibile nello snippet seguente, dove si crea una chiave nell'appSettings che indichi la configurazione di compilazione utilizzata.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns=""> <xsl:param name="configuration" /> <xsl:template match="/"> <configuration> <appSettings> <add key="test" value="chiave in {$configuration}" /> </appSettings> </configuration> </xsl:template> </xsl:stylesheet>
Per creare il task si crea quindi un nuovo progetto e si referenzia l'assembly Microsoft.Build.Framework. Si crea poi una classe che erediti da Task, la quale implementa l'unico metodo Execute che deve restituire true oppure false in base all'esito dell'azione. Si definiscono inoltre le proprietà che permettono di configurare il task; in questo caso si indicano Configuration, TargetFile e SourceConfig come nel codice seguente:
public class AppConfigTask : Task
{
public override bool Execute()
{
}
[Required]
public string Configuration
{
get;
set;
}
[Required]
public ITaskItem TargetFile
{
get;
set;
}
[Required]
public ITaskItem SourceConfig
{
get;
set;
}
}Tralasciando l'aspetto implementativo della trasformazione XSLT (visibile nell'allegato) quello che conta è eseguire le operazioni nel metodo Execute e informare il motore con i metodi BuildEngine.LogErrorEvent e BuildEngine.LogMessageEvent di eventuali errori o messaggi. Le proprietà di tipo ITaskItem indicano l'elemento che msbuild prepara in funzione di variabili e condizioni, e mediante ItemSpec è possibile accedere al nome del file indicato.
Una volta compilato il tutto occorre aprire manualmente il file .proj dove si intende utilizzare il task. Prima di tutto occorre informare il motore del task personalizzato mediante l'istruzione UsingTask.
<UsingTask TaskName="ASPItalia.com.Build.Tasks.AppConfigTask"
AssemblyFile="..\AppConfigTask\bin\Debug\ASPItalia.com.Build.Tasks.dll" />Successivamente è possibile utilizzarlo indicando il file sorgente, la configurazione e la destinazione.
<Target Name="AfterBuild">
<AppConfigTask Configuration="$(Configuration)"
SourceConfig="app.config"
TargetFile="$(OutDir)$(TargetFileName).config" />
</Target>Riaprendo il progetto in Visual Studio è possibile creare il file app.config come indicato in precedenza e compilare. I vantaggi che si ottengono rispetto ad un normale comando batch sono molteplici:
- si possono effettuare logiche più complesse sfruttando l'intero .NET Framework;
- vi è una maggiore possibilità di indicare gli errori e notificarli. Se si sbaglia la configurazione la compilazione indicherà il punto esatto dove l'XML non è ben formattato o l'XSLT non è valido.
E' possibile infine trovare l'intera lista dei task disponibili al seguente indirizzo:
http://msdn.microsoft.com/en-us/library/7z253716.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Ricerca delle GitHub issue tramite operatori logici
Escludere alcuni file da GitHub Copilot
Impostare la content-visibility in CSS per ottimizare il rendering iniziale di una pagina
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Managed deployment strategy in Azure DevOps
Modificare lo stile in una QuickGrid Blazor
Configurare automaticamente un webhook in Azure DevOps
Rendere le variabili read-only in una pipeline di Azure DevOps
Rendere i propri workflow e le GitHub Action utilizzate più sicure
Integrare un servizio esterno con .NET Aspire
Integrare modelli AI in un workflow di GitHub
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Sfruttare una CDN con i bundle di ASP.NET
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Le DirectInk API nella Universal Windows Platform
- Gli oggetti CallOut di Expression Blend 4.0
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Inserire le news di Punto Informatico nel proprio sito


