【问题标题】:How to include prerequisites with msi/Setup.exe in WIX如何在 WIX 中使用 msi/Setup.exe 包含先决条件
【发布时间】:2013-07-04 12:11:11
【问题描述】:

我正在尝试将我的包合并到一个单独的安装 EXE 文件中并将其上传到 Internet。

我创建了一个 Microsoft 引导程序,其中包含带有项目 MSI 输出的 Setup.exe,以及必备的 .NET Framework 2.0、Windows Installer3.1、Visual C++2005 可再发行组件和 Microsoft ReportViewer。我使用Visual Studio 2008 创建了一个安装项目。

现在我正在尝试使用 WiX 3.6 创建单个压缩设置。我已经在 Visual Studio 2008 中安装了它。

我已使用以下命令附加了 setup.exe 和 MSI 文件。

<ExePackage SourceFile ="setup.exe" Compressed ="yes"/>
<MsiPackage SourceFile ="myproject.msi" Compressed ="yes" />

但它无法找到 MSI 文件。如何在其中包含上述先决条件?

或者我可以在安装时从 Internet 下载上述先决条件吗?我该怎么做?

【问题讨论】:

    标签: wix installation wix3.6 prerequisites


    【解决方案1】:

    我已从 Visual Studio 中删除了默认的 setup.exe,并使用 Visual Studio 中的 MSI 文件和依赖项来创建 WiX 3.6 引导程序:

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
         xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
         xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    
        <Bundle Name="My Application"
                Version="1.0"
                IconSourceFile ="E:\logo.ico"
                Manufacturer="My company"
                UpgradeCode="4dcab09d-baba-4837-a913-1206e4c2e743">
    
            <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
                <bal:WixStandardBootstrapperApplication
                    LicenseFile="E:\License.rtf"
                    SuppressOptionsUI ="yes"
                    LogoFile ="logo.ico" />
            </BootstrapperApplicationRef>
    
            <Chain>
                <ExePackage
                    SourceFile ="ReportViewer\ReportViewer.exe"
                    Compressed ="yes"
                    Vital ="no"
                    Permanent ="yes"/>
                <ExePackage
                    SourceFile ="vcredist_x86\vcredist_x86.exe"
                    Compressed ="yes"
                    Vital ="no"
                    Permanent ="yes"/>
                <MsiPackage
                    SourceFile ="MySetup.msi"
                    Compressed ="yes"
                    DisplayName ="My Application"
                    ForcePerMachine ="yes"/>
            </Chain>
        </Bundle>
    </Wix>
    

    它会压缩成一个带有先决条件的 EXE 文件。

    【讨论】:

      【解决方案2】:

      SourceFile 将接受 .msi 文件的相对路径。或者,如果您使用 WiX 安装项目构建 .msi 文件,您可以在 WiX Bootstrapper 项目中添加对安装项目的引用。这定义了variables,你可以这样使用:

      <MsiPackage SourceFile ="$(var.myproject.TargetPath)" Compressed ="yes" />
      

      如果您放弃 Visual Studio Bootstrapper 并将所有先决条件放入 WiX Bootstrapper,您的用户可能会获得更好的体验。这对您来说会做更多的工作,因为您的项目的所有先决条件都没有预定义的ExePackageGroupExePackage

      检查ExePackage 定义中应包含哪些信息的最佳位置是有关特定先决条件的文档。但是,与 Visual Studio Bootstrapper 包(例如,C:\Program Files\Microsoft Visual Studio 9\SDK\v2.0\Bootstrapper\Packages)和可能在 WiX 源代码中预定义的类似先决条件进行比较也是有益的。特别是,在 WiX 源代码中,您将找到一个 ExePackage,如果需要,它会在安装时从 Internet 下载 .NET 4。

      【讨论】:

        【解决方案3】:

        您可以包含一些先决条件文件,例如:

         <?xml version="1.0" encoding="UTF-8"?>
         <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
         <Product Id="*" Name="MyApplication" Version="$(var.ProductVersion)" Manufacturer="manuf" Language="1033">
        
         [...]
        
         <Directory Id="ANOTHERLOCATION" Name="MyApplicationName">
            <Component Id="ApplicationFiles" Guid="12345678-1234-1234-1235-111111111111">
                 <File Id="ApplicationFile4" Source="C:\Users\user\Desktop\requisite.exe"/>
                 <CreateFolder />
            </Component>
         </Directory>
         <SetDirectory Id="ANOTHERLOCATION" Value="[WindowsVolume]MyApp" />
                 <Feature Id="DefaultFeature" Level="1">
                <ComponentRef Id="ApplicationFiles" />
         </Feature>
         </Product>
         </Wix>
        

        上面复制了 C:/MyApp 中的 requisite.exe 文件。 然后,您必须根据某些条件从您的程序中运行 requisite.exe 文件。 这是不使用复杂的 Wix 魔法的最基本和最直接的方法。

        【讨论】:

        • 如果我需要检查先决条件是否以前安装过?如果没有,则安装,否则跳过安装..如何检查这种情况?
        • 我的建议是在您的程序中插入先决条件检查和可能的安装(如果它可以在没有此先决条件的情况下首先运行)。例如,您可以将此信息存储在 .ini 文件中并使用您的程序读取它,如果找不到,则调用 System.Diagnostics.Process.Start("requisite.exe");启动它
        • 这将需要重新提升到管理员才能安装先决条件。适合您和我,但在工业厂房等管理严密的域中安装自定义软件时不可接受。
        【解决方案4】:

        您可以使用 NSIS 之类的东西来包装您的引导程序和 MSI。您需要编写一个简单的 NSIS 脚本,如下所示:

        !define PRODUCT_NAME "YourProductNameHere"
        
        Name "${PRODUCT_NAME}"
        OutFile "SetupWrapper.exe"
        Icon "Setup.ico"
        BrandingText " "
        SilentInstall silent
        
        Section
        
          SetOutPath "$TEMP\${PRODUCT_NAME}"
        
          ; Add all files that your installer needs here
          File "setup.exe"
          File "product.msi"
        
          ExecWait "$TEMP\${PRODUCT_NAME}\setup.exe"
          RMDir /r /REBOOTOK "$TEMP\${PRODUCT_NAME}"
        
        SectionEnd
        

        将其保存到名为 SetupWrapper.nsi 的文件中,然后编辑产品名称和 setup.exe 路径以及您的 MSI 文件。现在您可以构建此文件以获得包含引导程序和 MSI 的单个 EXE 文件。

        当这个 EXE 运行时,它不会有任何自己的 UI - 它只会将您的引导程序和 MSI 提取到一个临时文件夹,然后执行引导程序,然后进行清理。

        您还可以在项目中添加构建后步骤来构建此包装器,这将自动生成组合包装器 EXE。为此,您可以添加如下命令:

        path-to-NSIS\nsis-2.46\makensis.exe /V2 your-project-path\SetupWrapper.nsi
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多