【问题标题】:How to validate an upgrade before installation如何在安装前验证升级
【发布时间】:2012-09-26 10:26:52
【问题描述】:

我们有一个已获得许可的 Eclipse 功能,并且该许可由我们自己的代码处理。用户可以进入我们的更新站点并升级他的功能。我们面临的问题是用户的许可证需要更新才能使用新的升级。

我想做的是根据用户许可证验证功能版本,并警告用户在安装之前需要更新他的许可证。

我想我会使用自定义的 eclipse p2 touchPoint 操作 validateLicense 来做到这一点。

例子:

我的代码被调用,我根据用户的许可证验证版本。如果失败,我会警告用户,然后他可以取消安装。

所以我的第一个问题是:

  • 我做对了吗,还是有其他方法可以做到这一点?

我的第二个问题非常基础:

  • 我在哪里告诉 eclipse 运行我的代码? 我看过here at eclipse help 他们解释它是什么的地方。但我不明白将信息放在哪里来运行我的代码?是否在 feature.xml 中。

最后:

  • 有如何创建和使用 p2 touchPonts 的示例吗?

【问题讨论】:

    标签: eclipse eclipse-rcp eclipse-plugin p2


    【解决方案1】:

    我实现了一个自定义操作,如 here 所示,我有一个似乎可以工作的系统。我省略了“接触点”扩展,因为在我的情况下它是不必要的,但其余的都是一样的。

    我的操作是在我的功能(instructions.install)的安装阶段执行的,但也许配置阶段也可以工作。收集阶段不起作用。

    该动作在安装过程中执行,下载完成后。理想情况下它会在下载之前,但这对我来说不是一个大问题。从操作返回错误状态会取消安装。它会留下一些下载的文件,但它们没有被激活,并且可能稍后被 p2 的垃圾收集器删除。

    我还设法做了一些更有趣的事情。我的操作插件对我的主插件有依赖关系(可选且非贪婪)。所以安装是这样的:

    • 动作插件已下载
    • 执行自定义操作
    • 该操作检测我的主插件是否已安装,如果是,则调用它以检索许可信息。主插件必须为该操作公开一个 API。该操作还会检查主插件的版本以检测 API 是否存在。
    • 该操作现在可以决定是继续还是取消安装。它甚至可以使用 Display#syncExec 与用户交互(这是 checkTrust 阶段的代码所做的,所以我认为它是安全的)。如果需要,该操作还可以检测安装是否无头。

    一些陷阱:

    • 必须对操作本身进行版本控制。它是您在 plugin.xml 和 p2.inf 文件中声明的版本,它与插件的版本不同。我只是将 1.0.0 替换为与我的插件相同的版本。这样,动作插件的最新版本总是在执行之前被下载。这很棒,因为现在许可规则的任何问题更改都可以在操作插件中实现。
    • 在 Eclipse 3.5 和 3.6 之间更改了操作 API。我可能会放弃对 3.5 的支持,因为它已经很老了。
    • 可能应该对操作插件进行签名。我的情况就是这样。该系统对我来说似乎太强大了,因为只需将 Eclipse 指向更新站点即可执行下载的代码。

    我仍然需要测试它如何与不同版本的 Eclipse 和其他 IDE 一起工作。我在 3.6 中看到了一个奇怪的(非阻塞)错误。然而,结果是有希望的,而且看起来该系统可能真的可以工作。

    【讨论】:

    • 这真的很棒!谢谢
    【解决方案2】:

    接触点在安装时执行,这意味着解决(验证)已经发生。我不确定他们是否会提供帮助。如何创建代表用户已安装许可证的可安装单元 (IU)(或 Eclipse 功能)。然后,您可以将您的产品依赖于该许可证。

    例如,创建一个名为 com.mycompany.license (1.0.0) 的 IU。您将创建另一个名为 com.mycompany.license (2.0.0) 的文件。安装许可证后,相应的 IU 将添加到配置文件中。

    现在,当您安装产品时,产品的新版本需要 2.0.0 版许可证。如果未安装此许可证,则解析将失败。

    这有意义吗?你认为这会有所帮助吗?

    【讨论】:

    • 这是一个有趣的想法,但这会让我运行代码成为可能吗?它发生在安装之前还是之后并不重要,只是它发生在安装前后。在您知道的某个地方是否有一些关于此的好的文档?
    • 为什么要运行代码?如果您需要运行任意代码,那么是的,您将需要一个接触点。但是接触点不会导致安装失败(好吧,我想您可以抛出异常并尝试回滚所有内容,但这并不是他们的工作)。如果您想验证许可证是否确实正确,我会在运行时(而不是安装时)执行此操作,并且只需使用 IU 技巧来确保用户不会处于无效状态。至于文档,这里有一点wiki.eclipse.org/Equinox/p2/Customizing_Metadata
    • 验证需要运行一些代码才能验证。即检查服务器或在某些情况下只检查“密钥库”。在检查期间抛出异常或仅返回 false 的想法是我想要做的,就像您缺少依赖项一样。但我就是无法让它工作。我会仔细看看 IU,但乍一看它似乎并没有真正帮助我。谢谢你!
    • 在我的测试中,一个操作可以通过简单地从执行方法返回一个错误状态来导致安装失败。
    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 2011-03-11
    • 2020-08-17
    • 2011-04-25
    • 2018-10-14
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多