如何在 MSBuild 中覆盖发布目标的 ApplicationVersion

How to override ApplicationVersion for Publish target in MSBuild

是否可以在 ClickOnce 上下文中覆盖发布目标的 ApplicationVersion?

我创建了这样的自定义构建:

<PropertyGroup>
    ...
    <ApplicationRevision>0</ApplicationRevision>
    <ApplicationVersion>1.0.0.0</ApplicationVersion>
    ...
    <CustomBuildDependsOn>
        Build;
        CustomBeforePublish;
        PublishOnly;
    </CustomBuildDependsOn>
</PropertyGroup>
<Target Name="CustomBuild" DependsOnTargets="$(CustomBuildDependsOn)" />
<Target Name="CustomBeforePublish">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <PropertyGroup>
        <PublishDir>$(OutDir)\publish$(TargetName)\</PublishDir>
        <ApplicationVersion>%(CurrentAssembly.Version)</ApplicationVersion>
    </PropertyGroup>
    <Message Text="BeforePublish PublishDir = $(PublishDir)" />
    <Message Text="BeforePublish ApplicationVersion = $(ApplicationVersion)" />
</Target>

属性 PublishDir 被 PublishOnly 目标正确覆盖和使用,而 属性 ApplicationVersion 不正确:应用程序清单始终为版本 1.0.0.0。 并且日志显示:

BeforePublish ApplicationVersion = 3.5.0.51263

将 ApplicationVersion 传递给目标 PublishOnly 或 Publish 的正确方法是什么?

我找到的唯一方法是使用 属性 重新启动 MSbuild :

<PropertyGroup>
    ...
    <ApplicationRevision>0</ApplicationRevision>
    <ApplicationVersion>1.0.0.0</ApplicationVersion>
    ...
    <CustomBuildDependsOn>
        Build;<!--First build to get the version-->
        CustomPublish;<!--Rebuild and publish with the correct version-->
    </CustomBuildDependsOn>
</PropertyGroup>
<Target Name="CustomBuild" DependsOnTargets="$(CustomBuildDependsOn)" />
<Target Name="CustomPublish">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <PropertyGroup>
        <PublishDir>$(OutDir)\publish$(TargetName)\</PublishDir>
        <ApplicationVersion>%(CurrentAssembly.Version)</ApplicationVersion>
    </PropertyGroup>
    <Message Text="CustomPublish PublishDir = $(PublishDir)" />
    <Message Text="CustomPublish ApplicationVersion = $(ApplicationVersion)" />
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="Clean;Publish" Properties="PublishDir=$(PublishDir);ApplicationVersion=$(ApplicationVersion);">
</MSBuild>

我不确定这是正确的方法,但它有效