2012-11-13 2 views
2

ClickOnce 설치 자동화에 사용되는 msbuild 스크립트가 있습니다. publish 디렉토리에 버전 정보를 추가하려고 시도하는 동안 해당 버전을 사용하여 경로 문자열을 작성하려고 할 때 오류가 발생합니다. 실행할 때 내가 얻을 모두가 비어 % (버전)로 변경하는 경우msbuild 및 ClickOnce의 버전 정보 사용

<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)". 

를 얻을.

답변

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> 

나는 여러분에게 필요한 것을 얻을 것이라고 생각합니다.

+0

두 번째 코드를 시도해 보았습니다. – aggaton