33 Stimmen

Makros/Umgebungsvariable in .sln- und .vcproj-Dateien für Visual Studio

Ich habe zwei ähnliche Probleme:

a) Ich habe eine Lösung, die mehrere Projekte umfasst, und ich möchte den Speicherort der Projekte einfach wechseln können, indem ich eine Umgebungsvariable/Makro einstelle. Als Beispiel kann dieses Projekt in \SolutionDir\Dir1\ o \SolutionDir\Dir2\ Ich möchte also angeben, dass sie sich in \SolutionDir\ $(Var) und setzen Sie einfach die Variable.

Gibt es eine Build in Visual Studio Weg, es zu tun?

Ich weiß derzeit nur zwei Lösungen - bearbeiten .sln-Datei manuell/programmatisch, um dieses Projekt zu finden und den richtigen Pfad festlegen.

Ich konnte die Umgebungsvariable nicht in der .sln-Datei verwenden.

b) Ich habe ein Projekt, das Ressourcen-Dateien (.rc und .h) enthält. Ich möchte in der Lage sein, ihren Speicherort durch eine andere Umgebungsvariable oder ein Makro festzulegen.

Etwas wie \ProjectDir\ $(Var2) \resource.rc

Ich habe einige vielversprechende Informationen zu Eigenschaftsblättern gefunden, aber Visual Studio erweitert Makros nicht, wenn ich sie im Datei-Tag in der .vcproj verwende.

Ich danke Ihnen für jede Idee, wie dieses Problem zu lösen ist.

Grüß Gott, Victor

23voto

Rom Punkte 4053

Verwenden Sie einfach die Umgebungsvariable in dem entsprechenden Feld:

OutputDirectory="$(MyEnvVariableName)\Bin"

Ein Trick ist, dass Sie die Visual Studio IDE jedes Mal neu starten müssen, wenn Sie die Variable ändern.

Es gibt einen MSDN-Artikel zu diesem Thema: Wie man: Umgebungsvariablen in einem Build verwenden

21voto

Ich glaube, ich habe das gleiche Ziel wie Sie: Ich möchte Umgebungsvariablen verwenden, um einige Projekte in einer Lösungsdatei (.sln) zu finden und einige Umgebungsvariablen verwenden, um einige Dateien innerhalb meiner Projekte zu finden.

Ich habe einen Weg gefunden, das zu tun und es funktioniert gut für mich (mit Visual Studio 2005): - Bearbeiten Sie die .sln-Datei mit einem Texteditor und verwenden Sie Umgebungsvariablen mit der folgenden Syntax %MyEnvironmentVariable% - Bearbeiten Sie die .vcproj-Dateien und ersetzen Sie den Pfad zu den gewünschten Dateien durch einige Variablen mit der folgenden Syntax $(MyEnvironmentVariable).

Ich hoffe, es hilft... Cyrille

2voto

Dani van der Meer Punkte 6069

Der beste Weg, das zu erreichen, was Sie in b) beschreiben, ist die Verwendung von Eigenschaftsblättern. Sehen Sie sich auch diesen sehr ähnliche Frage .

Ich habe einige vielversprechende Informationen gefunden auf Eigenschaftsblättern, aber Visual Studio aber Visual Studio expandiert keine Makros, wenn ich sie im Datei-Tag in der .vcproj.

Ich bin nicht sicher, welche Version von VS Sie verwenden. Mit VS2008 können Sie zum Beispiel ein Include-Verzeichnis wie folgt definieren: "$(OpenCVInclude) \cxcore\include ". Ich verwende es ständig. OpenCVInclude ist ein Makro, das in einem Eigenschaftsblatt definiert ist.

Zu Frage a): Ich denke, es gibt keinen "sauberen" Weg, das zu tun, was Sie wollen. Als Alternative könnten Sie den Konfigurationsmanager verwenden:

  • Nehmen Sie alle Projekte in die Lösung auf.
  • Benennen Sie das Projekt anders, z. B. nach dem OEM.
  • Definieren Sie für jedes Projekt die Freigabe- und Debug-Konfigurationen in der Lösung
  • Unter "Build->Configuration Manager" können Sie die Spalte "Build" für jede Konfiguration aktivieren oder deaktivieren. Markieren Sie "Build" für das entsprechende Projekt.

1voto

mageos Punkte 1186

Ich bin nicht sicher, ob Sie nur C++-Projekte oder auch C#-Projekte erstellen. \VB Projekte, aber eine der großartigen Eigenschaften von Visual Studio ist, dass alle Projekte eigentlich nur MSBuild-Projekte sind. Wenn Sie ein Projekt in einem Texteditor bearbeiten, werden Sie sehen, dass am Ende des Projekts eine .targets-Datei importiert wird. Wenn Sie die Importe aufspüren und verfolgen, werden Sie feststellen, dass fast alle VS-Projekte Microsoft.Common.Targets importieren. Microsoft.Common.Targets importiert Custom.Before.Microsoft.Common.Targets. Mit diesem Import können Sie Ihre eigene Targets-Datei mit Ihren eigenen benutzerdefinierten Aktionen importieren.

Ich habe zum Beispiel eine Zieldatei, die eine gemeinsame Eigenschaft hat, die für alle Projekte in einer Lösung definiert ist, und ein benutzerdefiniertes Post-Build-Ereignis, das am Ende eines jeden Projektaufbaus verarbeitet wird.

Mit dieser Erweiterungsmethode und durch die Erstellung von benutzerdefinierten Konfigurationen in der Lösung neben der Standardversion \debug sollten Sie in der Lage sein, so komplexe Build-Konfigurationen zu erstellen, wie Sie sie benötigen.

0voto

Richard Berg Punkte 20483

(a) Cyrille hat eine gute Lösung für Ihre Frage gefunden. Eine andere Möglichkeit besteht darin, Ihre veränderbaren Einstellungen an einem gemeinsamen Ort zu speichern. Beachten Sie, dass dies nicht für Nicht-msbuild-Dateien wie *.sln und *.vcproj (bis VS 2010) funktionieren wird.

Projekt-Dateien: ... $(ChangeableDir) \foo.cs

Gemeinsame.Ziele: ChangeThis ...

Ich glaube jedoch nicht, dass dies eine gute Vorgehensweise ist. Wenn die Unterschiede zwischen dem, was Sie bauen, große Teile der Funktionalität sind, sollten Sie in Erwägung ziehen, einen Zweig in Ihrem Versionskontrollsystem zu erstellen. OTOH, wenn die Unterschiede geringfügig sind -- z.B. hartkodierte Zeichenketten -- dann führt das zu Ihrer zweiten Frage...

(b) Die Art der Ressourcenverwaltung, die Sie beschreiben, ist im Wesentlichen dasselbe Problem, mit dem Leute konfrontiert sind, die ihr Projekt in verschiedene Sprachen lokalisieren. Glücklicherweise ist die direkte Unterstützung in Visual Studio seit 2005 integriert. Sehen Sie sich frühere Fragen an wie: Lokalisierung in Visual Studio 2008

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X