2009-11-05 2 views
22

Je me bats avec cela depuis quelques jours et après des tonnes de recherches, je ne trouve pas le chemin que je devrais prendre. Ce que je veux faire est de mettre en place un projet MSBUILD qui va construire notre application .NET entière (constst de 8 solutions, et peut-être 250 projets répartis entre eux) avec un certain nombre de paramètres remplacés à partir des fichiers de projet individuels à faire un build de débogage pour moi-même.Comment remplacer le paramètre CopyLocal (Privé) pour les références dans .NET de MSBUILD

Spécifiquement je veux construire notre configuration de libération avec des optimisations off et des informations de débogage complètes/pdbs générées. Aussi, afin de réduire notre temps de construction actuellement très long je veux "copier local" (ou privé dans le fichier proj réel xml) faux pour chaque référence de chaque projet. Les premières choses ont été assez faciles, je peux facilement remplacer une propriété de niveau projet (vous pouvez même le faire à partir de la ligne de commande MSBuild en utilisant/p), mais ce que je n'arrive pas à comprendre, c'est comment surcharger une propriété sur une référence. J'ai essayé plusieurs choses que j'ai vues ici sur StackOverflow et sur le web, mais rien n'est encore une solution.

Je peux faire ce que je veux en modifiant Microsoft.Common.targets, en commentant le code dans la cible _CopyFilesMarkedCopyLocal ignore complètement la copie de ces fichiers. Mais je ne veux pas modifier ma configuration globale et le faire en toutes circonstances. J'ai créé mon propre fichier de cibles alternatives - qui fonctionne si je modifie un fichier de projet individuel pour le pointer - mais je ne peux pas comprendre comment spécifier cela pour être utilisé au plus haut niveau (mon fichier .proj qui construit juste toutes les 8 solutions). Ce serait génial si je pouvais en quelque sorte surcharger la cible _CopyFilesMarkedCopyLocal au plus haut niveau de sorte que si MS change le fichier de cibles par défaut, mon build n'est pas foutu, mais je n'arrive pas à comprendre comment faire ce travail non plus. La meilleure chose à faire serait de contourner les propriétés de niveau de référence comme vous pouvez projeter des propriétés de niveau, sans avoir à réécrire/surcharger les éléments de construction - mais je n'ai trouvé aucune information indiquant que cela est possible .

Merci d'avance pour toute aide à ce sujet.

P.S. Il m'est impossible de parcourir tous les fichiers de projets et de les changer; J'ai besoin d'une solution qui laisse le code existant en place tel quel.

+0

Set CopyLocal = false peut causer différents problèmes pendant le temps de déploiement. Voir mon article de blog "Ne pas modifier" Copy Local "références de projet à false, à moins de comprendre les sous-séquences." (Http://geekswithblogs.net/mnf/archive/2012/12/09/do-not-change-copy-local -project-references-to-false-unless.aspx) –

+0

Ne répond pas à votre question mais j'espère que MS peut résoudre ce problème de façon native: https://visualstudio.uservoice.com/forums/121579-visual-studio-2015/suggestions/ 13280400-améliorer-visual-studio-build-performance-for-large – Mark

Répondre

29

Essayez ceci:

Définissez les CustomAfterMicrosoftCommonTargets C: \ foo \ filtre.cibles (ou tout ce que vous nommez le fichier) et ont filter.targets être:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemDefinitionGroup> 
     <Reference> 
     <Private>False</Private> 
     </Reference> 
    </ItemDefinitionGroup> 
</Project> 
+4

Cela fonctionnait très bien, et j'ai pu ajouter simplement un autre nœud comme celui-ci: Faux Pour obtenir le même comportement sur mes références de projet (par opposition aux seuls refs de fichiers) . –

+4

La seule chose à noter est que cela définit la valeur par défaut pour ''. Si elle est définie sur un individu '', cette valeur remplacera celle spécifiée ici. –

+1

Existe-t-il un moyen de remplacer le paramètre s'il est configuré dans le fichier .csproj? –

7

Dans un fichier comme filter.targets ajouter une cible:

<Target Name="BeforeBuild"> 
    <ItemGroup> 
     <ReferenceNew Include="@(Reference)"> 
      <Private>False</Private> 
     </ReferenceNew> 
     <Reference Remove="@(Reference)"/> 
     <Reference Include="@(ReferenceNew)"/> 
    </ItemGroup> 
</Target> 

Cela va recréer le @ (référence) liste pour avoir les métadonnées « Private » est défini sur false, qui veillera à ce que la référence n » t être copié. Ensuite, exécutez la construction de votre solution ou projet avec la propriété $ (CustomAfterMicrosoftCommonTargets) définie sur le chemin d'accès à ce fichier filter.targets. De cette façon, la cible BeforeBuild sera invoquée avant la construction du projet, et toutes les références seront définies en conséquence. Si vous voulez plus de contrôle sur le moment où Private doit être false ou true, vous pouvez modifier la cible BeforeBuild et la contrôler via les propriétés.

Modifier: Il pourrait y avoir une meilleure façon de définir les métadonnées dans la cible BeforeBuild.

+0

Cela ne semble pas fonctionner pour moi, c'est certainement lancer la cible BeforeBuild (j'ai mis une tâche de message là-dedans pour vérifier qu'elle est visible) pour chaque projet, mais cela ne semble pas faire quoi que ce soit dans les références.Cela semble être la bonne direction, mais quelque chose ne marche toujours pas avec la cible présentée ci-dessus: –

+0

Essayez d'imprimer les références avant et après les avoir changées, dans le BeforeBuild Ciblez-vous Imprimer comme ceci: "ref:% (Re ference.Identity):% (Reference.Private) " – radical

+0

J'ai été capable de faire fonctionner cette méthode par la suite pour les références (j'avais autre chose de mal dans le fichier de filtre), mais je pense que la solution de Sayed ci-dessus est plus propre. –

Questions connexes