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