咨询MSBUILD中PublishProfile在ClickOnce发布时的加载阶段
PublishProfile的加载时机
MSBuild处理ClickOnce发布时,各类配置文件的加载顺序是固定的,明确顺序才能理清属性覆盖逻辑:
- 先加载系统级全局props文件(如
Microsoft.Common.props) - 从项目目录的上级到本级,依次加载所有
Directory.Build.props - 加载项目本身的
.csproj/.vbproj文件 - 加载项目文件中导入的发布基础props(如
Microsoft.VisualStudio.Publish.Default.props) - 加载指定的PublishProfile(
.pubxml)文件——这一步发生在项目文件之后,Directory.Build.targets之前 - 加载系统级全局targets文件(如
Microsoft.Common.targets) - 从项目目录的上级到本级,依次加载所有
Directory.Build.targets
你在binlog中看到的“PublishProfile先加载”是误解,实际Directory.Build.props早于PublishProfile加载,但PublishProfile的加载时机在项目文件之后,它里面的属性设置会覆盖Directory.Build.props中的同名属性。
解决ApplicationVersion赋值不生效的问题
你在Directory.Build.props中设置<ApplicationVersion>$(AssemblyFileVersion)</ApplicationVersion>未生效,核心原因是PublishProfile中的同名属性覆盖了props里的设置,或者AssemblyFileVersion的求值时机不对。可以通过以下方式解决:
方法1:移除PublishProfile中的硬编码ApplicationVersion
打开ClickOnceProfile.pubxml,检查是否存在<ApplicationVersion>节点。如果有,直接删除该节点,MSBuild就会自动使用Directory.Build.props中定义的ApplicationVersion值。
方法2:在PublishProfile中引用AssemblyFileVersion
如果需要保留PublishProfile中的ApplicationVersion配置,将其修改为引用AssemblyFileVersion变量:
<PropertyGroup> <ApplicationVersion>$(AssemblyFileVersion)</ApplicationVersion> </PropertyGroup>
方法3:在Directory.Build.targets中设置ApplicationVersion
Directory.Build.targets在PublishProfile之后加载,这里的属性设置会覆盖PublishProfile中的值。在Directory.Build.targets中添加:
<PropertyGroup> <ApplicationVersion>$(AssemblyFileVersion)</ApplicationVersion> </PropertyGroup>
额外注意:确保AssemblyFileVersion已正确定义
无论用哪种方法,都要确保AssemblyFileVersion在Directory.Build.props中已正确定义,比如:
<PropertyGroup> <AssemblyFileVersion>2.0.1.5</AssemblyFileVersion> <!-- 也可以从外部版本文件读取: --> <!-- <AssemblyFileVersion>$([System.IO.File]::ReadAllText('Version.txt').Trim())</AssemblyFileVersion> --> </PropertyGroup>
内容的提问来源于stack exchange,提问作者msedi

