Как переопределить ApplicationVersion для цели публикации в MSBuild

Это способ переопределить ApplicationVersion для цели публикации в контексте ClickOnce?

Я создал пользовательскую сборку, как это:

<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?

1 ответ

Решение

Единственный способ сделать это - перезапустить 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>

Я не уверен, что это правильный путь, но это работает

Другие вопросы по тегам