bitwalker/toml-elixir

module Toml.Provider is not available

absolut777 opened this issue · 4 comments

First of all thank you very much for you work. Live with default erlang's sys.config is terrible:)

I'm trying to use toml with distillery and getting the error when start an application:

/home/app/my_app/bin/my_app start
init terminating in do_boot ({,[{Elixir.Toml.Provider,init,[[_]],[]},{Elixir.Mix.Releases.Config.Provider,-init/1-fun-0-,2,[{_},{_}]},{Elixir.Enum,-reduce/3-lists^foldl/2-0-,3,[{_},{_}]},{Elixir.Mix.R

Crash dump is being written to: erl_crash.dump...done
function Toml.Provider.init/1 is undefined (module Toml.Provider is not available)
    Toml.Provider.init([path: "/etc/my_app/config.toml"])
    (distillery) lib/mix/lib/releases/config/provider.ex:45: anonymous fn/2 in Mix.Releases.Config.Provider.init/1
    (elixir) lib/enum.ex:1940: Enum."-reduce/3-lists^foldl/2-0-"/3
    (distillery) lib/mix/lib/releases/config/provider.ex:38: Mix.Releases.Config.Provider.init/1
    :init.eval_script/2
    :init.do_boot/3

{"init terminating in do_boot",{#{'__exception__'=>true,'__struct__'=>'Elixir.UndefinedFunctionError',arity=>1,function=>init,message=>nil,module=>'Elixir.Toml.Provider',reason=>nil},[{'Elixir.Toml.Provider',init,[[{path,<<"/etc/my_app/config.toml">>}]],[]},{'Elixir.Mix.Releases.Config.Provider','-init/1-fun-0-',2,[{file,"lib/mix/lib/releases/config/provider.ex"},{line,45}]},{'Elixir.Enum','-reduce/3-lists^foldl/2-0-',3,[{file,"lib/enum.ex"},{line,1940}]},{'Elixir.Mix.Releases.Config.Provider',init,1,[{file,"lib/mix/lib/releases/config/provider.ex"},{line,38}]},{init,eval_script,2,[]},{init,do_boot,3,[]}]}}
Unable to configure release!

Release was build with commands:

mix deps.get
MIX_ENV=prod mix release

It seems toml is not included in release and I don't realise why. My environment is below:

mix.exs:

Code.require_file("lib/mix/vectors.exs", __DIR__)

defmodule CtiOmniUmbrella.MixProject do
  use Mix.Project
  import CtiOmniUmbrella.MixProject.Vectors

  def project do
    [
      elixir: "~> 1.8",
      apps_path: "apps",
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      aliases: aliases(),
      test_coverage: [tool: ExCoveralls],
      preferred_cli_env: [
        coveralls: :test,
        "coveralls.detail": :test,
        "coveralls.post": :test,
        "coveralls.html": :test
      ],
      apps: apps(System.get_env("VECTOR")) ++ extra_apps(System.get_env("VECTOR_EXTRA_APPS")),
      aliases: aliases()
    ]
  end

  # nd Dependencies listed here are available only for this
  # project and cannot be accessed from applications inside
  # the apps folder.
  #
  # Run "mix help deps" for examples and options.
  defp deps do
    [
      {:toml, "~> 0.5"},
      {:distillery, "~> 2.0.12", runtime: true},
      {:bootleg, github: "virviil/bootleg", override: true},
      {:bootleg_phoenix, "~> 0.2"}
    ]
  end

  defp aliases do
    [
      "run.my_app": [
        fn _ ->
          :os.cmd('pushd apps/my_app')
        end,
        "phx.server",
        fn _ ->
          :os.cmd('popd')
        end
      ],
      "format.all": [
        "format mix.exs \"apps/**/lib/**/*.{ex,exs}\" \"apps/**/test/**/*.{ex,exs}\" \"apps/**/config/**/*.{ex,exs}\" \"config/**/*.{ex,exs}\""
      ]
    ]
  end
end

rel/config.exs:

# Import all plugins from `rel/plugins`
# They can then be used by adding `plugin MyPlugin` to
# either an environment, or release definition, where
# `MyPlugin` is the name of the plugin module.
Path.join(["rel", "plugins", "*.exs"])
|> Path.wildcard()
|> Enum.map(&Code.eval_file(&1))

# This sets the default release built by `mix release`
# This sets the default environment used by `mix release`
use Mix.Releases.Config,
  default_release: :default,
  default_environment: Mix.env()

# For a full list of config options for both releases
# and environments, visit https://hexdocs.pm/distillery/configuration.html

# You may define one or more environments in this file,
# an environment's settings will override those of a release
# when building in that environment, this combination of release
# and environment configuration is called a profile
environment :dev do
  set(dev_mode: true)
  set(include_erts: false)
  set(cookie: :"K}Qhp5,M6&cv5W:Q^](/P|uU$y]zf^DS.P<8QzsC8`%VHnVtdw>|gU?.2xqX)8SW")
end

environment :stage1 do
  set(include_erts: true)
  set(include_system_libs: true)
  set(include_src: false)
end
environment :prod do
  set(include_erts: true)
  set(include_src: false)
  set(cookie: :my_app)
end

# You may define one or more releases in this file.
# If you have not set a default release, or selected one
# when running `mix release`, the first release in the file
# will be used by default

release :my_app do
  set(version: current_version(:my_app))

  set config_providers: [
    {Toml.Provider, [path: "/etc/my_app/config.toml"]}
  ]

  set(
    applications: [
      :runtime_tools,
      :my_app,
      :eventbus,
      :router,
#      :router_2,
#      :router_3,
#      :app_4
    ]
  )

  set(
    commands: [
      migrate: "rel/commands/migrate.sh",
      rollback: "rel/commands/rollback.sh",
      seed: "rel/commands/seed.sh",
    ]
  )

  set overlays: [
    {:copy, "apps/my_app/cti-omni-logging.conf", "cti-omni-logging.conf"},
    {:copy, "version", "version"}
  ]

end

Elixir 1.8.1
Erlang 21.2.3
CentOS 7.4

Hm! I've also ran into this one. I tried cleaning out _build... This app used to build and run with distillery...

My Dockerfile is here. https://github.com/djthread/lucidboard/blob/master/assets/ops/release/Dockerfile

I don't know if it's the case for you, but my coworker found out, that I forgot to include toml in the list of included applications in mix.exs

Nice! Thank you, @Awlexus. Adding :toml to my mix.exs's :extra_applications seemed to do the trick.

It works with :extra_applications. Thank you