web-dev-qa-db-fra.com

Macros / variable d'environnement dans les fichiers .sln et .vcproj pour Visual studio

J'ai deux problèmes similaires:

a) J'ai une solution qui comprend plusieurs projets et je veux pouvoir changer facilement l'emplacement du projet en définissant une variable/macro d'environnement. Par exemple, ce projet peut être situé dans\SolutionDir\Dir1\ou\SolutionDir\Dir2\Donc, je veux spécifier qu'il doit être situé dans\SolutionDir\$ (Var) et simplement définir la variable.

Existe-t-il une version de Visual Studio pour le faire?

Je ne connais actuellement que deux solutions - éditez le manuel du fichier .sln/par programme pour trouver ce projet et définir le chemin correct.

Je n'ai pas pu utiliser la variable d'environnement dans le fichier .sln.

b) J'ai un projet qui inclut des fichiers de ressources (.rc et .h). Je veux pouvoir définir leur emplacement via une autre variable ou macro d'environnement.

Quelque chose comme\ProjectDir\$ (Var2)\resource.rc

J'ai trouvé des informations prometteuses sur les feuilles de propriétés, mais Visual studio ne développe pas les macros lorsque je les utilise dans la balise File du .vcproj.

Merci pour toutes les idées sur la façon de résoudre ce problème.

Cordialement, Victor

31
Victor Ronin

Utilisez simplement la variable d'environnement dans le champ correspondant:

OutputDirectory="$(MyEnvVariableName)\Bin"

Une astuce consiste à redémarrer Visual Studio IDE chaque fois que vous modifiez la variable.

Il y a un article MSDN précisément à ce sujet: Comment: utiliser des variables d'environnement dans une build

21
Rom

Je pense que j'ai le même objectif que vous: je veux utiliser des variables d'environnement pour localiser certains projets dans un fichier de solution (.sln) et utiliser certaines variables d'environnement pour localiser certains fichiers dans mes projets.

J'ai trouvé un moyen de le faire et cela fonctionne bien pour moi (avec Visual Studio 2005): - modifiez le fichier .sln avec un éditeur de texte et utilisez des variables d'environnement avec la syntaxe suivante% MyEnvironmentVariable% - modifiez les fichiers .vcproj et remplacez le chemin d'accès aux fichiers souhaités avec quelques variables, avec la syntaxe suivante $ (MyEnvironmentVariable).

J'espère que ça aide ... Cyrille

19
Cyrille

La meilleure façon de réaliser ce que vous décrivez en b) est d'utiliser des feuilles de propriétés. Découvrez également cette très question similaire .

J'ai trouvé des informations prometteuses sur les feuilles de propriétés, mais Visual studio ne développe pas les macros lorsque je les utilise dans la balise File du .vcproj.

Je ne sais pas quelle version de VS vous utilisez. VS2008 vous permet de définir par exemple un répertoire d'inclusion comme celui-ci: "$ (OpenCVInclude)\cxcore\include". Je l'utilise tout le temps. OpenCVInclude est une macro définie dans une feuille de propriétés.

Quant à la question a), je pense qu'il n'y a pas de façon "propre" de faire ce que vous voulez. Comme alternative, vous pouvez le gestionnaire de configuration:

  • Incluez tous les projets dans la solution.
  • Nommez le projet différemment, par exemple en fonction de l'OEM.
  • Pour chaque projet, définissez les configurations de publication et de débogage dans la solution
  • Dans "Build-> Configuration Manager", vous pouvez cocher ou décocher la colonne "Build" pour chaque configuration. Cochez "build" pour le projet concerné.
2

Je ne sais pas si vous construisez uniquement des projets C++ ou si vous construisez également des projets C #\VB, mais l'une des grandes choses à propos de Visual Studio est que tous les projets ne sont en réalité que des projets MSBuild. Si vous modifiez un projet dans un éditeur de texte, vous verrez qu'à la fin du projet, il importe un fichier .targets. Si vous recherchez et suivez les importations, vous constaterez que presque tous les projets VS importent Microsoft.Common.Targets. Microsoft.Common.Targets importe Custom.Before.Microsoft.Common.Targets. En utilisant cette importation, vous pouvez importer votre propre fichier de cibles avec vos propres actions personnalisées.

Par exemple, j'ai un fichier cible qui a une propriété commune définie dans tous les projets d'une solution et un événement de post-construction personnalisé qui traite à la fin de chaque projet.

En utilisant cette méthode d'extension et en créant des configurations personnalisées dans la solution en plus de la version standard\debug, vous devriez pouvoir créer une configuration de construction aussi complexe que vous le souhaitez.

1
mageos

(a) Cyrille donne une solution décente à ce que vous avez demandé. Une autre façon consiste à conserver vos paramètres modifiables en un seul endroit commun. Notez que cela ne fonctionnera pas pour les fichiers non msbuild comme * .sln et * .vcproj (jusqu'à VS 2010).

Fichiers de projet: ... $ (ChangeableDir)\foo.cs

Common.targets: ChangeThis ...

Cependant, je ne pense pas que ce soit une excellente façon de faire les choses. Si les différences entre ce que vous construisez sont de grandes fonctionnalités, vous devriez envisager de créer une branche dans votre système de contrôle de source. OTOH, si les différences sont mineures - par exemple des chaînes codées en dur - alors cela mène à votre deuxième question ...

(b) Le type de gestion des ressources que vous décrivez est essentiellement le même problème auquel sont confrontées les personnes localisant leur projet dans différentes langues. Heureusement, le support direct est intégré à Visual Studio depuis 2005. Consultez les questions précédentes telles que: Localisation dans Visual Studio 2008

0
Richard Berg