在msbuild和ClickOnce中使用版本信息

时间:2012-11-13 23:05:55

标签: c# msbuild clickonce

我有一个用于自动执行ClickOnce安装的msbuild脚本。在尝试将版本信息添加到发布目录时,尝试使用该版本构建路径字符串时出现错误。

<Target Name="GetVersion">
   <Message Text="Getting version info..."/>
   <GetAssemblyIdentity AssemblyFiles="@(GetVersionAssembly)">
      <Output TaskParameter="Assemblies"
              ItemName="GetVersionAssemblyInfo"/>
   </GetAssemblyIdentity>
   <Message Text="%(GetVersionAssemblyInfo.Version)..."/>
</Target>

<Target Name="CopyFilesToVirtualRoot" DependsOnTargets="PrepareClickOnceDeployment;DeleteVirtualRootFiles;GetVersion">
   <Message Text="Copying files to $(ClickOnceVirtualRootDir)..."/>
   <Copy  SourceFiles="@(ClickOnceInstallationFiles)"
         DestinationFiles="@(ClickOnceInstallationFiles->'$(ClickOnceVirtualRootDir)\%(Filename)%(Extension)')"/>
   <Copy  SourceFiles="@(AppManifestContents)"
           DestinationFiles="@(AppManifestContents->'$(ClickOnceVirtualRootDir)\Application Files\Version_%(GetVersionAssemblyInfo.Version)\%(RecursiveDir)%(Filename)%(Extension).deploy')"/>
</Target>

运行时出现以下错误

error MSB4043: The item metadata reference "%(GetVersionAssemblyInfo.Version)" is invalid
because it is qualified with an item name. Item metadata referenced in transforms do not 
need to be qualified, because the item name is automatically deduced from the items being
transformed. Change "%(GetVersionAssemblyInfo.Version)" to "%(Version)".

如果我将其更改为%(版本),我得到的只是一个空白。

1 个答案:

答案 0 :(得分:2)

尝试使用目标批处理,以便MSBuild每个程序集版本运行一次CopyFilesToVirtualRoot目标。然后,您可以将版本填充到属性中,并在项目转换中引用它。

<Target Name="CopyFilesToVirtualRoot"
    DependsOnTargets="PrepareClickOnceDeployment;DeleteVirtualRootFiles;GetVersion"
    Outputs="%(GetVersionAssemblyInfo.Version)">
    <PropertyGroup>
        <AppVersion>%(GetVersionAssemblyInfo.Version)</AppVersion>
    </PropertyGroup>
    <Message Text="Copying files to $(ClickOnceVirtualRootDir)..."/>
    <Copy
        SourceFiles="@(ClickOnceInstallationFiles)"
        DestinationFiles="@(ClickOnceInstallationFiles->'$(ClickOnceVirtualRootDir)\%(Filename)%(Extension)')"/>
    <Copy
        SourceFiles="@(AppManifestContents)"
        DestinationFiles="@(AppManifestContents->'$(ClickOnceVirtualRootDir)\Application Files\Version_$(AppVersion)\%(RecursiveDir)%(Filename)%(Extension).deploy')"/>
</Target>

我想这很奇怪,因为如果你的任何程序集有不同的版本,你将拥有清单内容的多个副本。

也就是说,您可以使用项目元数据创建属性。

<Target Name="CopyFilesToVirtualRoot"
    DependsOnTargets="PrepareClickOnceDeployment;DeleteVirtualRootFiles;GetVersion"
    Outputs="%(GetVersionAssemblyInfo.Version)">
    <CreateProperty
        Value="%(GetVersionAssemblyInfo.Version)">
        <Output PropertyName="AppVersion" TaskParameter="Value" />
    </CreateProperty>
    <Message Text="Copying files to $(ClickOnceVirtualRootDir)..."/>
    <Copy
        SourceFiles="@(ClickOnceInstallationFiles)"
        DestinationFiles="@(ClickOnceInstallationFiles->'$(ClickOnceVirtualRootDir)\%(Filename)%(Extension)')"/>
    <Copy
        SourceFiles="@(AppManifestContents)"
        DestinationFiles="@(AppManifestContents->'$(ClickOnceVirtualRootDir)\Application Files\Version_$(AppVersion)\%(RecursiveDir)%(Filename)%(Extension).deploy')"/>
</Target>

我认为要么能得到你所需要的东西。