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 automaticamente un workflow di GitHub (parte 2)
Triggerare una pipeline su un altro repository di Azure DevOps
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Eseguire script pre e post esecuzione di un workflow di GitHub
Generare la software bill of material (SBOM) in GitHub
Creare un webhook in Azure DevOps
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Usare una container image come runner di GitHub Actions
Sostituire la GitHub Action di login su private registry
Creare una custom property in GitHub
Ottenere un token di accesso per una GitHub App
Code scanning e advanced security con Azure DevOps