我试图创造一个安装项目采用 维克斯 这将允许我安装多功能的一个单一的产品。我如何可以更新一项安装的功能(这是独立的其他安装的功能),而不必重新安装的其他特征的特征-树?

例如,我希望能够有一个项目(回到HelloWolrd)称为HelloWolrd,(惊喜)prints"hello world!"在屏幕上。让我们说,我有这三个好世界的应用,hello World1,hello World2,hello World3.每个印痕在屏幕上你好世界的1、2或3中,尊敬。我想是创造一个MSI默认情况下安装所有这三个"特征",而且还允许升级的每个功能单独在稍后的时间。

这里是我的布局我的解决方案:

方案资源管理器http://img12.imageshack.us/img12/5671/solutionexplorerm.jpg

我的维克斯的产品。wxs文件看起来是这样的:

<?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错误http://img696.imageshack.us/img696/849/anotherversionisinstall.jpg

我更新我的代码让卸载的功能,并允许使用升级编码的,但是,联合国安装的所有特征,并重新安装的所有的人。


--真实世界的应用程序--

现实世界的应用程序,这是一个大型软件包需要多支持应用程序的运行为的服务/计划的任务,在定期的基础上。我想获得的安装这些支持应用程序进入一个MSI允许我们没有这样的噩梦的滚出每个exe独立。我知道,如果我们有一个更新的一个exe的,我们只能手工汇编,exe和滚出来,但是我想要做到这一点,在一个完全重复性的方式。

任何帮助将appriciated,

谢谢你!

编辑:

我加入的来源下载 谷歌的代码.再次感谢!

有帮助吗?

解决方案

我想通了,我想我会后答案在这里为未来参考。所以我有充分解释的问题,我将在更深入的真正的世界的情况。

我们有一个中等大片的软件,要求我们有多支持上运行的应用程序的一些不同的服务器。我们目前的进展的升级,使它适度难以升级码在一个可靠的方式。目前,我们使用自我提取可执行软件的推出我们的代码不同的服务器。在出现问题时,我们有如此大量的支持应用程序,它变得难以确保应用程序得到了正确安装用正确的结构设置,等等。为了解决这个问题,我们正在寻找能力而不是压缩的每一个支持性应用程序,我们建立一个单一的安装(MSI),这将允许对基础设施团队,以安装特定的支持应用程序的每个给予机。当我们有一个重大变化(例如从1.0-2.0)我们将做一个完整的安装升级(这意味着所有服务/流程将需要停止,联合国安装、安装和开始。) 当我们有一个微小的变化,我们想到的只有停止和重新安装的影响服务/过程,而不触及其他应用程序。现在,我足够的散漫,让我们得到 该解决方案:

我修改了维克斯的产品。wxs删除的快捷方式为我们真的不需要他们在我们的情况。这里是更新wxs文件:

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

现在随着这个,对我们微小升级,我们将看释放的补丁我们的组件。

例如,我们说,我们有一个产品A,其中有三个组成部分-1、2和3中。这三个组成部分必须在运行为的服务,或计划的任务。我们的产品,我们不能关闭我们所有的服务更新或修复我们的一个组成。因此,如果之后,我们已经安装了1.0版,我们发现了一个错误构成部分2,但是,我们不想1或3个能受到影响通过的修正应用到这个错误,我们将发布一个补丁构成部分2,因此只有2部分将受到影响。

对于我们的快速如上所述,我们使用HelloWorld1,HelloWorld2,并HelloWorld3作为我们3件在我们的软件应用程序。想法是,我们应该能够安装的所有三个与一个MSI,但随后更新每一个人独立地而不影响任何其他安装的部件。

因此,为了证明这一点,我已经创建了三个控制台应用程序上,这将显示"hello World1!", "Hello World2!", 和"hello World3!".然后我们释放的初始MSI,可以说我们找到一个"错误"这要求我们有HelloWorld1说"hello World1!更新。"来代替。这里是我们将做些什么来模拟:

  1. 创造的产品。wixobj通过执行这一命令,该命令提示:
    candle.exe Product.wxs
    请记住,在以打电话的candle.exe 或任何维克斯的命令,维克斯的安装目录应该在你的路径可变的。(简短的教程,在更新的路径的环境变量)还请执行命令的同一目录作为你的产品。wxs文件。
  2. 创建第一个版本的你的产品(可以说1.0):
    light.exe Product.wixobj -out ProductA-1.0.msi
  3. 现在发现错误(改变输出的HelloWorld1说"hello World1!更新。") 然后 更新大会的版本和文件的版本.这是重要的,因为这是怎么维克斯可以告诉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. 现在我们创建的补丁文件,从这个(修补程序。wxs将在下文解释):
    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(产品A-1.0.msi)和运行HelloWorld1.exe,你应该看到的消息,"hello World1!".只是为了好玩(例),运行这两个其它应用,并让他们运行(I建立在一个停止向他们保持开放)。靠近HelloWorld1.exe 因为我们现在打算申请更新,exe,但这样做,我们将不会影响HelloWorld2.exe 或HelloWorld3.exe.如果你现在安装的msp(修补程序。msp)的文件,然后运行HelloWorld1.exe您将看到更新的信息,"hello World1!更新。"

现在, 神奇的 修补程序。wxs文件:

<?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。在"题"中提到的最后的步骤上: -t RTM -这些需要相匹配。
  2. <ComponentRef Id="HelloWorld1Component"/> -这点修补到正确的组件的更新,在我们的情况下HelloWorld1Component.

如果你已经做任何搜索左右,上述代码可能看起来熟悉的,因为它来自 彼得Marcu的博客: 维克斯:建立一个补丁使用的新建筑物系统的一部分3

我也在很大程度上依赖 亚历克斯Shevchuk的博客: 从MSI维克斯,第一部分8-主要升级

如果你想知道,"哇,这是一个很大的步骤,为什么会有人这样做许多步骤?", 请记住,一旦艰苦的工作(上文)完成后,你需要推动这个进入你的一体化程序。这就是正确的,整合,整合, 集成!你怎么这么做?好吧,这就是更多的研究,也许一篇博客?-可能。要让你的右脚,这是一个很棒的文章 自动发布但这并不说明人们安装Windows XML.

哇,我希望你读这个(所有你们两个),并学到了很多。我希望这可以帮助其他人比我自己。

谢谢你!

其他提示

听起来你想通了升级方案,现在你只需要弄清楚的在哪里放置RemoveExistingProducts在重大MSI升级使功能不重新安装,如果他们没有改变:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top