Comment MSBuild décide-t-il s’il doit ou non reconstruire une bibliothèque C #?

Comment MSBuild décide-t-il s’il doit reconstruire une bibliothèque (c’est-à-dire, appeler csc) ou non, lorsqu’il est exécuté sur un fichier de projet C #?

J’imagine (mais je veux confirmer):

  • S’il n’y a pas de répertoire de sortie, reconstruisez (duh :))
  • Si un fichier C # a changé, reconstruisez
  • Si un fichier inclus marqué comme toujours copie a toujours changé, reconstruisez
    • Ou est-il assez intelligent pour ne pas reconstruire, mais simplement copier le fichier dans la sortie existante?
  • Si un fichier inclus marqué copy-if-newer a changé, reconstruisez
    • Même question que ci-dessus

Si vous regardez dans Microsoft.CSharp.targets (le fichier MSBuild pour la compilation de projets C #), la cible CoreComstack a un ensemble d’entrées et de sorties défini. Celles-ci servent à vérifier la dépendance pour voir si CoreComstack doit être exécuté. La liste des entrées comprend les fichiers C #, les fichiers de ressources, l’icône de l’application, le fichier de clé de nom fort et les autres entrées personnalisées que vous pouvez définir.

Si vous avez une solution et exécutez MSBuild sur celle-ci avec la journalisation des diagnostics activée (paramètre de ligne de commande / v: diag), ce message peut s’afficher si les sorties sont à jour:

Sauter la cible “CoreComstack” car tous les fichiers de sortie sont à jour par rapport aux fichiers d’entrée.

Le fichier de cibles se trouve dans le répertoire .NET Framework ( C:\windows\Microsoft.NET\Framework\v3.5 or v4.0.30319 .NET C:\windows\Microsoft.NET\Framework\v3.5 or v4.0.30319 ).

MSBuild a une fonctionnalité intégrée pour le faire.

La cible a deux propriétés, Inputs et Outputs .

Chaque fois que l’ Input change ou que la Output est ancienne ou manquante, la Target est exécutée.

En réalité, toute heuristique qui pourrait paraître plausible ne va probablement pas la couper. Et lorsque vous demandez à votre compilateur (système de compilation) de produire une sortie, vous avez tout intérêt à vous garantir que la sortie est celle que vous attendez.

Autant que je sache, MSBuild ne le fait pas. Il reconstruit toujours (à partir de zéro) l’intégralité de la solution / projet. Toutefois, lorsque MSBuild est appelé à partir de Visual Studio, les unités de compilation temporaires sont conservées dans le dossier \ obj de votre projet. Vider ce dossier revient à reconstruire.

Cela dit, si le compilateur ou le système de génération devait réutiliser les sorties, il utiliserait des sums de contrôle du contenu réel du fichier pour déterminer si une sortie compilée pouvait être extraite d’un autre endroit. C’est fondamentalement le seul moyen fiable de déterminer si un fichier doit être recompilé à partir de rien. Pour votre information, cela est fait par le compilateur Visual C # et non par MSBuild.

L’atsortingbut “dernière date de modification” du système de fichiers ne serait pas un système cohérent et ne serait donc pas utilisé pour déterminer s’il convient de créer avec une sortie mise en cache ou à partir de zéro.