2016-02-10 28 views
7

Podążałem za this przewodnikiem po instalacji w Heroku i this do wysyłania wiadomości e-mail.Zmienne środowiskowe na Heroku i Mailgunie Problemy z Phoenix Framework

Wszystko działa dobrze w fazie rozwoju. Moi zmienne są ustawione w Heroku:

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

i ładowane z plików konfiguracyjnych tak:

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

Jednak gdy próbuję wysłać wiadomość e-mail na Heroku gdy config Mailgun jest ustawiony od zmiennych środowiskowych, które uzyskuję ten błąd:

** (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 

Dzieje się tak, gdy domena nie jest ustawiona dla klienta Mailgun. Ale powinien być ustawiony ze zmiennej środowiskowej. Zrobiłem prosty moduł do testu:

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 

Kiedy biegnę TakeTwo.Mailer.blank_shot widzę prawidłowa domena/zmienne kluczowe zalogowanego następnie błędu. Nie jestem pewien, jak zdalnie debugować klienta Mailgun.

Wreszcie, jeśli odtworzyć powyższy moduł w powłoce (po uruchomieniu heroku run iex -S mix) działa dobrze !?

Mam wrażenie, że podczas ładowania modułu oryginalnego, zmienne środowiskowe nie zostały jeszcze załadowane?

+0

Kiedy spojrzał na Chrisa Mcoords Przykład klienta mailgun, jedyną różnicą, którą zauważyłem było to, że '' 'use''' przeszedł moduł, a następnie listę słów kluczowych, które zawierają domenę i klucz. Twój przykład przekazuje tylko moduł i '' Application.get_env ((: take_two, Mailer)) '' ', który zwraca krotkę. https://github.com/chrismccord/mailgun –

+0

Dzięki @TheBrofessor, próbowałem go w obie strony i wydawało się działać lokalnie. Jestem prawie pewien, że Application.get_env zwrócił listę słów kluczowych. Zauważam, że przykład Chrisa używa atrybutu modułu, więc próbowałem tego z tymi samymi wynikami. 'TakeTwo.Mailer.conf' pokazuje, że obie wartości to' nil'. Znalazłem powiązany problem z tym repo - czuję, że pakiet kompilacji Heroku nie ładuje zmiennych środowiskowych przed kompilacją. Sądzę więc, że to następny kawałek, na który warto spojrzeć. – speg

+2

Ohhh snap. https://github.com/HashNuke/heroku-buildpack-elixir#specifying-config-vars-to-export-at-compile-time ma odpowiedź. Okazuje się, że musisz wyraźnie określić, które zmienne konfiguracyjne Heroku mają zostać wyeksportowane podczas kompilacji. Głupio, zakładałem, że wszystkie zostaną wyeksportowane automatycznie. – speg

Odpowiedz

7

Odpowiedź była trochę pochowana w komentarzu, więc chciałem ułatwić znalezienie. Jako druga odpowiedź wspomina, zmienne środowiskowe nie są dostępne, ale buildpack pozwala skonfigurować je jako:

stworzyłem plik elixir_buildpack.config i dodaje następujące:

config_vars_to_export=(DATABASE_URL MAILGUN_DOMAIN MAILGUN_KEY SECRET_KEY_BASE) 
+1

Warto zauważyć, że jest to przestarzałe, a wszystkie zmienne konfiguracyjne są teraz eksportowane domyślnie. https://github.com/HashNuke/heroku-buildpack-elixir#migrating-from-previous-build-pack-pack –

1

Zmienne środowiskowe nie są dostępne w czasie kompilacji. Miałem ten sam problem i postanowiłem pozbyć się makra niosącego konfigurację. Możesz użyć this patch, aby przejść dalej.