次の方法で共有


MSBuild プロパティ

プロパティは、ビルドの構成に使用できる名前と値のペアです。 プロパティは、タスクに値を渡したり、条件を評価したり、プロジェクト ファイル全体で参照される値を格納したりするのに役立ちます。

プロジェクト ファイルでプロパティを定義および参照する

プロパティは、PropertyGroup 要素の子としてプロパティの名前を持つ要素を作成することによって宣言されます。 たとえば、次の XML では、BuildDirの値を持つBuildという名前のプロパティが作成されます。

<PropertyGroup>
    <BuildDir>Build</BuildDir>
</PropertyGroup>

有効なプロパティ名は、大文字または小文字の ASCII 文字またはアンダースコア (_)で始まります。有効な後続の文字には、英数字 (ASCII 文字または数字)、アンダースコア、ハイフン (-) が含まれます。

プロジェクト ファイル全体で、プロパティは構文 $(<PropertyName>)を使用して参照されます。 たとえば、前の例のプロパティは、 $(BuildDir)を使用して参照されます。

プロパティの値は、プロパティを再定義することで変更できます。 BuildDirプロパティには、次の XML を使用して新しい値を指定できます。

<PropertyGroup>
    <BuildDir>Alternate</BuildDir>
</PropertyGroup>

プロパティは、プロジェクト ファイルに表示される順序で評価されます。 BuildDirの新しい値は、古い値が割り当てられた後に宣言する必要があります。

予約済みプロパティ

MSBuild は、プロジェクト ファイルと MSBuild バイナリに関する情報を格納するために、いくつかのプロパティ名を予約します。 これらのプロパティは、他のプロパティと同様に$表記を使用して参照されます。 たとえば、$(MSBuildProjectFile) は、ファイル名拡張子を含むプロジェクト ファイルの完全なファイル名を返します。

詳しくは、「方法: プロジェクト ファイルの名前または場所を参照する」と「MSBuild の予約済みおよび既知のプロパティ」をご覧ください。

MSBuild の内部プロパティ

アンダースコア (_) で始まる標準インポート ファイルで定義されているプロパティは MSBuild に対してプライベートであり、ユーザー コードでは読み取り、リセット、またはオーバーライドしないでください。

環境のプロパティ

プロジェクト ファイル内の環境変数は、予約済みプロパティを参照するのと同じように参照できます。 たとえば、プロジェクト ファイルで PATH 環境変数を使用するには、$(Path) を使用します。 プロジェクトに環境プロパティと同じ名前のプロパティ定義が含まれている場合、プロジェクト内のプロパティは環境変数の値をオーバーライドします。

各 MSBuild プロジェクトには分離された環境ブロックがあります。独自のブロックへの読み取りと書き込みのみが表示されます。 MSBuild は、プロジェクト ファイルが評価またはビルドされる前に、プロパティ コレクションを初期化するときにのみ環境変数を読み取ります。 その後、環境プロパティは静的です。つまり、生成された各ツールは同じ名前と値で始まります。

生成されたツール内から環境変数の現在の値を取得するには、 プロパティ関数 System.Environment.GetEnvironmentVariable を使用します。 ただし、推奨される方法は、タスク パラメーター EnvironmentVariablesを使用することです。 この文字列配列に設定された環境プロパティは、システム環境変数に影響を与えることなく、生成されたツールに渡すことができます。

ヒント

すべての環境変数が初期プロパティとして読み込まれるわけではありません。 名前が有効な MSBuild プロパティ名ではない環境変数 ("386" など) は無視されます。

詳細については、「方法: ビルドで環境変数を使用する」を参照してください。

レジストリのプロパティ

システム レジストリの値は、次の構文を使用して読み取ることができます。ここで、 Hive はレジストリ ハイブ ( HKEY_LOCAL_MACHINEなど)、 MyKey はキー名、 MySubKey はサブキー名、 Value はサブキーの値です。

$(registry:Hive\MyKey\MySubKey@Value)

既定のサブキー値を取得するには、 Valueを省略します。

$(registry:Hive\MyKey\MySubKey)

このレジストリ値を使用して、ビルド プロパティを初期化できます。 たとえば、Visual Studio Web ブラウザーのホーム ページを表すビルド プロパティを作成するには、次のコードを使用します。

<PropertyGroup>
  <VisualStudioWebBrowserHomePage>
    $(registry:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\WebBrowser@HomePage)
  </VisualStudioWebBrowserHomePage>
<PropertyGroup>

Warnung

.NET SDK バージョンの MSBuild (dotnet build) では、レジストリ プロパティはサポートされていません。

実行中にプロパティを作成する

Target要素の外部に配置されたプロパティには、ビルドの評価フェーズ中に値が割り当てられます。 後続の実行フェーズでは、プロパティを次のように作成または変更できます。

  • プロパティは、任意のタスクによって出力できます。 プロパティを出力するには、Task 要素に、属性を持つ子 PropertyName 要素が必要です。

  • プロパティは、 CreateProperty タスクによって生成できます。 この使用は非推奨です。

  • Target 要素には、プロパティ宣言を含む PropertyGroup 要素を含めることができます。

グローバル プロパティ

MSBuild では、-property (または -p) スイッチを使用してコマンド ラインでプロパティを設定できます。 これらのグローバル プロパティ値は、プロジェクト ファイルで設定されているプロパティ値をオーバーライドします。 これには環境プロパティが含まれますが、変更できない予約済みプロパティは含まれません。

次の例では、グローバル Configuration プロパティを DEBUG に設定します。

msbuild.exe MyProj.proj -p:Configuration=DEBUG

MSBuild タスクの Properties 属性を使用して、マルチプロジェクト ビルドの子プロジェクトのグローバル プロパティを設定または変更することもできます。 MSBuild タスクの RemoveProperties 属性を使用して転送しないプロパティの一覧を指定しない限り、グローバル プロパティも子プロジェクトに転送されます。 詳細については、 MSBuild タスクを参照してください。

ローカル プロパティ

プロジェクトでは、ローカル プロパティをリセットできます。 グローバル プロパティを使用できません。 -p オプションを使用してコマンド ラインからローカル プロパティを設定すると、プロジェクト ファイルの設定がコマンド ラインよりも優先されます。

プロジェクト タグで TreatAsLocalProperty 属性を使用して、ローカル プロパティを指定します。

次のコードは、2 つのプロパティがローカルであることを指定します。

<Project Sdk="Microsoft.Net.Sdk" TreatAsLocalProperty="Prop1;Prop2">

ローカル プロパティは、マルチプロジェクト ビルドの子プロジェクトには転送されません。 -p オプションを使用してコマンド ラインで値を指定した場合、子プロジェクトには親プロジェクトで変更されたローカル値ではなくグローバル プロパティの値が与えられますが、子プロジェクト (またはそのインポート) も独自のTreatAsLocalPropertyで変更できます。

ローカル プロパティを使用した例

次のコード例は、 TreatAsLocalPropertyの効果を示しています。

<!-- test1.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
    <PropertyGroup>
        <TreatedAsLocalProp>LocalOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <Target Name="Go">
        <MSBuild Projects="$(MSBuildThisFileDirectory)\test2.proj" Targets="Go2" Properties="Inner=true" />
    </Target>

    <Target Name="Go2" BeforeTargets="Go">
        <Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
    </Target>
</Project>
<!-- test2.proj -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
    <Target Name="Go2">
        <Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
    </Target>
</Project>

test1.proj コマンド ラインをビルドし、グローバル値TreatedAsLocalPropertyGlobalOverrideValue指定するとします。

dotnet msbuild .\test1.proj -p:TreatedAsLocalProp=GlobalOverrideValue

出力は次のとおりです。

test1.proj(11,9): warning : TreatedAsLocalProp(test): LocalOverrideValue
test2.proj(3,9): warning : TreatedAsLocalProp(test2): GlobalOverrideValue

子プロジェクトはグローバル値を継承しますが、親プロジェクトはローカルに設定されたプロパティを使用します。

ローカル プロパティとインポート

インポートしたプロジェクト TreatAsLocalProperty 属性を使用する場合、プロパティが取得する値を考慮する際に順序が重要になります。

次のコード例は、インポートされたプロジェクトに対する TreatAsLocalProperty の影響を示しています。

<!-- importer.proj -->
<Project>
    <PropertyGroup>
        <TreatedAsLocalProp>FirstOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <Import Project="import.props" />

    <PropertyGroup>
        <TreatedAsLocalProp Condition=" '$(TrySecondOverride)' == 'true' ">SecondOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <Target Name="Go">
        <Warning Text="TreatedAsLocalProp($(MSBuildThisFileName)): $(TreatedAsLocalProp)" />
    </Target>
</Project>
<!-- import.props -->
<Project TreatAsLocalProperty="TreatedAsLocalProp">
    <PropertyGroup>
        <TreatedAsLocalProp>ImportOverrideValue</TreatedAsLocalProp>
    </PropertyGroup>

    <!-- Here, TreatedAsLocalProp has the value "ImportOverrideValue"-->
</Project>

importer.projを構築し、次のようにTreatedAsLocalPropのグローバル値を設定するとします。

dotnet msbuild .\importer.proj -p:TreatedAsLocalProp=GlobalOverrideValue

出力は次のようになります。

importer.proj(9,9): warning : TreatedAsLocalProp(importer.proj): ImportOverrideValue

次に、TrySecondOverrideするプロパティ trueを使用してビルドするとします。

dotnet msbuild .\importer.proj -p:TreatedAsLocalProp=GlobalOverrideValue -p:TrySecondOverride=true

出力は次のようになります。

importer.proj(13,9): warning : TreatedAsLocalProp(importer.proj): SecondOverrideValue

この例では、インポートされたファイル内だけでなく、属性が使用されたインポートされたプロジェクトのTreatAsLocalPropertyに、プロパティがローカルとして扱われることを示しています。 プロパティの値はグローバルオーバーライド値の影響を受けますが、が使用されるインポートされたプロジェクトのTreatAsLocalPropertyにのみ影響を受けます。

詳細については、「 Project 要素 (MSBuild) 」および「 方法: 異なるオプションで同じソース ファイルをビルドする」を参照してください。

プロパティ関数

.NET Framework バージョン 4 以降では、プロパティ関数を使用して MSBuild スクリプトを評価できます。 MSBuild タスクを使用せずに、システム時刻の読み取り、文字列の比較、正規表現の照合、ビルド スクリプト内での他の多くのアクションの実行を行うことができます。

文字列 (インスタンス) メソッドを使用して任意のプロパティ値を操作できます。また、多くのシステム クラスの静的メソッドを呼び出すことができます。 たとえば、次のようにビルド プロパティを今日の日付に設定できます。

<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>

詳細とプロパティ関数の一覧については、「 プロパティ関数」を参照してください。

プロパティに XML を格納する

プロパティには任意の XML を含めることができます。これは、タスクに値を渡したり、ログ情報を表示したりするのに役立ちます。 次の例は、XML およびその他のプロパティ参照を含む値を持つ ConfigTemplate プロパティを示しています。 MSBuild は、それぞれのプロパティ値を使用してプロパティ参照を置き換えます。 プロパティ値は、表示される順序で割り当てられます。 したがって、この例では、 $(MySupportedVersion)$(MyRequiredVersion)、および $(MySafeMode) が既に定義されている必要があります。

<PropertyGroup>
    <ConfigTemplate>
        <Configuration>
            <Startup>
                <SupportedRuntime
                    ImageVersion="$(MySupportedVersion)"
                    Version="$(MySupportedVersion)"/>
                <RequiredRuntime
                    ImageVersion="$(MyRequiredVersion)"
                    Version="$(MyRequiredVersion)"
                    SafeMode="$(MySafeMode)"/>
            </Startup>
        </Configuration>
    </ConfigTemplate>
</PropertyGroup>