2

我有一个用于自动安装 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)".

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

4

1 回答 1

2

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

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

我认为两者都可以为您提供所需的东西。

于 2012-11-13T23:37:45.230 回答