MSBuild |属性值在设置后为空 背景

MSBuild |属性值在设置后为空 背景,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,我对MSBUild非常陌生,我正在尝试编写带有生成后事件的MSBUild脚本。在生成后事件之前,我想获得一些版本信息(版本本身,然后是版本的每个部分) 问题 我可以成功获取版本,但是当尝试基于版本的部分设置属性时,属性为空 代码 $(PostBuildEventDependsOn); 构建后宏; 如果$(ConfigurationName)=发布( //这显示了正确的版本 回显程序集版本为:@(版本号) //这是空白的 回显主版本为:$(主版本) ) $([System.Version]::解

我对MSBUild非常陌生,我正在尝试编写带有生成后事件的MSBUild脚本。在生成后事件之前,我想获得一些版本信息(版本本身,然后是版本的每个部分)

问题 我可以成功获取版本,但是当尝试基于版本的部分设置属性时,属性为空

代码

$(PostBuildEventDependsOn);
构建后宏;
如果$(ConfigurationName)=发布(
//这显示了正确的版本
回显程序集版本为:@(版本号)
//这是空白的
回显主版本为:$(主版本)
)
$([System.Version]::解析(%(Targets.Version)).Major)

这是一个经典的求值顺序问题;我不知道文档中的哪条规则明确指出了这一点,但关键是PostBuildEvent是一个全局属性,其中使用的属性在执行目标和连续评估/扩展这些目标中的属性之前进行评估/扩展,而对于项目来说,这略有不同,正如您所注意到的。解决这个问题的一个简单方法是:使用
并在该目标中使用例如
模拟您的PostBuildEvent。顺便说一句,您在描述问题和代码方面做得很好,但没有提到实际的问题:@stijn我知道您的评论很老,但我以前没有看到关于没有实际问题的评论。这个问题是不言自明的,列在问题部分。通常,描述问题并询问“我如何解决我描述的问题”是多余的。这是一个经典的评估顺序问题;我不知道文档中的哪条规则明确指出了这一点,但关键是PostBuildEvent是一个全局属性,其中使用的属性在执行目标和连续评估/扩展这些目标中的属性之前进行评估/扩展,而对于项目来说,这略有不同,正如您所注意到的。解决这个问题的一个简单方法是:使用
并在该目标中使用例如
模拟您的PostBuildEvent。顺便说一句,您在描述问题和代码方面做得很好,但没有提到实际的问题:@stijn我知道您的评论很老,但我以前没有看到关于没有实际问题的评论。这个问题是不言自明的,列在问题部分。通常,描述问题并询问“我如何解决我描述的问题”是多余的
<PropertyGroup>
    <PostBuildEventDependsOn>
        $(PostBuildEventDependsOn);
        PostBuildMacros;
    </PostBuildEventDependsOn>

    <PostBuildEvent>
        if $(ConfigurationName) == Release (
            // This shows the correct version
            echo THE ASSEMBLY VERSION IS: @(VersionNumber)

            // This is blank
            echo THE MAJOR VERSION IS: $(MajorVersion)
        )
    </PostBuildEvent>
</PropertyGroup>

<Target Name="PostBuildMacros">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="Targets" />
    </GetAssemblyIdentity>

    <ItemGroup>
        <VersionNumber Include="@(Targets->'%(Version)')" />
    </ItemGroup>

    <PropertyGroup>
        <MajorVersion>$([System.Version]::Parse(%(Targets.Version)).Major)</MajorVersion>
    </PropertyGroup>
</Target>