Elixir v1.9具有发行版本支持,改进的配置等功能.

我们也很高兴地宣布, 费尔南多·塔皮亚·里科(Fernando Tapia Rico)已加入Elixir核心团队. Fernando通过修复错误和改进Elixir在许多不同领域(例如代码格式化程序,IEX,编译器等),在保持问题跟踪器整洁方面非常有用.

现在,让我们看一下此新版本中的新增功能.

Releases

Elixir v1.9的主要功能是增加了发行版. 发布是一个自包含的目录,其中包含应用程序代码,所有依赖关系以及整个Erlang虚拟机(VM)和运行时. 组装发行版后,只要目标在与运行mix release命令的机器相同的操作系统(OS)发行版和版本上运行,就可以将其打包并部署到目标.

保罗·斯科恩菲尔德(Paul Schoenfelder)关于酿酒厂的工作(以及之前的EXRM)使发行一直是Elixir社区的一部分. Distillery于2016年7月宣布.然后在2017年, DockYard聘请Paul致力于改进部署,这项工作将促成 Distillery 2.0的发展 . Distillery 2.0在社区努力建立公约和最佳实践(例如配置)的领域提供了重要的答案.

在今年年初, 借助Plataformatec ,我能够确定将发布直接带入Elixir的工作的优先级. Paul知道我们希望在Elixir本身中发布版本,在ElixirConf 2018期间,我宣布发布是Elixir的最后一个计划功能.

Elixir发行的目的是加倍Distillery提供的最重要的概念,并为社区可能发现的其他重要方面提供扩展点. PaulTristan (维护Erlang的relx )对Elixir的实现提供了出色的反馈,对此我们非常感谢. Hex软件包管理器已经在生产中使用版本 ,我们也从其他公司获得了反馈.

足够的背景知识,让我们看看为什么要使用发行版以及如何组合发行版.

Why releases?

版本允许开发人员将所有代码和运行时预编译并打包到一个单元中. 发布的好处是:

  • 代码预加载. VM具有两种加载代码的机制:交互式和嵌入式. 默认情况下,它以交互模式运行,该交互模式在首次使用模块时动态加载模块. 您的应用程序第一次调用Enum.map/2 ,VM将找到Enum模块并加载它. 有一个缺点. 在生产环境中启动新服务器时,它可能需要加载许多其他模块,从而导致第一个请求的响应时间异常增加. 版本以嵌入式模式运行,该模式会预先加载所有可用的模块,从而确保您的系统已准备好在引导后处理请求.

  • 配置和定制. 通过发行版,开发人员可以对系统配置和用于启动系统的VM标志进行精细控制.

  • 自成体系. 发布不需要将源代码包含在生产工件中. 所有代码都已预编译和打包. 发行版甚至不需要在服务器中使用Erlang或Elixir,因为它们默认包含Erlang VM及其运行时. 此外,Erlang和Elixir标准库都被剥离,仅带出您实际使用的部件.

  • 多个版本. 您可以使用每个应用程序甚至不同的应用程序组装具有不同配置的不同发行版.

  • 管理脚本. 发行版附带脚本来启动,重新启动,远程连接到正在运行的系统,执行RPC调用,作为守护程序运行,作为Windows服务运行等等.

1, 2, 3: released assembled!

您可以通过三个简单的步骤启动一个新项目并为其组合发行版本:

$ mix new my_app
$ cd my_app
$ MIX_ENV=prod mix release

将在_build/prod/rel/my_app组装发行版. 在版本内部,将有一个bin/my_app文件,这是您系统的入口点. 它支持多个命令,例如:

  • bin/my_app startbin/my_app start_iexbin/my_app restartbin/my_app stop -用于释放的一般管理

  • bin/my_app rpc COMMANDbin/my_app remote -用于在正在运行的系统上运行命令或连接到正在运行的系统

  • bin/my_app eval COMMAND启动运行单个命令的新系统,然后关闭

  • bin/my_app daemonbin/my_app daemon bin/my_app daemon_iex在类Unix系统上作为守护程序启动系统

  • bin/my_app install在Windows机器上将系统作为服务安装

Hooks and Configuration

版本还提供了内置的挂钩,用于配置生产系统的几乎所有需求:

  • config/config.exs (和config/prod.exs )-提供构建时应用程序配置,该配置在发布发行版时执行

  • config/releases.exs提供运行时应用程序配置. 它在每次发行版启动时执行,并可通过配置提供程序进一步扩展

  • rel/vm.args.eex复制到每个发行版中的模板文件,并提供Erlang虚拟机的静态配置和其他运行时标志

  • rel/env.sh.eexrel/env.bat.eex复制到每个发行版中并在每个命令上执行以设置环境变量(包括特定于VM的环境变量)的模板文件

我们已经发布了有关发行版的大量文档 ,因此建议您查看一下以获取更多信息.

Configuration

我们还使用发行版上的工作来简化Elixir的配置API. 新的Config模块已添加到Elixir. 先前的配置API Mix.Config是Mix构建工具的一部分. 但是,由于发行版提供了运行时配置,并且发行版中未包含Mix,因此我们将Mix.Config API移植到Elixir. 换句话说, use Mix.Config已被软弃用,以支持import Config .

与配置相关的另一个重要更改是, mix new将不再生成config/config.exs文件. 大多数库都不希望依靠配置,并且生成的配置文件会将库作者推向错误的方向. 此外, mix new --umbrella将不再为每个子应用程序生成配置,而是应在伞根中声明所有配置. 这就是它一直以来的行为方式,我们现在将其明确.

Other improvements

Elixir v1.9还有许多其他增强功能. 为了获得最佳支持版本,Elixir CLI提供了一些新选项. Logger现在以分散的方式计算其同步/异步/丢弃阈值,从而减少了争用. EEx (嵌入式Elixir)模板支持比以前更复杂的表达式. 最后,有一个新的~U印记与UTC DateTime是否以及新功能的工作FileRegistrySystem模块.

What’s next?

如前所述,发布是Elixir的最后计划功能. 我们没有任何主要的面向用户的功能,也没有计划. 我知道某些人会认为这一事实是本公告中最令人激动的部分!

当然,这并不意味着v1.9是最新的Elixir版本. 我们将每6个月继续发布具有增强功能,错误修复和改进功能的新版本. 您可以查看问题跟踪器以获取更多详细信息.

我们还在努力进行一些结构性更改. 其中之一是将mix xref传递到编译器中,这将使我们能够在更多地方发出未定义的函数和弃用警告. 我们也正在考虑迁移到Cirrus-CI ,因此我们可以通过一项服务在Windows,Unix和FreeBSD上测试Elixir.

同样重要的是,我们有两个主要的原因可以使我们有一个空的积压.

首先,Elixir建立在Erlang / OTP的基础上,我们只需利用爱立信和OTP团队在运行时和虚拟机上所做的所有工作即可. Elixir团队一直致力于尽可能多地做出贡献,并且这些贡献在最近几年中有所增加.

其次,Elixir被设计为可扩展的语言. 库和框架也可以使用我们用来创建和增强语言的相同工具和抽象. 这意味着社区可以继续改善生态系统,而无需更改语言本身,而这实际上将成为进步的瓶颈.

检查"安装"部分安装 Elixir,并阅读我们的《 入门指南》以了解更多信息. 我们还更新了我们的高级Mix&OTP以讨论发行. 如果您想对这种语言进行更快速的介绍,请参阅" 如何开始:Elixir"教程,该教程也已被带到了最新和最伟大的地方.

Have fun!