업그레이드는 개별서 기능을 소개하고,기능-트리 제거하지 않고/업그레이드 기타 기능(s)

StackOverflow https://stackoverflow.com/questions/1744105

문제

나를 만들려고 설정을 사용하여 프로젝트 WIX 는 것이 날 수 있도록 여러 기능을 설치 하나의 제품입니다.어떻게 업데이트할 수 있습니 하나의 설치된 기능(는 독립적의 설치된 기능)을 다시 설치하지 않고도 다른 특징에서 기능이 나무입니까?

예를 들어,내가 할 수 있는 프로젝트(시 HelloWolrd)라고 HelloWolrd 는(surprise)prints"Hello world!"습니다.말하자 나는 이 세 가지가 안녕하세요 세계 응용 프로그램,안녕하세요 세계 1,안녕하세요 세계 2,및 안녕하세요 세계 3.각각의 인쇄 화면에 안녕하세요 세계 1,2,3,게 되었습니다.어떤 것을 만드는 것입 MSI 는 기본적으로 설치 이 세"기능"또한 업그레이드 할 수 있습의 각 기능을 개별적으로 나중에 시간이다.

여기에는 나의 레이아웃을 내 솔루션:

솔루션 탐색기 http://img12.imageshack.us/img12/5671/solutionexplorerm.jpg

내 WIX 제품입니다.다 파일은 다음과 같습니다:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="ca484210-c719-4b2e-b960-45212d407c11" Name="HelloWorldInstaller" Language="1033" Version="1.0.0.0" Manufacturer="HelloWorldInstaller" UpgradeCode="68eeb8cb-9ef3-443c-870c-9b406129f7ff">
        <Package InstallerVersion="200" Compressed="yes" />

        <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

        <!-- Create Directory Structure -->
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLLOCATION" Name="Hello World" />
            </Directory>
            <Directory Id="DesktopFolder" Name="Desktop"/>
        </Directory>

        <DirectoryRef Id="INSTALLLOCATION">
            <Component Id="HelloWorld1" Guid="6D1D9D33-DA17-4db3-8132-C39F32200C3A">
                <RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld1\Install" Action="createAndRemoveOnUninstall">
                    <RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
                </RegistryKey>

                <File Id="HelloWorld1.exe" Name="$(var.HelloWorld1.TargetFileName)" Source="$(var.HelloWorld1.TargetPath)" DiskId="1" Checksum="yes">
                    <Shortcut Id="HelloWorld1ApplicationDesktopShortcut" Name="Hello World 1" Description="Hello World Application 1" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
                </File>

            </Component>
            <Component Id="HelloWorld2" Guid="B2D51F85-358B-41a7-8C45-B4BB341158F8">
                <RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld2\Install" Action="createAndRemoveOnUninstall">
                    <RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
                </RegistryKey>

                <File Id="HelloWorld2.exe" Name="$(var.HelloWorld2.TargetFileName)" Source="$(var.HelloWorld2.TargetPath)" DiskId="1" Checksum="yes">
                    <Shortcut Id="HelloWorld2ApplicationDesktopShortcut" Name="Hello World 2" Description="Hello World Application 2" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
                </File>
            </Component>
            <Component Id="HelloWorld3" Guid="A550223E-792F-4169-90A3-574D4240F3C4">
                <RegistryKey Root="HKCU" Key="Software\HelloWorldInstaller\HelloWorld3\Install" Action="createAndRemoveOnUninstall">
                    <RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes" />
                </RegistryKey>

                <File Id="HelloWorld3.exe" Name="$(var.HelloWorld3.TargetFileName)" Source="$(var.HelloWorld3.TargetPath)" DiskId="1" Checksum="yes">
                    <Shortcut Id="HelloWorld3ApplicationDesktopShortcut" Name="Hello World 3" Description="Hello World Application 3" Directory="DesktopFolder" WorkingDirectory="INSTALLLOCATION" />
                </File>
            </Component>
        </DirectoryRef>

        <Feature Id="HelloWorld1Feature" Title="Hello World 1" Level="1">
            <ComponentRef Id="HelloWorld1"/>
        </Feature>
        <Feature Id="HelloWorld2Feature" Title="Hello World 2" Level="1">
            <ComponentRef Id="HelloWorld2"/>
        </Feature>
        <Feature Id="HelloWorld3Feature" Title="Hello World 3" Level="1">
            <ComponentRef Id="HelloWorld3"/>
        </Feature>

    </Product>
</Wix>

지금 할 때,이는 건축,설치의 기능으로 정보를 이용할 수 있습니다.그러나,당신이 수정 HelloWorld1.vb 고 다시 컴파일하고 싶을 할 수 있도록시(업그레이드)에뿐만 아니라 기능이다.

면을 업데이트나 파일,다시 솔루션,다음 설치하려고 msi,나는 이 오류가 발생할 수 있습니다.

MSI Error http://img696.imageshack.us/img696/849/anotherversionisinstall.jpg

내 업데이트 할 수 있도록 코드를 제거하기 위한 기능 및 사용할 수 있는 업그레이드 코드는 설치되지 않은 모든 기능,그리고 다시 설치된다.


--실제 응용 프로그램--

의 실제 응용 프로그램를 이것은 큰 소프트웨어 패키지는 여러 응용 프로그램을 지원으로 실행되는 서비스/공항에서 작업을 정기적으로.를 설치하려는 이 지원하는 응용 프로그램 중 하나 MSI 수 있도록 우리가 이러한 악몽의 회전 각 exe 습니다.내가 알고 있는 경우에 우리는데 하나의 exe 의할 수 있는 우리가 단지 수동으로 컴파일하는 exe 롤 아웃,그러나 내가 하고 싶으면 이에서 완전히 재현 가능한 방식이다.

어떤 도움이 될 것입 appriciated,

감사합니다!

편집:

추가 소스에서 다운로드 Google 코드.다시 한번 감사드립니다!

도움이 되었습니까?

해결책

이 파악하고를 게시 할 것이라고 생각 여기에 해답이 미래에 대한 참조 다른 사람입니다.그래서 나는 완전히 문제를 설명하고,내가 갈 것을 더 깊이의 실제 시나리오.

우리는 적당히 큰 소프트웨어의 조각을 우리를 필요로한 여러 지원하는 애플리케이션에서 실행되는 다른 서버에 있습니다.우리의 현재 진행 업그레이드의 그것을 알맞게 업그레이드하기 어려운드에서 신뢰할 수 있는 패션이다.현재 우리가 사용하는 자를 추출하 exe 의 출시 우리의 코드를 다른 서버에 있습니다.문제가 발생할 때 우리는 우리와 같은 큰 숫자를 지원하는 응용 프로그램이 되도록 하기 위해 최선을 다하고 있는 응용 프로그램 설치있어서 제대로 올바른 구성 설정,등등.이 문제를 해결하기 위해 우리가 찾고있으로는 기능을 대신 압축함으로써 각각의 애플리케이션을 지원,우리는 하나의 설치 프로그램(MSI)할 수 있는 인프라가 팀을 설치하의 특정 애플리케이션을 지원하는 각 주어진 기계입니다.우리가 주요 변경(예를 들어서 1.0~2.0)우리는 전체 업그레이드를 설치하(을 의미하는 모든 서비스/프로세스가 중지되어야 할 유엔 설치,설치와 시작됩니다.) 우리가 약간 변경,우리는 우리만을 정지하고 다시 설치의 영향을 받는 서비스/프로세스를 건드리지 않고,다른 신청입니다.지금의 충분히 나에게 산책,을 받을 수 있습니다 솔루션:

내가 수정을 소개하고,제품입니다.다를 바로 가기를 제거하으로 우리가 정말 필요 없는 그들을 시나리오에서.여기에 업데이트한다 file:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
 <Product Id="13C373D3-5C27-487e-A020-C2C89E4607B1" Name="HelloWorldInstaller" Language="1033" Version="1.0.0.0"
      Manufacturer="HelloWorldInstaller" UpgradeCode="E7CB3C76-4D51-48a8-BFB4-6D11B2E2E65B">

  <Package InstallerVersion="200" Compressed="yes" />

  <Media Id="1" Cabinet="product.cab" EmbedCab="yes" />
  <FeatureRef Id="HelloWorld1Feature" />
  <FeatureRef Id="HelloWorld2Feature" />
  <FeatureRef Id="HelloWorld3Feature" />
 </Product>

 <Fragment>
  <Directory Id="TARGETDIR" Name="SourceDir">
   <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION" Name="Hello World" />
   </Directory>
   <Directory Id="DesktopFolder" Name="Desktop"/>
  </Directory>
 </Fragment>

 <Fragment>
  <DirectoryRef Id="INSTALLLOCATION">
   <Directory Id="HelloWorld1Directory" Name="Hello World 1">
    <Component Id="HelloWorld1Component" Guid="6D1D9D33-DA17-4db3-8132-C39F32200C3A">
     <File Id="HelloWorld1.exe" Name="HelloWorld1.exe" Source="HelloWorld1.exe" DiskId="1" Checksum="yes" />    
    </Component>
   </Directory>
   <Directory Id="HelloWorld2Directory" Name="Hello World 2">
    <Component Id="HelloWorld2Component" Guid="B2D51F85-358B-41a7-8C45-B4BB341158F8">
     <File Id="HelloWorld2.exe" Name="HelloWorld2.exe" Source="HelloWorld2.exe" DiskId="1" Checksum="yes" />
    </Component>
   </Directory>
   <Directory Id="HelloWorld3Directory" Name="Hello World 3">
    <Component Id="HelloWorld3Component" Guid="A550223E-792F-4169-90A3-574D4240F3C4">
     <File Id="HelloWorld3.exe" Name="HelloWorld3.exe" Source="HelloWorld3.exe" DiskId="1" Checksum="yes" />
    </Component>
   </Directory>
  </DirectoryRef>
 </Fragment>

 <Fragment>
  <Feature Id="HelloWorld1Feature" Title="Hello World 1" Level="1">
   <ComponentRef Id="HelloWorld1Component"/>
  </Feature>
 </Fragment>
 <Fragment>
  <Feature Id="HelloWorld2Feature" Title="Hello World 2" Level="1">
   <ComponentRef Id="HelloWorld2Component"/>
  </Feature>
 </Fragment>
 <Fragment>
  <Feature Id="HelloWorld3Feature" Title="Hello World 3" Level="1">
   <ComponentRef Id="HelloWorld3Component"/>
  </Feature>
 </Fragment>
</Wix>

지금 이와 함께,우리의 사소한 업그레이드,우리가 찾고 있을 것입니다 패치를 발표한 우리의 구성 요소입니다.

예를 들어,말하자 우리는 ProductA 는 세 가지 부품-1,2,그리고 3.이 세 가지 요소 중 하나를 실행해야 합니스 또는 예약된 작업입니다.의 자연이 우리의 제품,우리는 우리를 종료할 수 없습니다 우리의 모든 서비스를 업데이트하거나 수정 하나의 구성 요소입니다.경우에 따라서,우리는 설치 버전 1.0,우리는 버그를 찾기에서 2 구성요소,하지만 우리가 원하지 않는 1 또는 3 에 의해 영향을 받을 수정에 적용되는 이 버그,우리가 방출됩니다 패치를 위한 구성요소 2,따라서 유일한 구성 요소 2 영향을 것입니다.

에 대한 우리의 빠른 예를 들어,위의 우리가 사용하는 HelloWorld1,HelloWorld2 및 HelloWorld3 으로 우리의 3 요소에 우리의 소프트웨어 응용 프로그램입니다.의 생각은 우리가 해야 할 수 있을 설치하는 세 가지 모두 중 하나로 MSI 지만,그 후 업데이트 각각 독립적으로 그것 없이는 아무런 영향을 미치는 다른 설치된 구성 요소입니다.

그래서,이 방법을 설명하기 위해 만들었는 세 가지 콘솔 응용 프로그램을 위에 표시되는"안녕하세요 세계 1!", "Hello World2!", 와"안녕하세요 세계 3!".그 후 우리는 초기 MSI 을 말할 수 있습니다 우리가 발견한"버그"를 필요로 하는 우리가 HelloWorld1 이 말하는"안녕하세요 세계 1!업데이트됩니다."대신 합니다.여기에는 우리가 무엇을 할 것인지를 시뮬레이션:

  1. 제품을 만듭니다.wixobj 실행하여 이 명령 명령 프롬프트에서:
    candle.exe Product.wxs
    기억하시기 바랍하기 위해서는 전화 candle.exe 또 WIX 명령을 소개하고,디렉토리를 설치해야에서의 경로는 변수입니다.(짧은 튜토리얼에서 업데이트 PATH 환경변수 아)또한,실행하여 주시기 바랍니 이 명령에서와 같은 디렉토리의 제품입니다.다 파일입니다.
  2. 을 만들의 첫 번째 버전을 귀하의 제품(말할 수 있습 1.0):
    light.exe Product.wixobj -out ProductA-1.0.msi
  3. 지금은 버그를 찾기(출력의 HelloWorld1 을 말하는"안녕하세요 세계 1!업데이트됩니다.") 다음 업데이트는 어셈블리 버전에 파일 버전.이것은 중요으로 이 방법을 소개하고,알 수 있습니다 exe 의는 다릅니다.
  4. 동일한 명령을 실행하여 단계로나(에 대한 좋은 측정):
    candle.exe Product.wxs
  5. 거의 같은 명령으로 두 번째 단계:
    light.exe Product.wixobj -out ProductA-1.1.msi
    이는 버전 1.1 대신 1.0(이 msi 우리의 업데이트와 함께 코드).그러나 우리가 원하지 않을 설치하려면 이 계속 읽고 있습니다.
  6. 여기 재미있는 부분입니다,우리의 차이를 두 Msi 다음 명령을 사용:
    torch.exe -p -xi ProductA-1.0.wixpdb ProductA-1.1.wixpdb -out Diff.WixMst
  7. 지금 우리가 만들어 패치 파일이(패치입니다.다 것이 아래에서 설명):
    candle.exe Patch.wxs
  8. 우리는 지금을 만들 WixMsp 파일의 이 명령:
    light.exe Patch.wixobj -out Patch.WixMsp
  9. 이제 재미있는 부분입니다.을 만들 MSP 파일의 이 명령:
    pyro.exe Patch.WixMsp -out Patch.msp -t RTM Diff.Wixmst

지금는 경우,모든 것을 계획에 따라 갔는데,두 개가 있어야 msi 의 하나 msp 파일입니다.설치하는 경우에는 먼저 msi(ProductA-1.0.msi)및 실행 HelloWorld1.exe 해야 합 메시지를 참조,"Hello World1!".그냥 재미를위한(그리고 예)실행을 모두 다른 응용 프로그램을 두고 그들을 실행하는(내에서 중지를 유지하)열려 있습니다.닫기 HelloWorld1.exe 으로 우리는 이제 업데이트를 적용하는 exe,그러나 그렇게 우리에 영향을 미치지 않을 것입 HelloWorld2.exe 나 HelloWorld3.exe.는 경우 지금 설치 msp(패치입니다.msp)파일,다음을 실행 HelloWorld1.exe 당신이 볼 수 업데이트 메시지,"Hello World1!업데이트됩니다."

패치입니다.다 file:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
 <Patch
   AllowRemoval="yes"
   Manufacturer="Dynamo Corp"
   MoreInfoURL="http://www.dynamocorp.com/"
   DisplayName="Sample Patch"
   Description="Small Update Patch"
   Classification="Update"
        >

  <Media Id="5000" Cabinet="RTM.cab">
   <PatchBaseline Id="RTM"/>
  </Media>

  <PatchFamilyRef Id="SamplePatchFamily"/>
 </Patch>

 <Fragment>
  <PatchFamily Id='SamplePatchFamily' Version='1.0.0' Supersede='yes'>
   <ComponentRef Id="HelloWorld1Component"/>
  </PatchFamily>
 </Fragment>
</Wix>

하는 것처럼 보이지 않는가?만,가장 흥미로운 부분은 이러한:

  1. <PatchBaseline Id="RTM"/> -이 경우 당신이 기억에서 사용되는 우리의 창조의 패치 msi.는"RTM"라고 마지막 단계에서 위의: -t RTM -이 일치합니다.
  2. <ComponentRef Id="HelloWorld1Component"/> -이 포인트에 패치를 올바른 구성 요소를 업데이트,우리의 경우 HelloWorld1Component.

만약 당신이 하고 있는지 어떤 주위를 검색하는,위의 코드는 보일 수 있습에 익숙하기 때문에 그것에서 나온 베드로 Marcu 의 블로그: WiX:빌딩 패치를 사용하여 새로운 패치 시스템 구축-제 3 부

나도에 크게 의존 알렉스 Shevchuk 의 블로그: 에서 MSI 을 WiX,8 부-중요한 업그레이드

당신이 궁금해하는 경우,"Wow,그것의 많은 단계는 사람이 왜 이렇게 많은 단계?", 을 기억하시기 바랍 어려운 작업(위)이 완료되면,당신은 필요한 이동으로 통합니다.그게 바로,통합,통합, 통합!당신은 이것을 어떻게?글쎄,그게 좀 더 연구하고,어쩌면 블로그 포스팅?-아마.를 얻을 당신이 떨어져 오른쪽 발에,여기에 멋진 문서 자동화 릴리스 MSBuild 와 Windows Installer XML.

Wow,나는 당신이 읽고 이 모든 것(모든 당신의 두),그리고 많은 것을 배웠습니다.이 도움이 되었으면 좋겠습니다 누군가가 다른 자신보다.

감사합니다!

다른 팁

업그레이드 시나리오를 알아 낸 것 같습니다. 이제 알아야합니다. 주요 MSI 업그레이드에 remove ExistingProducts를 배치 할 위치 따라서 기능이 변경되지 않으면 기능이 다시 설치되지 않습니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top