如何在不退出iex的情况下更新config.exs数据?

问题描述 投票:0回答:1

我的代码如下:

import Config

# config :logger, :console, format: "[$level] $metadata$message\n",
#   metadata: [:module, :function, :my_id]
    
    
config Mechanics,
ptz_port: "tty.usbserial-1410", 
ptz_speed: 115200, 
ptz_check_interval: 5000 

ptz_port 已从“tty.usbserial-1420”更改为“tty.usbserial-1410”

iex(16)> Application.get_all_env(Mechanics)          
[
  ptz_check_interval: 5000,
  imu_speed: 115200,
  ptz_port: "tty.usbserial-1430",
  testkey1: "value1",
  imu_port: "tty.usbserial-1420",
  ptz_speed: 115200,
  imu_pose: "horizon",
  imu_check_interval: 5000,
  key2: "value2"
] 

当我尝试通过调用

Config.config_env()
更新配置时,错误如下。是否可以在 iex 中通过命令更新配置而不退出它?

iex(18)> Config.config_env()
** (RuntimeError) could not set configuration via Config. This usually means you are trying to execute a configuration file directly, instead of reading it with Config.Reader
    (elixir 1.13.4) lib/config.ex:91: Config.raise_improper_use!/0
    (elixir 1.13.4) lib/config.ex:190: Config.__env__!/0
elixir
1个回答
1
投票

config.exs
在编译时读取。如果您希望在应用程序启动时读取这些值,您可以将值放入
runtime.exs
中。除了必须在编译时配置的一些技术例外之外,运行时值将覆盖编译时值——也许这就是您的
ptz_port
值被覆盖的方式。

在任何一种情况下,这些值都会被读入应用程序的进程字典中,因此可以在运行时读取和修改它们(例如,当您处于

iex
会话时)。例如,您可以使用如下语句将值放入应用程序的进程字典中:

Application.put_env(Mechanics, ptz_speed: 4567)

有一个

Application.put_all_env/2
功能,但为此目的尝试重用现有配置文件时可能会遇到困难。

© www.soinside.com 2019 - 2024. All rights reserved.