Hex 2.0 不再支持 Elixir 1.0-1.4。Hex 1.0 将继续维护,但只会收到安全更新。有关更多详细信息,请参阅Hex 1.0 发布公告。
2.0 中最大的变化是我们新的版本求解器 hex_solver 的引入。包管理器的版本求解器需要能够找到一组兼容包的最新版本,这些版本不违反用户为每个包指定的版本要求,它需要在合理的时间内完成,并且如果版本求解失败,它需要显示一个清晰的消息来解释失败的原因。
当前的求解器算法自 2014 年初 Hex 开始开发以来一直存在。自其引入以来,它已经进行了许多改进,例如性能改进和更好的错误消息,但底层算法基本上保持不变。最近出现了一些问题,求解器似乎冻结了(实际上它并没有冻结,只是需要很长时间才能找到解决方案),随着 Elixir 项目的复杂性和依赖项数量的增长以及 Hex 仓库越来越大,这个问题变得越来越普遍。
版本求解可以推广到布尔可满足性问题,因此时间复杂度是 NP 完全的,这意味着没有已知的算法可以针对较大的输入集快速解决它。SAT 求解器 存在,它们仍然可以为许多输入在合理的时间内求解。SAT 求解器的问题在于它们是通用的,不能使用任何针对版本求解特定问题域的优化,另一个问题是通常有很多解决方案满足版本要求,但我们期望包管理器始终使用最新的兼容版本。最后,SAT 求解器无法创建解释性错误消息来解释求解失败的原因。
考虑到这一点,我们选择将我们的新求解器基于Natalie Weizenbaum 的 PubGrub,而 PubGrub 又基于冲突驱动子句学习。PubGrub 用于 Dart 编程语言包管理器 pub。
当传统版本求解器遇到冲突版本时,它们只会回溯到可能引入冲突版本的包,并尝试不同的版本。这种方法的问题在于很难推断出冲突的根本原因,并且通常会多次尝试相同的包版本组合,即使已知它们不兼容。PubGrub 通过记录冲突的根本原因来解决这个问题,然后可以跳过所有导致冲突的包版本组合,并避免搜索空间的很大一部分。记录冲突原因还有一个额外的好处,我们可以使用它们来创建人类可读的错误消息,这些消息逐步解释了如果找不到解决方案,求解失败的原因。
我们计划用基于Mint 的 HTTP 客户端替换 Hex 中当前使用httpc 的 HTTP 客户端。Mint 支持 HTTP/2,因此可能会看到一些性能改进,但最重要的是,使用 Mint,我们将对请求超时进行更细粒度的控制。使用 httpc,超时只能为整个请求设置,但使用 Mint,超时可以基于最后接收到的数据,这应该为在慢速或不可靠的网络上获取大型包的用户提供开箱即用的更好体验。
SSO 登录,最初支持 Okta 和 Google,也在路线图上。除此之外,我们将为 CLI 添加 Web 身份验证,以支持 SSO 和 2FA。
如果你想为这些功能中的任何一个做出贡献,或者你想做其他改进,你可以在 Elixir Slack 上的 #hex 频道中找到 Hex 团队,或者在 GitHub 上找到我们:github.com/hexpm/hexpm 或者 github.com/hexpm/hex。