Dans le cadre d'une solution contenant de nombreux projets, j'ai un projet qui référence (via un <ProjectReference>
trois autres projets dans la solution, plus quelques autres). Dans le AfterBuild
, j'ai besoin de copier les sorties de 3 projets dépendants spécifiques à un autre endroit.Déterminer les sorties d'un ProjectReference dans MSBuild sans déclencher des reconstructions redondantes
Via diverses réponses SO, etc. la façon dont je me suis installé à accomplir c'était:
<MSBuild
Projects="@(ProjectReference)"
Targets="Build"
BuildInParallel="true"
Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
<Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
</MSBuild>
<Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />
Cependant, je suis tombé sur des problèmes avec cela. La tâche <MSBuild
de l'étape IncrementalClean
finit par supprimer un nombre de sorties de ProjectC
. Lors de l'exécution sous VS2008, un fichier build.force
est déposé dans le dossier obj/Debug
de ProjectC qui déclenche alors la reconstruction de ProjectC si je fais une Build sur l'ensemble de la solution si le projet contient cette cible AfterBuild
, alors que si on exclut ce projet de la build, il [correctement] ne déclenche pas une reconstruction de ProjectC (et critique une reconstruction de toutes les dépendances de ProjectC). Cela peut être une supercherie spécifique à VS dans ce cas qui ne se produirait pas dans le contexte d'une invocation TeamBuild ou MSBuild en ligne de commande (mais l'utilisation la plus courante sera via VS, donc j'ai besoin de résoudre ça)
les projets (et le reste de la solution en général) ont tous été créés de manière interactive avec VS, et par conséquent les ProjectRefence
contiennent des chemins relatifs, etc. J'ai vu une mention de cela susceptible de causer des problèmes - mais sans une explication complète de pourquoi, ou quand il sera réparé ou comment le contourner. En d'autres termes, je ne m'intéresse pas vraiment, par exemple. convertir les chemins ProjectReference
en chemins absolus en modifiant manuellement le fichier .csproj.
Alors qu'il est tout à fait possible que je fasse quelque chose de stupide et que quelqu'un va immédiatement préciser ce que c'est (ce qui serait génial), soyez assuré que j'ai passé beaucoup de temps pour construire une repro à partir du sol - ce qui est dans le contexte d'une construction globale relativement complexe)
Tout d'abord, merci/félicitations d'avoir choisi ce casse-tête comme votre première réponse SO! Personnellement, je serais réticent à l'idée d'introduire une dépendance sur les composants internes de MSBuild de cette nature, mais oui, cela me permettrait certainement de réaliser le programme "quels fichiers a-t-il écrits"? Il y a quelques autres questions de "calculer les résultats" ici sur SO que cela pourrait mieux répondre à. Le problème principal ici pour moi est que le bit '