Personalizzare la compilazione della soluzione
Quando MSBuild compila un file della soluzione, prima lo converte internamente in un file di progetto e poi lo compila. Il file di progetto generato importa before.{solutionname}.sln.targets
prima di definire tutte le destinazioni e after.{solutionname}.sln.targets
dopo avere importato le destinazioni, incluse le destinazioni installate nelle directory $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore
e $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter
.
Ad esempio, è possibile definire una nuova destinazione per scrivere un messaggio di log personalizzato dopo la compilazione di MyCustomizedSolution.sln creando un file nella stessa directory denominata after.MyCustomizedSolution.sln.targets contenente
<Project>
<Target Name="EmitCustomMessage" AfterTargets="Build">
<Message Importance="High" Text="The solution has completed the Build target" />
</Target>
</Project>
La compilazione della soluzione è separata dalle compilazioni del progetto, quindi le impostazioni qui non influiscono sulle compilazioni del progetto.
Importante
Questa procedura di personalizzazione della compilazione della soluzione si applica solo alle compilazioni da riga di comando con MSBuild.exe. Non si applica alle compilazioni in Visual Studio. Per questo motivo, non è consigliabile inserire la personalizzazione a livello di soluzione. Un'alternativa migliore per personalizzare tutti i progetti in una soluzione consiste nell'usare i file Directory.Build.props e Directory.build.targets nella cartella della soluzione, come illustrato altrove in questo articolo.
Quando si hanno molti file di soluzione che si desidera estendere nello stesso modo, ma non si vuole scrivere nella $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\
cartella (che in genere richiede autorizzazioni elevate), è possibile creare i file Directory.Solution.props e Directory.Solution.targets e inserirli nel percorso radice sopra i file di soluzione che si desidera estendere. Directory.Solution.props viene importato all'inizio della compilazione della soluzione e Directory.Solution.targets viene importato alla fine della compilazione della soluzione. Quando si compila un file di soluzione, Directory.Build.props e Directory.Build.targets non vengono importati, pertanto è necessario usare Directory.Solution.props e Directory.Solution.targets. Non importano in modo implicito l'uno dall'altro.
Quando si dispone di Directory.Solution.props o Directory.Solution.targets in una cartella radice, ma si dispone di una soluzione in tale cartella che non si vuole importare, è possibile usare i file specifici della soluzione indicati in precedenza before.{solutionname}.sln.targets
e after.{solutionname}.sln.targets
per impostare le proprietà $(ImportDirectorySolutionProps)
e $(ImportDirectorySolutionTargets)
su false. In alternativa, è possibile usare le proprietà $(DirectorySolutionPropsPath)
e $(DirectorySolutionTargetsPath)
per specificare un percorso diverso per tali file. Questo può essere utile se sono presenti vari subset delle soluzioni che richiedono determinati valori di proprietà o destinazioni comuni ai subset.