2010-09-03 4 views
6

J'ai un WiX (Windows Installer XML) v3, projet qui contient des références à d'autres projets dans ma solution. J'utilise la tâche de copie à l'intérieur de l'événement BeforeBuild du projet WiX pour collecter une partie de la sortie des projets de références pour pouvoir utiliser ultérieurement mon Heat. Quand je construis le projet WiX (pas la solution) dans Visual Studio, chacun des projets référencés est construit avant mon projet WiX et une fois qu'ils sont construits, l'événement BeforeBuild de mon projet WiX se déclenche, puis le projet WiX lui-même est construit. C'est le comportement que je m'attends - je suis capable d'accéder aux fichiers des répertoires bin des projets de références dans WiX BeforeBuild et de les utiliser comme je le souhaite avant que le projet WiX n'exécute Candle.Visual Studio et MSBuild fire BeforeBuild différemment sur un projet WiX

Le problème que j'ai est quand je compile le fichier WiX via MSBuild Je trouve que l'événement BeforeBuild se déclenche immédiatement AVANT l'un des projets référencés. Cette différence de comportement signifie que je ne peux pas utiliser les sorties des projets référencés lors de la construction à partir de la ligne de commande.

Pourquoi BeforeBuild s'exécute à un moment différent lorsqu'il est exécuté via MSBuild sur la ligne de commande à l'intérieur de Visual Studio?

Répondre

8

Si vous construisez à l'intérieur de Visual Studio, les dépendances de la solution (qui peuvent être explicites ou basées sur les références du projet) sont utilisées pour déterminer quels projets doivent être construits et une version séparée est lancée pour chacun d'eux. Ceci est nécessaire car les solutions peuvent également contenir des projets qui ne sont pas construits à l'aide de MSBuild et d'autres projets ont des dépendances explicites définies dans la solution pour eux. L'effet secondaire est que chaque projet est traité comme une construction autonome, assurant ainsi la bonne BeforeBuild commande pour vous ..

Si vous construisez à partir de la ligne de commande en utilisant MSBuild, les projets de dépendances sont résolus (et construits si nécessaire) pendant la cible ResolveReferences. Les événements BeforeBuild et PreBuild (exécutés à partir de la cible PreBuildEvent) sont tous deux exécutés avant la cible ResolveReferences. Ainsi, le projet dépendant BeforeBuild cible finit par s'exécuter avant que la construction du projet de dépendance ne soit lancée. Notez que du point de vue d'un seul projet, la cible BeforeBuild a un sens pour être exécutée avant de résoudre les dépendances, car la résolution de dépendance peut elle-même dépendre de la sortie cible BeforeBuild. Par exemple, BeforeBuild peut exécuter un script personnalisé pour obtenir la dernière copie de tout projet de dépendance à partir du SCM.

+1

Merci Franci.Sounds comme BeforeBuild n'est pas ce dont j'ai besoin. Y a-t-il un événement que je peux remplacer dans mon projet WIX qui se déclenchera après que la cible ResolveReferences ait construit tous les projets référencés? –

+2

@DavEvans, regardez la cible AfterResolveReferences, soit via l'attribut BeforeTargets ou AfterTargets. Alternativement, la cible Compiler avec l'attribut BeforeTargets: ' ' – dirtybird

Questions connexes