Как читать файлы конфигурации в проекте elixir mix

Я создаю проект эликсира для поиска шаблонов в файлах. Я хочу сохранить эти шаблоны в файлах конфигурации, чтобы можно было легко вносить изменения в приложение. Моя первая идея - сохранить эти файлы как файлы exs в папке config в проекте mix. Итак, вопросы:

  1. Есть ли простой способ сохранить конфигурацию в файлах со списком ключевых слов?
  2. Как мне загрузить его в приложение?

Я вижу, что для чтения файла есть такие модули, как File, но нет ли стандартного способа анализировать списки ключевых слов в elixir? Я думал о чем-то похожем на файлы yml в Rails.


person Batou99    schedule 27.05.2014    source источник
comment
Почему бы просто не использовать конфигурацию, предоставленную Elixir? Он предназначен для работы с OTP и существующими приложениями Elixir. Зачем предлагать что-то новое?   -  person José Valim    schedule 28.05.2014
comment
Вы имеете в виду mix.exs? Я думал об этом, но для сложного приложения это может быть очень переполнено, поэтому я подумал о том, чтобы разделить его на разные файлы. Есть ли в Интернете какие-либо ресурсы о том, как правильно настраивать приложения Elixir? Я очень заинтересован в том, чтобы не изобретать велосипед, если решение уже существует.   -  person Batou99    schedule 28.05.2014
comment
Нет, он говорит о новом файле config / config.exs, представленном в 0.13.2. Вы можете указать ключ конфигурации в mix.exs и использовать интерполяцию для эмуляции конфигурации по среде.   -  person bitwalker    schedule 28.05.2014
comment
Ага, я имел в виду новый config/config.exs. Если вы загрузите последнюю версию Elixir и создадите новый проект, вы увидите новый файл с комментариями о том, как его использовать.   -  person José Valim    schedule 29.05.2014
comment
В документации фактически не говорится, как получить доступ к этим значениям конфигурации внутри программы на Эликсире.   -  person nicholasf    schedule 01.06.2014
comment
См. groups.google.com/forum/#!topic/elixir. -lang-talk / kixyuzLFbbw   -  person nicholasf    schedule 01.06.2014


Ответы (2)


Вы можете читать списки ключевых слов, хранящиеся в файле * .exs, используя Mix.Config.read(path). Для записи условий Elixir в файл * .exs вы можете использовать Inspect.Algebra.to_doc(%Inspect.Opts{pretty: true}) и записать полученное строковое содержимое в файл с помощью File.write. Он не так хорошо отформатирован, как если бы вы делали это вручную, но он определенно все еще читается.

Если вы не против использования терминов Erlang, вы можете легко их читать и писать, используя :file.consult(path) и :file.write_file(:io_lib.fwrite('~p.\n', [config]), path) соответственно.

person bitwalker    schedule 27.05.2014
comment
Это хорошо, но списки ключевых слов слишком просты для настройки, разве нет ничего похожего, что поддерживает Карты? - person Batou99; 28.05.2014
comment
Файл просто оценен. Вы можете получить там буквально все, что захотите. Просто проверьте, как реализовано Mix.Config.read/1 (это довольно просто). - person José Valim; 28.05.2014
comment
Вы имеете в виду Mix.Config.read!/1, верно? Или что-то изменилось с тех пор, как был опубликован этот ответ? - person Lstor; 09.05.2015
comment
Будьте осторожны: кодировка по умолчанию file.write_file - latin1 - person Michael Terry; 24.09.2016
comment
Да, вы можете передать [encoding: :utf8] в качестве третьего параметра, чтобы изменить это. - person bitwalker; 27.09.2016

Использование Code.eval_file

Другой вариант - оценить файл как файл кода, используя Code.eval_file и получите результат в виде конструкции эликсира.

Файл конфигурации config1.ex:

%{configKey1: "configValue1", configKey2: "configValue2"} 

Чтение файла:

{content, _} = Code.eval_file("config1.ex")

* при оценке файла кода необходимо учитывать соображения безопасности.

Относительно использования Mix.Config.read! в правильном ответе @bitwalker

файл конфигурации должен быть в определенном формате:

[
   appName: [key1: "val1", key2: "val2"]
]

В Mix.Config. читать код, он пытается проверить содержимое и ожидать, что будет основной список ключевых слов [ {}, {}.. ], который включает ключи, которые также имеют значение типа список ключевых слов.

Код не длинный:

 def validate!(config) do
    if is_list(config) do
      Enum.all?(config, fn
        {app, value} when is_atom(app) ->
          if Keyword.keyword?(value) do
            true
          else
            raise ArgumentError,
              "expected config for app #{inspect app} to return keyword list, got: #{inspect value}"
          end
        _ ->
          false
      end)
    else
      raise ArgumentError,
        "expected config file to return keyword list, got: #{inspect config}"
    end
  end

Мы можем обойти и использовать первый ключ, который не является атомом, а затем проверка остановится, но не выбросит:

[
  {"mockFirstKey", "mockValue"},
  myKey1: "myValue1",
  myKey2: "myValue2"
]
person elpddev    schedule 10.05.2017