Erstellen identischer Quelldateien mit unterschiedlichen Optionen
Wenn Sie Projekte erstellen, kompilieren Sie häufig die gleichen Komponenten mit unterschiedlichen Buildoptionen. So können Sie, z.B. ein Debugbuild mit Symbolinformationen oder ein Releasebuild ohne Symbolversionen, aber mit aktivierten Optimierungen erstellen. Alternativ können Sie ein Projekt erstellen, das auf einer bestimmten Plattform wie x86 oder x64 ausgeführt wird. In allen diesen Fällen bleiben die meisten Buildoptionen gleich. Nur ein paar Optionen werden zur Steuerung der Buildkonfiguration geändert. Sie verwenden Eigenschaften und Bedingungen mit MSBuild, um die unterschiedlichen Buildkonfigurationen zu erstellen.
Verwenden von Eigenschaften zum Steuern von Buildeinstellungen
Das Element Property
definiert eine Variable, die in einer Projektdatei, z.B. den Speicherort eines temporären Ordners, mehrmals verwiesen wird oder um die Werte für Eigenschaften festzulegen, die in mehrere Konfigurationen (z.B. einem Debug- oder Releasebuild) verwendet werden. Weitere Informationen zu Eigenschaften finden Sie unter MSBuild Properties (MSBuild-Eigenschaften).
Sie können Eigenschaften verwenden, um die Konfiguration Ihres Builds zu ändern, ohne die Projektdatei zu ändern. Das Attribut Condition
des Elements Property
und PropertyGroup
hilft Ihnen beim Ändern der Eigenschaftenwerte. Weitere Informationen zu MSBuild-Bedingungen finden Sie unter Bedingungen.
So legen Sie eine Eigenschaftengruppe fest, die von einer anderen Eigenschaft abhängt
Verwenden Sie ein Attribut
Condition
im ElementPropertyGroup
, das ähnlich dem Folgenden ist:<PropertyGroup Condition="'$(Flavor)'=='DEBUG'"> <DebugType>full</DebugType> <Optimize>no</Optimize> </PropertyGroup>
So definieren Sie eine Eigenschaft, die von einer anderen Eigenschaft abhängt
Verwenden Sie ein Attribut
Condition
im ElementProperty
, das ähnlich dem Folgenden ist:<DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
Festlegen von Eigenschaften in der Befehlszeile
Nachdem die Projektdatei geschrieben wurde und mehrere Konfigurationen zulässt, müssen Sie die Möglichkeit haben, diese Konfigurationen zu ändern, wenn Sie Ihr Projekt erstellen. MSBuild bietet diese Möglichkeit, indem es ermöglicht wird, Eigenschaften mithilfe des Schalters -property oder -p in der Befehlszeile anzugeben.
So legen Sie eine Projekteigenschaft in der Befehlszeile fest
Verwenden Sie den Schalter -property mit der Eigenschaft und dem Eigenschaftswert. Beispiel:
msbuild file.proj -property:Flavor=Debug
oder
Msbuild file.proj -p:Flavor=Debug
So geben Sie mehr als eine Projekteigenschaft in der Befehlszeile an
Verwenden Sie mehrmals den Schalter -property oder -p mit der Eigenschaft und den Eigenschaftswerten, oder verwenden Sie einen Schalter -property bzw. -p und unterteilen mehrere Eigenschaft mithilfe von Semikolons (;). Beispiel:
msbuild file.proj -p:Flavor=Debug;Platform=x86
oder
msbuild file.proj -p:Flavor=Debug -p:Platform=x86
Umgebungsvariablen werden ebenfalls als Eigenschaften behandelt und automatisch von MSBuild integriert. Weitere Informationen zur Verwendung von Umgebungsvariablen finden Sie unter Vorgehensweise: Verwenden von Umgebungsvariablen in einem Build.
Der Wert der Eigenschaft, die in der Befehlszeile angegeben ist, hat Vorrang vor jedem Wert, dem in der Projektdatei der gleiche Wert zugewiesen wurde. Dieser Wert hat Vorrang vor dem Wert in einer Umgebungsvariable.
Sie können dieses Verhalten ändern, indem Sie das Attribut
TreatAsLocalProperty
in einem Projekttag verwenden. Der Eigenschaftswert, der auf der Befehlszeile angegeben wurde, hat für Eigenschaftsnamen, die mit diesem Attribut aufgeführt sind, kein Vorrang vor dem Wert in der Projektdatei. Sie finden ein Beispiel weiter unten in diesem Thema.
Beispiel 1
Das folgende Codebeispiel, das Projekt „Hello World“, enthält zwei neue Eigenschaftengruppen, die verwendet werden können, um ein Debugbuild und ein Releasebuild zu erstellen.
So erstellen Sie die Debugversion des Projekts:
msbuild consolehwcs1.proj -p:flavor=debug
So erstellen Sie die Verkaufsversion des Projekts:
msbuild consolehwcs1.proj -p:flavor=retail
<Project DefaultTargets = "Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Sets the default flavor if an environment variable called
Flavor is not set or specified on the command line -->
<PropertyGroup>
<Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
</PropertyGroup>
<!-- Define the DEBUG settings -->
<PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
<DebugType>full</DebugType>
<Optimize>no</Optimize>
</PropertyGroup>
<!-- Define the RETAIL settings -->
<PropertyGroup Condition="'$(Flavor)'=='RETAIL'">
<DebugType>pdbonly</DebugType>
<Optimize>yes</Optimize>
</PropertyGroup>
<!-- Set the application name as a property -->
<PropertyGroup>
<appname>HelloWorldCS</appname>
</PropertyGroup>
<!-- Specify the inputs by type and file name -->
<ItemGroup>
<CSFile Include = "consolehwcs1.cs"/>
</ItemGroup>
<Target Name = "Compile">
<!-- Run the Visual C# compilation using input files
of type CSFile -->
<CSC Sources = "@(CSFile)"
DebugType="$(DebugType)"
Optimize="$(Optimize)"
OutputAssembly="$(appname).exe" >
<!-- Set the OutputAssembly attribute of the CSC
task to the name of the executable file that is
created -->
<Output TaskParameter="OutputAssembly"
ItemName = "EXEFile" />
</CSC>
<!-- Log the file name of the output file -->
<Message Text="The output file is @(EXEFile)"/>
</Target>
</Project>
Beispiel 2
Das folgende Beispiel veranschaulicht, wie das TreatAsLocalProperty
-Attribut verwendet wird. Die Eigenschaft Color
hat den Wert Blue
in der Projektdatei und Green
in der Befehlszeile. Mit TreatAsLocalProperty="Color"
im Projekttag setzt die Befehlszeileneigenschaft (Green
) nicht die Eigenschaft außer Kraft, die in der Projektdatei definiert ist (Blue
).
Geben Sie zum Erstellen des Projekts den folgenden Befehl ein:
msbuild colortest.proj -t:go -property:Color=Green
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0" TreatAsLocalProperty="Color">
<PropertyGroup>
<Color>Blue</Color>
</PropertyGroup>
<Target Name="go">
<Message Text="Color: $(Color)" />
</Target>
</Project>
<!--
Output with TreatAsLocalProperty="Color" in project tag:
Color: Blue
Output without TreatAsLocalProperty="Color" in project tag:
Color: Green
-->