百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Elixir实战:11 组件工作 (4) 配置应用程序

myzbx 2025-01-21 20:01 53 浏览

一个 OTP 应用程序可以使用称为应用环境的功能进行配置——一个键值的内存存储,其中键是原子,值是 Elixir 术语。您可以通过配置脚本文件提供应用环境值——位于配置文件夹中的 Elixir 脚本。

mix 工具确保在应用程序启动之前,配置已加载到应用程序环境中。最后,您可以使用 Application 模块中的函数检索环境值。

11.4.1 应用环境

让我们看一个简单的例子。待办事项 HTTP 服务器当前监听一个硬编码的端口:5454。在这个例子中,您将通过操作系统环境变量使 HTTP 端口可配置。

设置应用程序环境的最典型方法是使用 config/runtime.exs 文件。这是一个在运行时评估的脚本,正好在应用程序启动之前。在这里,您可以设置应用程序的环境配置以及其任何依赖项。

要使 HTTP 端口可配置,您可以从操作系统环境变量中读取配置并将其存储到应用程序环境中。

清单 11.14 配置 HTTP 端口 (todo_env/config/runtime.exs)

import Config                                           
 
http_port = System.get_env("TODO_HTTP_PORT", "5454")    
config :todo, http_port: String.to_integer(http_port)   

导入配置助手

读取操作系统环境变量

设置应用程序的环境值

在这里,您使用 System.get_env/2 读取操作系统环境变量 TODO_HTTP_PORT ,如果该变量未设置,则使用默认值 5454 。然后,您使用导入的 Config.config/2 函数来配置 :http_port 设置的 :todo 应用程序。

一旦您启动系统,此设置在应用环境中可用,您可以检索它——例如,使用 Application.fetch_env!/2 函数:

$ iex -S mix
 
iex(1)> Application.fetch_env!(:todo, :http_port)
5454

在系统启动之前设置操作系统环境变量会影响应用程序环境:

$ TODO_HTTP_PORT=1337 iex -S mix
 
iex(1)> Application.fetch_env!(:todo, :http_port)
1337

现在,您可以调整 Todo.Web 的代码以从应用程序环境中读取端口。

列表 11.15 获取 http_port 设置 (todo_env/lib/todo/web.ex)

defmodule Todo.Web do
  ...
 
  def child_spec(_arg) do
    Plug.Cowboy.child_spec(
      scheme: :http,
      options: [port: Application.fetch_env!(:todo, :http_port)],   
      plug: __MODULE__
    )
  end
 
  ...
end

从 :todo 应用环境中检索 HTTP 端口

在这种情况下,您使用 Application.fetch_env!/2 ,如果未配置 HTTP 端口,将会引发错误。要提供一个默认值(如果未设置),您可以使用 Application .get_env/3 (https://hexdocs.pm/elixir/Application.xhtml#get_env/3)。

11.4.2 变化配置

在某些情况下,您可能希望在不同的 Mix 环境中使用不同的设置。例如,您当前在开发和测试中始终使用相同的 HTTP 端口。因此,如果待办事项系统在开发中启动,您将无法运行测试。解决此问题的方法是在测试 Mix 环境中使用不同的 HTTP 端口。

注意 值得注意的是,环境一词被过度使用。应用环境是一个键值存储,保存您 OTP 应用程序的各种设置。Mix 环境确定编译目标,例如开发、测试或生产。最后,操作系统环境由当前 shell 会话中存在的操作系统级变量组成。

要在不同的 Mix 环境中更改设置,您需要对 config/runtime.exs 进行一些更改。

列表 11.16 混合环境特定设置 (todo_env/config/runtime.exs)

import Config
 
http_port =
  if config_env() != :test,                              
    do: System.get_env("TODO_HTTP_PORT", "5454"),        
    else: System.get_env("TODO_TEST_HTTP_PORT", "5455")  
 
config :todo, http_port: String.to_integer(http_port)

基于混合环境做出决策

在这里,您依赖导入的 Config.config_env/0 来确定用于构建项目的 Mix 环境。然后,在测试环境中,您将使用不同的操作系统环境变量和不同的默认 HTTP 端口。应用环境名称始终相同( :http_port ),因此其余代码无需更改。

让我们快速验证一下这是否有效。在默认开发环境中启动应用程序:

$ iex -S mix
 
iex(1)> Application.fetch_env!(:todo, :http_port)
5454

现在,在测试环境中尝试相同的操作:

$ MIX_ENV=test iex -S mix
 
iex(1)> Application.fetch_env!(:todo, :http_port)
5455

此时,即使系统在另一个操作系统进程中启动,您也可以运行测试。

还有一个额外的不便之处。数据库文件夹目前始终是相同的,无论混合环境如何。因此,运行测试将污染您当前的开发数据。

为了避免这种情况,您可以使数据库文件夹可配置,使用不同的操作系统环境变量和测试环境中的不同默认值,就像您对 HTTP 端口所做的那样。为了简洁起见,这里不提供代码,但建议您自己尝试或查看 todo_env 文件夹中的实现。

11.4.3 配置脚本注意事项

值得一提的是,Elixir 还支持构建时配置脚本。如果您创建 config/config.exs 文件,该脚本将在项目编译之前进行评估。因此,您从外部源(例如操作系统环境)读取的任何设置都是在构建机器上完成的。

如果您在与运行系统的机器不同的机器上构建系统(这是一种良好的实践),系统可能会最终配置不正确。由于这种微妙的混淆,以及由于其特殊的语义(它在编译时被评估),尽量少使用 config.exs。在大多数情况下,runtime.exs 应该满足您所有的需求。

如果您正在开发一个库,请尽量避免通过应用程序环境传递参数。如果一个库通过应用程序环境接受参数,那么其用户就被迫通过配置脚本提供这些值。一个更灵活的方法是设计库的 API,使其接受所有参数作为函数参数。采用这种方法,库的用户在决定如何提供参数时拥有完全的自由。他们可以硬编码参数,通过应用程序环境配置参数,或者在运行时从外部源获取参数。有关更多详细信息,请参阅官方文档中的“库指南”页面(https://hexdocs.pm/elixir/library-guidelines.xhtml#avoid-application-configuration)。

摘要

  • OTP 应用程序是一个可重用的组件。该应用程序可以运行整个监督树或仅提供实用模块(如在库应用程序中)。
  • 非库应用程序是一个必须启动监督树的回调模块。
  • 应用程序允许您指定对其他应用程序的运行时依赖关系。这与编译时依赖关系不同,后者允许您从项目中获取外部代码并进行编译。
  • 应用环境允许您提供应用程序设置。如果您想向系统操作员公开一些配置,这可能会很有用。

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...