展开包含其他属性名称的MSBuild属性

展开包含其他属性名称的MSBuild属性,msbuild,Msbuild,假设我有一个属性$(Foo),它被定义为某个函数的结果,返回字符串值$(Bar)。是否可以以某种方式将其展开,以便将$(Foo)的值展开为$(Bar) 给定的示例项目: <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Bar>

假设我有一个属性
$(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>
因此,直接定义为
$(Bar)
$(Qux)
,可以正确展开,但
$(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                                          

您希望模拟类似于$($(Foo))的内容,这是msbuild的无效语法。但您可以通过使用项和在目标中动态创建项来模拟此行为。您不能在“全局范围”中执行此操作,因为

所以你必须在一些目标中这样做。 下面是通过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>

棒值
酒吧
$(巴)
$((_-Foo.Identity))
$((_Baz.Identity))
如果可以将项用于值而不是属性,则有一种更优雅的方法(#68-@($(CanYouDoThis)):


酒吧
Bar2
<?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>
<?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>