2016-11-24 1 views
0

인스턴스 변환을 사용하여 여러 인스턴스를 구성한 Wix wxs 파일이 있습니다.Wix 인스턴스 변형 동적 ProductName 및 Id

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <?define WixDemoWPFApp_TargetDir=$(var.WixDemoWPFApp.TargetDir)?> 
    <Product Id="*" Name="WixSetupWPFApp" Language="1033" Version="2.0.0.0" Manufacturer="Licence Owner" 
     UpgradeCode="ae4af8f5-9287-408a-b7bd-d2fdb89a8da7"> 
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

    <MajorUpgrade DowngradeErrorMessage="Downgrade not allowed" /> 
    <MediaTemplate /> 

    <Property Id="INSTANCEID" Value="0" /> 

    <InstanceTransforms Property="INSTANCEID"> 
    <Instance Id="I01" ProductCode="{888F3620-F2AB-4C0B-A276-0A5AE9C0B6CB}" ProductName="WixDemo 3.7.4 Dev" /> 
    <Instance Id="I02" ProductCode="{01D23E62-A369-43E1-914A-FA017B1EE822}" ProductName="WixDemo 3.7.4 Test" /> 
    <Instance Id="I03" ProductCode="{00D804D7-0AD0-412C-805A-4D37FF74FFA3}" ProductName="WixDemo 3.7.5" /> 
    <Instance Id="I04" ProductCode="{6C3E5B4E-BF7D-4E7E-A62A-B7DFB750F581}" ProductName="WixDemo 3.7.6" /> 

    </InstanceTransforms> 

    <Feature Id="ProductFeature" Title="WixSetupWPFApp" Level="1"> 
    <ComponentGroupRef Id="ProductComponents" /> 
    </Feature> 
    </Product> 

    <Fragment> 

<SetDirectory Id="WINDOWSVOLUME" Value="[WindowsVolume]" /> 
<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="WINDOWSVOLUME"> 
    <Directory Id="WixDemo" Name="WixDemo"> 
     <Directory Id="INSTALLLOCATION" Name="WixDemo" /> 
    </Directory> 
    </Directory> 
</Directory> 
<Fragment> 
    <ComponentGroup Id="ProductComponents" Directory="INSTALLLOCATION"> 
    <Component Id="WixDemoWPFApp.exe" Guid="42907ee1-2bb2-4416-8d8f-cebc2bf53f09"> 
    <File Id="WixDemoWPFApp.exe" Name="WixDemoWPFApp.exe" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe" /> 
    </Component> 
    <Component Id="WixDemoWPFApp.exe.config" Guid="ed8a9503-2eb1-4f49-b7f3-f027f542c93f"> 
    <File Id="WixDemoWPFApp.exe.config" Name="WixDemoWPFApp.exe.config" 
      Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.exe.config" /> 
    </Component> 
    <Component Id="WixDemoWPFApp.pdb" Guid="5bf6cd62-7bc7-42cd-839a-7b66d7e8a09a"> 
    <File Id="WixDemoWPFApp.pdb" Name="WixDemoWPFApp.pdb" Source="$(var.WixDemoWPFApp_TargetDir)WixDemoWPFApp.pdb" /> 
    </Component> 
    </ComponentGroup> 
</Fragment> 
</Wix> 

그리고 난 다음 명령을 실행하여 설치

msiexec INSTALLLOCATION="D:\Wixtestinstance\1" /i WixSetupWPFApp.msi MSINEWINSTANCE=1 TRANSFORMS=":I01" 
  1. 어떻게 InstanceTransform 내부 초기화 없이 명령을 통해 인스턴스를 동적으로 생성 할 수 있습니다.
  2. 위의 방법을 사용할 수없는 경우 제품 이름을 하드 코딩하지 않고 명령을 통해 을 동적으로 전달할 수 있습니다.

답변

1

미리 인스턴스 변환을 만들어야합니다. 기술적으로는 MSI를 호출하기 직전에 부트 스트랩이 설치 시간에 동적으로 변환을 생성하는 것을 막을 수는 없지만 여러 가지 실질적인 문제가이를 방지합니다.

  • instance transform은 InstanceId를 요청하고 ProductCode를 변경해야합니다. 이들을 미리 생성하지 않으면 정적임을 알지 못하므로 나중에 표준 메커니즘을 통해 쿼리하는 것이 거의 불가능합니다.
  • 구성 요소 규칙이 계속 적용되며 인스턴스 변환을 포함하면 그 의미를 훨씬 더 세게 생각할 수 있습니다. 이렇게하면 변환 과정에서 동적으로 제외하고 각 인스턴스에 대해 별도의 구성 요소를 만들 수 없습니다.
  • ProductName must be changed by a transform. 이 작업으로 새 GUID를 생성하는 것과 동일한 식별 문제가 발생하지는 않지만 즉시 생성 된 변환은 서명되지 않습니다. 따라서 Windows Installer에 의해 표시되는 UAC 프롬프트가있는 경우이를 사용하면 UAC 프롬프트에 영향을줍니다.

이들 중 디지털 서명 문제 만 극복 할 수 없을 것입니다. 그러나 다른 문제들에 의해 다루어 진 잠재적 인 문제들은 옳은 것을 얻기가 정말로 어렵습니다.

+0

도움이되는 지식에 감사드립니다. 설치하기 전에 사용자 지정 작업을 사용하거나 xml 파일을 읽음으로써 인스턴스 ProductName을 변경할 수있는 방법이 있습니까? – Vinay

+0

예.하지만 세 번째 글 머리 기호가 적용되며 설치를 시작하기 전에 부트 스트랩에서 변환을 만들거나 선택해야합니다. (맞춤 동작이 아니기 때문에 가장 가까운 대답은 "아니오"입니다.) –

1

예 - 귀하의 Wix 소스 파일에 ProductName을 설정하기 만하면 ARP ProductName을 변경할 수 있습니다. 사용자 지정 작업에

<Property Id ="INSTANCEID" Value ="_" Secure ="yes"/> 
<Property Id ="INSTANCENAME" Secure ="yes"></Property> 

<InstanceTransforms Property ="INSTANCEID"> 
    <Instance Id ="I01" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="I01"/> 
    <Instance Id ="I02" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO2"/> 
    <Instance Id ="I03" ProductCode ="*" UpgradeCode ="{GUID}" ProductName ="IO3"/> 
</InstanceTransforms> 

<SetProperty Id ="ProductName" Before ="LaunchConditions" Value ="[INSTANCENAME]"></SetProperty> 

: 나는 자체가 교류 # 사용자 지정 작업의 결과로 설정 가져옵니다 INSTANCENAME 특성에 따라 제품 이름 값을 설정 어디 여러 인스턴스에 대해이 작업을하고 있어요

session["INSTANCENAME"] = "_" + session["INSTANCENAME"]; 

InstanceTransforms의 은 SetProperty 호출로 대체됩니다.

사실,이 이름은 제거 대화 상자에 표시되는 이름이 아니지만 괜찮습니다. 나를 위해 가장 중요한 것은 ARP 영역에 알맞은 인스턴스 이름을 갖는 것이 었습니다.

관련 문제