2

$(Foo)文字列値を返す何らかの関数の結果として定義されたプロパティがあるとしましょう$(Bar)$(Foo)の値に拡張されるように、何らかの方法で拡張することは可能$(Bar)ですか?

与えられたサンプルプロジェクト:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Bar>Bar Value</Bar>
        <Foo>$([System.String]::Concat("$(","Bar",")"))</Foo>
        <Baz>$(Foo)</Baz>
        <Qux>$(Bar)</Qux>
    </PropertyGroup>
    <Target Name="Test">
        <Message Text="Foo == $(Foo)" />
        <Message Text="Baz == $(Baz)" />
        <Message Text="Qux == $(Qux)" />
    </Target>
</Project>

ここに私が持っているものがあります:

S:\>msbuild Test.proj /t:Test /nologo                 
Build started 18.09.2013 17:52:14.                    
Project "S:\Test.proj" on node 1 (Test target(s)).    
Test:                                                 
  Foo == $(Bar)                                       
  Baz == $(Bar)                                       
  Qux == Bar Value                                    
Done Building Project "S:\Test.proj" (Test target(s)).


Build succeeded.                                      
    0 Warning(s)                                      
    0 Error(s)                                        

そのため、 に直接$(Qux)定義されている$(Bar)は正しく展開されますが、$(Foo)とはそうで$(Baz)はありません。それらも拡張することは可能ですか?

S:\>msbuild /version                                     
Microsoft (R) Build Engine version 4.0.30319.17929       
[Microsoft .NET Framework, version 4.0.30319.18052]      
Copyright (C) Microsoft Corporation. All rights reserved.

4.0.30319.17929                                          
4

1 に答える 1

8

msbuild の無効な構文である $($(Foo)) のようなものをシミュレートしたいとします。ただし、アイテムを使用し、ターゲットにアイテムを動的に作成することで、この動作をシミュレートできます。プロパティとアイテムの評価順序のため、 「グローバルスコープ」では実行できません。

したがって、いくつかのターゲットでそれを行う必要があります。以下は、InitialTargets を使用してプロパティを設定するサンプルです。

<?xml version="1.0" encoding="utf-8"?>
<Project InitialTargets="MyPropertiesSetup" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
    <Bar>Bar Value</Bar>
    <!-- A value of Foo property specifies the name of the property it takes value from. -->
    <Foo>Bar</Foo>
    <Baz></Baz>
    <Qux>$(Bar)</Qux>
</PropertyGroup>

<Target Name="Test">
    <Message Text="Foo == $(Foo)" />
    <Message Text="Baz == $(Baz)" />
    <Message Text="Qux == $(Qux)" />
</Target>

<Target Name="MyPropertiesSetup">
    <ItemGroup>
        <_Foo Include="$(Foo)" />
        <_Baz Include="%(_Foo.Identity)" />
    </ItemGroup>
    <PropertyGroup>
        <Foo>$(%(_Foo.Identity))</Foo>
        <Baz>$(%(_Baz.Identity))</Baz>
    </PropertyGroup>
</Target>

</Project>

プロパティの代わりに値に項目を使用できる場合は、より洗練された方法があります ( MSBuild Trickery #68 - @($(CanYouDoThis)):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
    <Foo>Bar</Foo>
    <Foo2>Bar2</Foo2>
</PropertyGroup>

<ItemGroup>
   <Bar Include="Bar Value" />
   <Bar2 Include="Bar2 Value" />
</ItemGroup>

<Target Name="Test">
    <Message Text="Foo == '@($(Foo))'" />
    <Message Text="Foo2 == '@($(Foo2))'" />
</Target>

</Project>
于 2013-09-22T10:54:36.113 に答える