【问题标题】:Bootstrapper: How to compile the application and prerequisite in single .msi package?Bootstrapper:如何在单个 .msi 包中编译应用程序和先决条件?
【发布时间】:2009-02-19 22:45:38
【问题描述】:

我正在为具有安装先决条件的应用程序创建一个 .msi 包。 我正在使用 Visual Studio 2005 Bootstrapper 来完成这项任务。 为此,我做了以下工作: 找到文件夹 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\ 并为我的先决条件创建了一个文件夹(使其结构与“dotnetfx”相同);创建了“product.xml”和“package.xml”并将它们适当地放置。到目前为止,我保持 xml 文件非常简单以测试安装:

产品.xml

<?xml version="1.0" encoding="utf-8"?>
<Product ProductCode="MyPrereq" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <PackageFiles CopyAllPackageFiles="false">
    <PackageFile Name="MyPrereq.exe" />
  </PackageFiles>
  <InstallChecks>
  </InstallChecks>
  <Commands Reboot="None">
    <Command PackageFile="MyPrereq.exe" EstimatedInstallSeconds="90">
      <InstallConditions>
      </InstallConditions>
      <ExitCodes>
    <ExitCode Value="0" Result="Success"/>
        <DefaultExitCode Result="Fail" String="GeneralFailure" FormatMessageFromSystem="true" />
      </ExitCodes>
    </Command>
  </Commands>
</Product>

package.xml

<?xml version="1.0" encoding="utf-8"?>
<Package Name="MyPrereq" Culture="Culture" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <Strings>
    <String Name="Culture">en</String>
    <String Name="DisplayName">MyPrereq</String>
    <String Name="GeneralFailure">A fatal error occurred. The installation failed.</String>
  </Strings>
</Package>

现在我可以从列表中添加先决条件并构建我的设置项目。

问题:

构建输出是“setup.exe”、“MyApp.msi”包,以及名为“MyPrereq”的子文件夹,其中包含“MyPrereq.exe”。

我希望构建创建一个“setup.exe”和一个“MyApp.msi”,其中包含“MyPrereq”,没有其他文件/目录。

我知道 .NET 框架是我的应用程序的另一个先决条件,它包含在同一个 .msi 中,因此应该可以通过某种方式实现。

我怎样才能做到这一点?

【问题讨论】:

    标签: visual-studio-2005 windows-installer bootstrapping


    【解决方案1】:

    您可以使用 IExpress(Windows 随附)等工具创建自解压安装程序,其中包含单个可执行文件中的所有文件(请参阅 this SO posting)。

    您不能让 MSI 文件安装其自己的先决条件。首先,因为 Windows Installer 本身是先决条件(并且必须由非 MSI exe 安装),其次因为 Windows Installer 安装是事务性的,不支持 MSI 文件的链式执行。这基本上意味着一个 MSI 安装无法启动另一个 MSI 安装。因此,任何先决条件都必须由单独的引导程序安装(顺便说一下,安装不再是事务性的 - 如果您的 MSI 安装失败,则不会卸载先决条件)。

    不过,似乎对引导程序机制存在基本的误解。引导程序目前只能由 Visual Studio 或 MSBuild 生成。 Afaik WiX 是不可能的。在 MSBuild 中查找 GenerateBootstrapper 任务(请参阅this SO posting)。

    【讨论】:

      【解决方案2】:

      我设法用 IExpress 做到了。

      然而,不得不使用一个小技巧,这里描述 Creating a bootstrapper for a VS Shell application

      不幸的是,MSBuild 任务 不提供拥有 配置资源使用 在 目标目录,所以你必须手动 更新相应的资源文件 删除硬编码的路径 在 a 中寻找先决条件 同名的子目录。

    • 在 Visual 中打开 Setup.exe 程序 Studio 的资源编辑器
    • 双击 41 中名为 SETUPCFG 的资源 文件夹
    • 搜索“Vs Shell” 字符串并删除两次出现 出现
    • 保存资源文件 并且 Setup.exe 可执行文件将是 自动更新
    • 运行 iexpress
    • 按照以下步骤创建一个新包 IExpress 向导的步骤并确保 包括以下文件:
    • 该 MyVSShellApplication.msi 文件
    • 该 Setup.exe 引导程序文件
    • 该 vs_shell_isolated.enu.exe 文件
    • 问题是引导程序将先决条件放入子文件夹中,而 IExpress 无法识别子文件夹。编辑“setup.exe”时也要小心,第一次尝试时没有正确。

      【讨论】:

      • 感谢您在这里发布您的进一步解决方案,希望它对其他人也有用。我不太确定您的具体情况,但总的来说,IExpress 应该识别子文件夹。它们必须在配置文件中声明,请参阅我上面发布的链接。
      • 我没有在那个链接中看到子文件夹支持。我认为 IExpress 不支持它们,因为生成的出租车是平的
      • tjmoore 是正确的 - IExpress 可以打包来自不同文件夹的文件,但它会将它们提取到同一个文件夹,忽略原始结构。
      猜你喜欢
      • 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
      相关资源
      最近更新 更多