安装科学

时间:2011-02-25 18:58:51

标签: deployment installer cross-platform upgrade

我对RPM,Windows安装程序机制和WIX的影响很小。也就是说,我有兴趣制作一个支持我自己产品的升级和降级(版本和补丁)的跨平台安装工具(Linux,Windows)。我不相信这是一个轻易接近的话题;我想学习艺术科学(或科学的艺术)。如果我成功并构建了一个最低成功的安装程序工具,它​​将具有以下功能:

  • 不依赖于特定于平台的工具(例如Windows Installer)。
  • 读取XML或声明性语法以满足安装要求。
  • 尝试最小化升级或降级我的某个产品的步骤(而不是要求完全卸载和重新安装)。
  • 不需要临时产品版本的知识,以便跳转版本(即可以将我的一个产品从版本1升级到版本3,而不通过版本2)。

我确信实现这一目标的“关键”是将版本视为“A点到B点”问题,这意味着A和B由两个XML“版本”文档描述,这些文档包含有关信息的信息。所有部件和操作(文件或平台细节,如注册表项)。我的安装程序工具将“加入”或比较这两个文档并确定一组最小的更改,以将A转换为B.在某种程度上,我相信这正是Windows Installer所做的。

当然还有更复杂的问题,但这就是这篇文章的重点。关于这个主题的信息的“圣经”在哪里?请记住,我想制作自己的安装程序 - 而不是使用特定于平台的安装程序。对于那些关心的人,我的产品通常用C ++或C#编写。

或许我应该研究像Steam这样的跨平台的东西,并将“自动游戏更新”作为其功能的一部分。就我而言,已经处理了在线部署的问题。这只是我正在研究的最后安装步骤。 Steam是否使用本机安装程序(例如MSI)?如果是,那就不是我想要的了。

简而言之,我应该采取什么样的方式来掌控这个主题的科学?

1 个答案:

答案 0 :(得分:1)

我不是专家,其他人可以给你更好的答案但是......

不要以声明方式列出安装产品所需的步骤 - 您最终会做出最终证明是错误的假设。相反,您应该考虑定义安装的最终状态,并让安装人员担心如何实现这一点。

另一个考虑因素是降级可能会导致巨大的复杂性,具体取决于您的产品 - 它是否必须降级数据库模式/文件格式/ ???简而言之,您的应用的每个版本都需要完全向前兼容和向后兼容(或至少优雅地失败)。还要考虑应用程序的V1将设置存储在文件中的情况。 V2出现并添加更多设置。您降级到V1 - 更改设置时应该怎么做?保留V2设置?抛弃他们?某些V2设置是否会改变V1设置的影响/含义?这些决定是由您的应用或安装人员做出的吗?

无论如何,除此之外,我至少说你需要:

  • 一个中央服务器/服务器场,每个版本的应用程序都有完整的文件,还有一些API / Web服务允许安装程序检索文件/文件集/ ???视情况而定(您可以将其绑定到源控制系统,如svn)
  • 以与环境无关的方式指定系统所需的安装后状态的某种方式(思考安装路径 - /usr/??? - 应该在Windows上映射到C:\Users\???C:\Program Files ?另外不要忘记它可能是64位机器,因此可能是C:\Program Files (x86)
  • 为多个平台编写的非常聪明的安装程序,尽可能多地重用代码(Java,Mono,???)

安装程序应该(简单地):

  • 确定所需的产品版本。
  • 下载/阅读相应的清单。
  • 将所需情况与当前情况进行比较(注意:本地系统上当前的情况,而不是根据当前版本的清单应该在系统上)
  • 生成一个步骤列表以协调两者,同时考虑任何依赖关系(在复制文件之前无法设置文件权限)。您可以使用校验和/散列/类似方法将现有文件与所需文件进行比较 - 从而只下载实际需要的文件。
  • 可能需要完整备份
  • 下载/解压缩所需文件。
  • 下载/解压第三方依赖项 - 稍后.Net Framework版本/类似
  • 尽可能以原子方式执行安装步骤(至少记录所采取的步骤以便撤消)
  • 可能应用任何版本跳转特定更改(上/下级db,配置文件等)
  • 尽可能验证安装(校验和再次)

这些都没有解决安装程序本身需要升级时该怎么做的问题。

我在Windows上使用的一种技术是安装程序可执行文件本身只不过是一个包装器,它包含一些在运行时动态加载实际安装程序的接口 - 因此我可以移动文件关于/卸载/重新加载程序集等。从一个几乎永远不变的固定过程中。

正如我上面所说,我绝对不是专家,只是一个自己完成了一些工作的新手。我相信你可以从别人那里得到更完整的答案,但我希望这有点帮助