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

ターゲットバッチ処理を使用して、MSBuildがCopyFilesToVirtualRootアセンブリバージョンごとに1回ターゲットを実行するようにしてください。次に、バージョンをプロパティに詰め込み、アイテム変換で参照できます。

<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 に答える