4

我定义了一个与guide-started相关的环境变量,我的mix.exs

defmodule Basic.Mixfile do
  use Mix.Project

  def project do
    [app: :basic,
     version: "0.0.1",
     elixir: "~> 0.13.0-dev",
     deps: deps,
     env: [
      dev: [foo: "bar"] ] ]
  end

  # Configuration for the OTP application
  #
  # Type `mix help compile.app` for more information
  def application do
    [ applications: [],
      mod: { Basic, [] } ]
  end

  # List all dependencies in the format:
  #
  # { :foobar, git: "https://github.com/elixir-lang/foobar.git", tag: "0.1" }
  #
  # Type `mix help deps` for more examples and options
  defp deps do
    []
  end
end

然后我用iex -S mixor开始项目MIX_ENV=dev iex -S mix,我想用 获取环境变量:application.get_env(:basic, :foo),它变成了:undefined; 并使用:application.get_all_env(:basic),它返回[included_applications: []],没有env变量。我的问题是我应该如何获得环境价值?

4

4 回答 4

9

:env不能在应用程序中指定,而是project在应用程序中指定。

def application do
  [ applications: [],
    mod: { Basic, [] },
    env: [foo: :bar] ]
end

然后你可以访问它:

Application.get_env(:basic, :foo)

在这种情况下,不支持为特定的 MIX_ENV(如 dev 或 prod)指定环境。这正是:envinsideproject被弃用的原因。有两个键被命名:env为不同的行为是混淆的秘诀。:)

于 2014-05-01T10:06:39.957 回答
2

我认为Mix.project[:foo]当 MIX_ENV 是时返回定义的值(“bar”)dev。但是,由于在 v0.13.1 中显示以下警告,因此可能不是推荐的方式。

"The :env key in Basic.Mixfile project configuration is deprecated" 

如果用于配置设置,https://github.com/phoenixframework/ex_conf也有基于环境的配置功能。

于 2014-05-01T05:31:40.170 回答
1

对于您的需求来说,这可能有点过头了,但 Avdi Grimm 最近将 dotenv 移植到 Elixir

于 2014-04-30T19:06:17.780 回答
1

使用env = :application.get_env(:example, Mix.env). 这将返回您:dev在 mix.exs 文件中的键下定义的关键字列表。然后,您可以使用Keyword.get(env, :foo)来提取各个密钥。

于 2014-04-30T15:40:07.213 回答