web-dev-qa-db-fra.com

Définissez "Copier local" sur FALSE par défaut?

Puis-je définir l'option par défaut de "copier local" dans Visual Studio sur False? Dans la plupart des temps, lorsque j'ajoute une DLL à titre de dépendance d'un projet, je souhaite que la propriété locale de copie soit fausse. Par défaut, c'est vrai. Existe-t-il un moyen de modifier le comportement par défaut de Visual Studio? (2008)

36
dr pain

Nous n'utilisons pas de fichiers .Targets (comme suggéré dans la réponse de YA23), donc nous venons de modifier le .csproj fichier de projet manuellement dans un éditeur de texte et ajouter le <Private> élément à la référence, comme ceci:

<Reference Include="[...]">
  <Private>False</Private>
  [...]
</Reference>

La valeur du <Private> élément correspond à la valeur de la propriété "Copie locale". Par exemple, si <Private> est défini sur FALSE, puis "Copier local" est également faux ..

7
herzbube

En commençant par MSBUILD V 15, vous pouvez copier un fichier unique appelé répertoire.build.props dans le dossier racine contenant votre source:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
     <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>
</Project>

Rien de plus à faire! Cela fonctionne bien avec Visual Studio 2017 et également la construction VNext. Puissiez-vous avoir à fermer Visual Studio et à ouvrir à nouveau votre solution pour prendre l'effet de fichier.

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-Your-Build#DirectoryBuildProps-and-DirectoryBuildTargets

6
gReX

Cumposer cela parce qu'il semble qu'il y a maintenant un paquet Nuget permettant exactement cela ...

https://nuget.org/packages/copylocalfalse

N'a pas encore essayé, j'espère que cela aide.

4
mabian69

En ce qui concerne la solution postée par @Herzbube, si vous souhaitez désactiver "Copier local" pour tout (ou le plus) des références dans votre fichier .csproj, vous n'avez pas besoin de définir <Private>False</Private> individuellement sur chaque Reference, vous pouvez simplement mettre les suivants directement dans le .csproj:

<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
</ItemDefinitionGroup>

Cela n'affecte pas les projets référencés avec <ProjectReference>, mais vous pouvez faire la même chose - soit plutôt que pour ceux-ci:

<ItemDefinitionGroup>
  <ProjectReference>
    <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>

Si vous voulez les deux, vous pouvez les fusionner dans un seul groupe:

<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
    <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>

Assurez-vous de mettre ces substituts avant le premier <Reference ...> réel ou <ProjectReference ...> Vous souhaitez affecter car ces blocs s'appliqueront uniquement à ces références qui apparaissent en dessous d'eux. Ensuite, s'il y a quelques-unes que vous do veuillez réellement être copié localement, vous pouvez simplement remplacer ces arrière individuellement (c'est-à-dire dans la balise individuelle elle-même), cette fois-ci. en utilisant True.

Pour des cas plus avancés, vous pouvez commuter la valeur primordiale d'aller et retour entre true et faux plusieurs fois dans le même fichier .csproj. Une autre technique avancée serait de placer de manière stratégique certaines de vos références inférieures à ces blocs et d'autres personnes ci-dessus, ce dernier ne sera pas affecté.

Tout cela devrait rendre le XML dans votre .csproj beaucoup plus propre et plus facile à lire. Mais il y a encore plus de bonnes nouvelles, alors lisez-la ...


En ce qui concerne la sélection desquels les projets doivent être marqués <Private>False</Private>, cela dépendra généralement de la situation spécifique, mais il y a quelque chose de fondamental tout le monde peut et devrait pour commencer. C'est une étape aussi basique, simple et efficace et offre des améliorations de fiabilité énorme msbuild1. et une vitesse de construction de temps - et avec peu de baisse - que chaque grande solution qui utilise la valeur par défaut (c'est-à-dire le projet local per-projet) C # Les emplacements de sortie doivent presque toujours faire ce réglage:

Dans toutes les solutions de studio visuelles qui construit plusieurs bibliothèques C # classes avec tout numéro non trivial de <ProjectReference> inter-dépendances, et qui culmine dans la construction d'une autre applications (I.e. Executables):

  1. Près du sommet du .csproj pour chaque Bibliothèque Classe, insérez le bloc <ProjectReference> indiqué ci-dessus.
    Raison: il n'y a pas besoin de .dll Pour rassembler l'une des bibliothèques qu'elle références dans un sous-répertoire à part entière, car aucun exécutable n'est jamais exécuté de cet emplacement. Une telle copie rampeuse est une tâche animée inutile et peut être inutilement ralentissement de votre construction, éventuellement assez spectaculaire.

  2. D'autre part, do pas Modifiez le fichier .csproj pour l'une quelconque de votre solution applications.
    Raison: les exécutables doivent avoir toutes les bibliothèques intégrées à titre privé dont ils ont besoin dans leurs sous-répertoires respectifs, mais la construction de chaque application doit être responsable de la collecte individuelle de chaque dépendance, directement à partir de son sous-répertoire respectif, dans le sous-répertoire de l'application.

Cela fonctionne parfaitement car la bibliothèque .CSPROJ pour une banque de classe peut faire référence à plusieurs autres bibliothèques de catégorie, mais le .csproj pour un exécutable ne fait généralement jamais référence à un autre exécutable. Ainsi, pour chaque bibliothèque construite localement, le seul .dll dans son dossier bin sera lui-même, tandis que toutes les applications intégrées localement contiendront l'ensemble complet des bibliothèques intégrées localement. .

De manière appropriée, rien ne change pour les bibliothèques référencées qui ne sont pas construites par votre solution, car elles utilisent généralement <Reference> au lieu de <ProjectReference>, et nous n'avons pas modifié l'ancien tag du tout. Mais notez que l'hypothèse vient de mentionner; S'il est violé par certains de vos projets, vous devrez peut-être effectuer des ajustements.

[1.] Les améliorations de la fiabilité pourraient être liées aux collisions de fichiers pouvant survenir lors de la collecte de la même bibliothèque à partir de plusieurs chemins disjoints dans un graphique de dépendance, en particulier dans les constructions simultanées.

2
Glenn Slayden