2015-06-23 7 views
16

मैं अपना पहला फीनिक्स एप्लिकेशन तैनात कर रहा हूं, और मैंने अपनी पर्यावरण फ़ाइलों (dev.exs और prod.exs) में एक चर के मान निर्दिष्ट किए हैं।फीनिक्स में पर्यावरण फ़ाइलों से परिवर्तनीय मूल्य कैसे प्राप्त करें?

अब मैं यह समझने की कोशिश कर रहा हूं कि मेरे नियंत्रकों में उन्हें कैसे पहुंचाया जाए।

# config/dev.exs 
config :my_app, MyApp.Endpoint, 
    http: [port: 4000], 
    debug_errors: true, 
    cache_static_lookup: false, 
    my_var: "DEVELOPMENT VALUE" 

# config/prod.exs 
config :my_app, MyApp.Endpoint, 
    http: [port: {:system, "PORT"}], 
    url: [host: "example.com"], 
    my_var: "PRODUCTION VALUE" 

उत्तर

22

ठीक है, कुछ मिला। Elixir'sApplication.get_env/3 जाने का रास्ता है:

get_env(app, key, default \\ nil)


लेकिन इस के साथ समस्या यह है कि एक्सेसर आदेश वर्तमान स्थिति के लिए बहुत लंबा हो जाता है:

# Set value in config/some_env_file.exs 
config :my_large_app_name, MyLargeAppName.Endpoint, 
    http: [port: {:system, "PORT"}], 
    url: [host: "example.com"], 
    my_var: "MY ENV VARIABLE" 

# Get it back 
Application.get_env(:my_large_app_name, MyLargeAppName.Endpoint)[:my_var] 

एक बेहतर तरीका उन्हें एक अलग खंड में परिभाषित करने के लिए किया जाएगा:

config :app_vars, 
    a_string: "Some String", 
    some_list: [a: 1, b: 2, c: 3], 
    another_bool: true 

और उन्हें इस तरह का उपयोग:

Application.get_env(:app_vars, :a_string) 
# => "Some String" 

या आप सब कुंजी-मान जोड़ों का एक list लाने सकता है :

Application.get_all_env(:app_vars)   
# => [a_string: "Some String", some_list: [a: 1, b: 2, c: 3], another_bool: true] 
+5

"एक्सेसर कमांड बहुत लंबा हो जाता है" के बारे में होना चाहिए: आप हमेशा दोहराए गए कोड की एक लंबी लाइन के आसपास एक रैपर फ़ंक्शन लिख सकते हैं जिसे आप दोहराते हैं। –

+0

उन्हें एक अलग, छोटे ऐप नाम के तहत परिभाषित करना एक और विकल्प हो सकता है। अद्यतन उत्तर देखें। – Sheharyar

+26

आपको केवल अपने अनुप्रयोगों के लिए एप्लिकेशन कॉन्फ़िगरेशन को परिभाषित करना चाहिए। यदि आप 'config: not_actuall_an_app,: key,: value' करते हैं, तो यह समर्थित नहीं है और यह कुछ स्थितियों में टूट सकता है। –

2

मुझे @sheharyar समाधान के साथ कुछ बग था, तो यहां मी n:

मैं

Application.get_env(:my_large_app_name, :my_var) 

चेतावनी अपने कोड में बिना MyLargeAppName.Endpoint,

# Set value in config/some_env_file.exs 
config :my_large_app_name, 
    my_var: "MY ENV VARIABLE" 

और फिर नए ब्लॉक बनाने के लिए किया था: के रूप में @ जोस Valim कहा कि तुम कुंजी :my_large_app_name के रूप में किसी भी नाम सेट नहीं कर सकता यह अपनी परियोजना

संबंधित मुद्दे