2009-03-07 5 views
32

J'ai une solution qui contient plusieurs projets C# et j'aimerais pouvoir définir ensemble le chemin de sortie et d'autres propriétés sur tous les projets en un seul endroit. Les feuilles de propriétés (vsprops) ne semblent pas pouvoir être disponibles pour les projets C# et la variable $ (SolutionDir) est ignorée. Existe-t-il d'autres méthodes pour définir des propriétés sur plusieurs projets C#?Comment définir le chemin de sortie de plusieurs projets C# visuels

Mise à jour En suivant les informations contenues dans la réponse par Bas Bossink j'ai pu définir le chemin de sortie de plusieurs projets en créant un csproj commun et l'importer dans le projet individuel. Quelques autres points:

  • Lors de la construction dans Visual Studio si des modifications sont apportées au projet commun, il est nécessaire de toucher/recharger tous les projets qui y font référence pour que les modifications soient ramassées.
  • Les propriétés qui sont également définies dans un projet individuel remplacent les propriétés communes.
  • La définition de $ (SolutionDir) en tant que chemin de sortie via l'interface utilisateur de Visual Studio ne fonctionne pas comme prévu car la valeur est traitée comme un littéral de chaîne au lieu d'être développée. Cependant, définir $ (SolutionDir) directement dans le fichier csproj avec un éditeur de texte fonctionne comme prévu.
+5

La 3e balle a vraiment sauvé ma journée ici. Merci d'avoir posté cette information ici. –

Répondre

35

Un fichier csproj est déjà un fichier msbuild, ce qui signifie que les fichiers csproj peuvent également utiliser un élément import comme décrit here. L'élément d'importation est exactement ce dont vous avez besoin. Vous pouvez créer un Common.proj qui contient quelque chose comme:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5"xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<PropertyGroup> 
    <OutputPath>$(SolutionDir)output</OutputPath> 
    <WarningLevel>4</WarningLevel> 
    <UseVSHostingProcess>false</UseVSHostingProcess> 
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors> 
</PropertyGroup> 
</Project> 

Vous pouvez importer ce Common.proj dans chacun de vos csprojs, par exemple comme ceci:

<Import Project="..\Common.proj" /> 

La déclaration d'importation doit précéder toute tâches qui dépendent des propriétés définies dans Common.proj

J'espère que cela aide. Je ne peux pas confirmer vos problèmes avec la variable $ (SolutionDir) que j'ai utilisée plusieurs fois. Je sais cependant que cette variable n'est pas définie lorsque vous exécutez une commande msbuild via la ligne de commande sur un projet spécifique contenu dans une solution. Il sera défini lorsque vous construisez votre solution dans Visual Studio.

+1

Il ne vaut pas la peine de mentionner $ (SolutionDir) ne doit pas être défini à partir de Visual Studio UI, mais en utilisant un éditeur de texte. Voir @paul edit. –

+1

Il convient également de mentionner que pour chaque propriété que vous définissez dans le fichier common.proj, vous devez également supprimer le fichier qui l'inclut. –

0

Je vous suggère d'utiliser un outil de construction tel que MSBuild ou NAnt qui vous donnerait plus de flexibilité sur vos builds. Fondamentalement, l'idée est de lancer une construction en utilisant (dans la plupart des cas) un seul fichier de construction configurable.

Je recommande personnellement NAnt.

Vous pouvez trouver un tutoriel impressionnant sur NAnt sur JP blog de Boodhoo here

+0

MSBuild est ce que vous devriez utiliser. Je seconde en utilisant MSBuild. NAnt, d'autre part n'a pas été mis à jour depuis 2012, et semble être mort. –

1

Malheureusement, ces éléments d'information tels que le chemin de sortie sont tous stockés dans les fichiers .csproj individuels *. Si vous voulez mettre à jour tout un tas de ceux-ci, vous devrez revenir à une sorte d'outil de mise à jour de texte ou créer un script pour toucher chacun de ces fichiers.

Pour des choses comme ça (appliquer des modifications à un tas de fichiers texte à la fois) J'utilise personnellement WildEdit par Helios Software - fonctionne comme un charme et son prix est raisonnable.

Mais je suis sûr qu'il y a des tonnes d'alternatives gratuites là-bas, aussi.

+0

Une recherche et un remplacement simples à l'aide d'un éditeur de texte favori fonctionneront également. –

+0

@CJohnson: si vous avez un, deux ou même cinq fichiers sur lesquels travailler - oui. Si vous avez 150, 250, ou plus - pas tellement plus ..... –

0

Définissez la propriété $(OutputPath) dans une feuille de propriétés commune. Supprimez ensuite cette entrée dans tous les fichiers de projet que vous voulez affecter. Puis importez cette feuille de propriétés dans tous vos projets.

Pour des centaines de projets qui peuvent être très fastidieux. Quelle est la raison pour laquelle je l'ai écrit un outil pour aider à ceci:

https://github.com/chris1248/MsbuildRefactor

Questions connexes