2016-02-10 8 views
7

私は、Herokuへのデプロイ時にはthisガイドを、電子メールを送信する場合はthisに従っていました。HerokuとMailgunの環境変数Phoenix Frameworkの問題

開発中はすべて正常に動作します。私の変数は、Herokuのに設定されています

heroku config 
... 
MAILGUN_DOMAIN: https://api.mailgun.net/v3/xxxxxx.mailgun.org 
MAILGUN_KEY:  key-3-xxxxxx 
... 

そしてそうのような設定ファイルからロードされた:

config :take_two, Mailer, 
    domain: System.get_env("MAILGUN_DOMAIN"), 
    key: System.get_env("MAILGUN_KEY") 

しかし、私はMailgunの設定は、私が取得する環境変数から設定されている場合はHerokuの上、メールを送信しようとすると、このエラー:

** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1 
    (elixir) lib/io.ex:346: IO.chardata_to_string(nil) 
    (elixir) lib/path.ex:467: Path.join/2 
    (elixir) lib/path.ex:449: Path.join/1 
      lib/client.ex:44: Mailgun.Client.send_without_attachments/2 

これは、ドメインがMailgun Client用に設定されていない場合に発生します。しかし、環境変数から設定されているはずです。私はテストを簡単なモジュールを作った:

defmodule TakeTwo.Mailer do 
    require Logger 

    use Mailgun.Client, 
     Application.get_env(:take_two, Mailer) 

    def blank_shot do 
     Logger.info Application.get_env(:take_two, Mailer)[:domain] 
     Logger.info Application.get_env(:take_two, Mailer)[:key] 
     send_email from: "[email protected]", to: "[email protected]", subject: "Hello", text: "This is a blank shot" 
    end 

私はTakeTwo.Mailer.blank_shotを実行すると、私は正しいドメイン/キー変数はエラーが続いログ出力さご覧ください。私は、リモートでMailgunクライアントをデバッグする方法がわかりません。

最後に、(上記のモジュールをシェルのheroku run iex -S mixの後に再作成した場合)はうまく動作します。

元のモジュールがロードされているような気がしますが、おそらく環境変数はまだロードされていませんか?

+0

私が気づいた違いは、 '' use'''がモジュールに渡され、次にドメインとキーを含むキーワードリストが渡されたことです。この例では、モジュールと '' Application.get_env((:take_two、Mailer)) '' 'を渡すだけです。これはタプルを返します。 https://github.com/chrismccord/mailgun –

+0

ありがとう@ TheBrofessor、私はそれを両方の方法で試してみたところ、ローカルで動作するようでした。私は、Application.get_envがキーワードリストを返したことを確信しています。私はChrisの例がモジュール属性を使用しているので、同じ結果を試してみたことに気づいています。 'TakeTwo.Mailer.conf'は両方の値が' nil'であることを示します。私はそのレポに関する関連する問題を発見しました。 - Herokuビルドパックがコンパイルする前に環境変数をロードしていないような気がします。だから私はこれが次の作品だと思う。 – speg

+2

オハイオ州スナップ。 https://github.com/HashNuke/heroku-buildpack-elixir#specifying-config-vars-to-export-at-compile-timeには答えがあります。コンパイル時にどのHeroku設定変数をエクスポートするかを明示的に定義する必要があることが分かります。愚かな私は彼らがすべて自動的に輸出されると仮定した。 – speg

答えて

7

答えは少しコメントに埋もれていたので、見つけやすくしたかったのです。他の答えは述べているように、環境変数は使用できませんが、buildpackはあなたがなるためにそれらを設定できます:

私は elixir_buildpack.configファイルを作成して、コメントを追加し、次の:私はクリスMcoords見

config_vars_to_export=(DATABASE_URL MAILGUN_DOMAIN MAILGUN_KEY SECRET_KEY_BASE) 
+1

これは廃止され、すべての設定値がデフォルトでエクスポートされることに注意する価値があります。 https://github.com/HashNuke/heroku-buildpack-elixir#migrating-from-previous-build-pack –

1

環境変数はビルド時には使用できません。私は同じ問題を抱えており、構成を運んでいるマクロを取り除くことに決めました。あなたはthis patchを使って進むことができます。