क्या मेरे कोड में रेल विकास पर्यावरण के लिए ENV चर सेट करना संभव है?


83

मुझे पता है कि मैं अपने ईएनवी वैरिएबल को बैश के जरिए सेट कर सकता हूं

export admin_password = "secret"

लेकिन क्या मेरे रेल स्रोत कोड में कहीं ऐसा करने का कोई तरीका है? मेरा पहला प्रयास कुछ इस तरह थाenvironment/development.rb

ENV['admin_password'] = "secret"

लेकिन यह काम नहीं किया। क्या इसे करने का कोई तरीका है?


1
ध्यान दें कि बैश कमांड होना चाहिए export admin_password="secret", नहीं export admin_password = "secret"
याकूब लॉकार्ड

जवाबों:


81

[अपडेट करें]

जबकि "पुराने उत्तर" के तहत समाधान सामान्य समस्याओं के लिए काम करेगा, यह खंड आपकी टिप्पणी से स्पष्टीकरण के बाद आपके विशिष्ट प्रश्न का उत्तर देने के लिए है।

आपको पर्यावरण चर सेट करने में सक्षम होना चाहिए जैसे आप अपने प्रश्न में निर्दिष्ट करते हैं। एक उदाहरण के रूप में, मेरे पास एक हेरोकू ऐप है जो HTTP मूल प्रमाणीकरण का उपयोग करता है।

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :authenticate

  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
    end
  end
end

# config/initializers/dev_environment.rb
unless Rails.env.production?
  ENV['HTTP_USER'] = 'testuser'
  ENV['HTTP_PASS'] = 'testpass'
end

तो आपके मामले में आप का उपयोग करेगा

unless Rails.env.production?
  ENV['admin_password'] = "secret"
end

सर्वर को पुनः आरंभ करने के लिए मत भूलना ताकि कॉन्फ़िगरेशन पुनः लोड हो!

[पुराना उत्तर]

एप्लिकेशन-वाइड कॉन्फ़िगरेशन के लिए, आप निम्न की तरह एक समाधान पर विचार कर सकते हैं:

config/application.ymlविकल्पों की हैश के साथ एक फ़ाइल बनाएं जिसे आप एक्सेस करना चाहते हैं:

admin_password: something_secret
allow_registration: true
facebook:
  app_id: application_id_here
  app_secret: application_secret_here
  api_key: api_key_here

अब, फ़ाइल बनाएँ config/initializers/app_config.rbऔर निम्नलिखित को शामिल करें:

require 'yaml'

yaml_data = YAML::load(ERB.new(IO.read(File.join(Rails.root, 'config', 'application.yml'))).result)
APP_CONFIG = HashWithIndifferentAccess.new(yaml_data)

अब, आपके आवेदन में कहीं भी, आप APP_CONFIG[:admin_password]अपने सभी अन्य डेटा के साथ उपयोग कर सकते हैं । (ध्यान दें कि चूंकि ERB.newइनिलाइज़र शामिल है , आपकी YAML फ़ाइल में ERB मार्कअप हो सकता है।)


2
खैर, मैं हेरोकू का उपयोग कर रहा हूं और वे आपको पासवर्ड जैसी चीजों के लिए कुछ ईएनवी वैरिएबल सेट करने की अनुमति देते हैं जिन्हें आप स्रोत नियंत्रण में जांचना नहीं चाहते हैं। मैं अपने देव मशीन पर सबसे अच्छी बात जानने की कोशिश कर रहा हूं। और हां, मैं अपने ऐप के अंदर डेटा का उपयोग करने की कोशिश कर रहा हूं।
लैन

सुन के अच्छा लगा! यदि आपको लगता है कि उत्तर सही है, तो आपको प्रश्न के बगल में चेक मार्क को चिह्नित करके इसे चिह्नित करना चाहिए। यह आपको और उत्तरदाता की प्रतिष्ठा अर्जित करेगा और भविष्य में इस प्रश्न को खोजने वाले लोगों की भी सही उत्तर का पता लगाने में मदद करेगा।
मिशेल टाइली

अरे हाँ, मैं एक नया उपयोगकर्ता हूं इसलिए यह मुझे जांचने से पहले 19 घंटे इंतजार करवा रहा है। अभी भी जाने के लिए 3 और घंटे :) लेकिन आपकी सभी मदद के लिए धन्यवाद! वास्तव में, यदि आप dev_environment.rbकोड को हटाने और उसे मेरे साथ बदलने के लिए अपना जवाब संपादित करते हैं , तो मैं आपके उत्तर को खुशी से चिन्हित करूंगा जो कि पूरी तरह से अधिक है।
लैन

मुझे यह पसंद है लेकिन किसी कारण से (रेल 3 v 4?) लोड करने के लिए app_config.rb नहीं मिल सका। मैंने कोड को config / environment.rb में डाला और उसी को प्रभावित किया। # रेल एप्लिकेशन लोड करने के लिए File.expand_path ('../ Application', FILE ) की आवश्यकता होती है , इसके लिए 'yaml' yaml_data = YAML :: load (ERB.new (IO.read) (File.join (Rails.root, 'config') की आवश्यकता होती है। 'local_env.yml'))))। परिणाम) APP_CONFIG = HashWithIndifferentAccess.new (yaml_data) # रेल एप्लिकेशन को आरम्भ करें Rails3 :: ApplicationRitialize!
बेन

इस तरह के एक पुराने धागे को खोलने के लिए क्षमा करें, लेकिन देव वातावरण के लिए विशिष्ट सेटिंग config/environments/development.rbफ़ाइल में अधिक अर्थ नहीं बनाती है ?
jeffdill2

130

हार्डकोड संवेदनशील जानकारी (खाता क्रेडेंशियल्स, पासवर्ड, आदि) कभी नहीं । इसके बजाय, उस जानकारी को पर्यावरण चर (कुंजी / मान जोड़े) के रूप में संग्रहीत करने के लिए एक फ़ाइल बनाएं, और उस फ़ाइल को अपने स्रोत कोड प्रबंधन प्रणाली से बाहर करें। उदाहरण के लिए, Git (स्रोत कोड प्रबंधन प्रणाली) के संदर्भ में, उस फ़ाइल को इसमें जोड़कर बाहर करें। gitignore :

-bash> echo '/config/app_environment_variables.rb' >> .gitignore 

/config/app_environment_variables.rb

ENV['HTTP_USER'] = 'devuser'
ENV['HTTP_PASS'] = 'devpass'

साथ ही, रेखा और रेखा के /config/environment.rbबीच निम्न रेखाएँ जोड़ें :requireApplication.initialize

# Load the app's custom environment variables here, so that they are loaded before environments/*.rb
app_environment_variables = File.join(Rails.root, 'config', 'app_environment_variables.rb')
load(app_environment_variables) if File.exists?(app_environment_variables)

बस!

जैसा कि ऊपर टिप्पणी में कहा गया है, ऐसा करने से आप पहले अपने पर्यावरण चर को लोड कर रहे होंगे environments/*.rb, जिसका अर्थ है कि आप उन फ़ाइलों (जैसे environments/production.rb) के अंदर अपने चर का उल्लेख करने में सक्षम होंगे । यह आपके पर्यावरण चर फ़ाइल को अंदर रखने से अधिक लाभ है /config/initializers/

अंदर के app_environment_variables.rbवातावरण को विकास या उत्पादन से अलग करने की आवश्यकता नहीं है क्योंकि आप इस फाइल को कभी भी अपने स्रोत कोड प्रबंधन प्रणाली में शामिल नहीं करेंगे, इसलिए यह डिफ़ॉल्ट रूप से विकास के संदर्भ में है। लेकिन अगर आप के लिए सेट के लिए कुछ खास करने की जरूरत परीक्षण वातावरण (या अवसरों जब आप परीक्षण के लिए उत्पादन मोड स्थानीय स्तर पर ), बस एक सशर्त खंड जोड़ें नीचे अन्य सभी चर:

if Rails.env.test?
  ENV['HTTP_USER'] = 'testuser'
  ENV['HTTP_PASS'] = 'testpass'
end

if Rails.env.production?
  ENV['HTTP_USER'] = 'produser'
  ENV['HTTP_PASS'] = 'prodpass'
end

जब भी आप अपडेट करें app_environment_variables.rb, ऐप सर्वर को पुनरारंभ करें। यह मानते हुए कि आप अपाचे / यात्री की पसंद का उपयोग कर रहे हैं या rails server:

-bash> touch tmp/restart.txt

अपने कोड में, पर्यावरण चर को निम्नानुसार देखें:

def authenticate
  authenticate_or_request_with_http_basic do |username, password|
    username == ENV['HTTP_USER'] && password == ENV['HTTP_PASS']
  end
end

ध्यान दें कि app_environment_variables.rbआपको बूलियनों और संख्याओं को तार के रूप में निर्दिष्ट करना होगा (जैसे ENV['SEND_MAIL'] = 'false'न सिर्फ false, और ENV['TIMEOUT'] = '30'न सिर्फ 30), अन्यथा आपको क्रमशः त्रुटियां can't convert false into Stringऔर मिलेंगी can't convert Fixnum into String

भंडारण और संवेदनशील जानकारी साझा करना

टाई करने के लिए अंतिम गाँठ है: अपने ग्राहकों और / या भागीदारों के साथ इस संवेदनशील जानकारी को कैसे साझा करें? व्यावसायिक निरंतरता के उद्देश्य से (अर्थात जब आप एक गिरते हुए सितारे की चपेट में आते हैं, तो आपके ग्राहक और / या साझेदार साइट से कैसे फिर से शुरू होंगे?), आपके ग्राहकों और / या भागीदारों को आपके ऐप द्वारा आवश्यक सभी क्रेडेंशियल्स को जानना होगा। । इन चीज़ों को ईमेल / स्केपिंग करना असुरक्षित है और अव्यवस्था की ओर ले जाता है। साझा Google डॉक्स में इसे स्टोर करना बुरा नहीं है (यदि हर कोई https का उपयोग करता है), लेकिन पासवर्ड जैसे छोटे टाइटल को स्टोर करने और साझा करने के लिए समर्पित ऐप आदर्श होगा।

हरोकू पर पर्यावरण चर कैसे सेट करें

यदि आपके पास हरोकू पर एक ही वातावरण है:

-bash> heroku config:add HTTP_USER='herouser'
-bash> heroku config:add HTTP_USER='heropass'

यदि आपके पास हरोकू पर कई वातावरण हैं :

-bash> heroku config:add HTTP_USER='staguser' --remote staging
-bash> heroku config:add HTTP_PASS='stagpass' --remote staging

-bash> heroku config:add HTTP_USER='produser' --remote production
-bash> heroku config:add HTTP_PASS='prodpass' --remote production

फोरमैन और .vv

कई डेवलपर्स अपने एप्स को स्थानीय रूप से चलाने के लिए फोरमैन ( हेरोकू टूलबेल्ट के साथ स्थापित ) का उपयोग करते हैं (जैसा कि अपाचे / यात्री या पसंद करने के लिए विरोध किया जाता है )। फोरमैन और हरोकू यह घोषित करने के लिए उपयोग करते हैं कि आपके एप्लिकेशन द्वारा क्या आदेश चलाए जा रहे हैं , इसलिए स्थानीय देव से हरोकू में संक्रमण उस संबंध में निर्बाध है। मैं हर रेल परियोजना में फोरमैन और हरोकू का उपयोग करता हूं, इसलिए यह सुविधा बहुत अच्छी है। लेकिन यहाँ बात है .. फोरमैन डॉट एनवाई के माध्यम से संग्रहीत पर्यावरण चर को लोड करता है लेकिन दुर्भाग्य से डॉटेनव अनिवार्य रूप से केवल जोड़े के लिए फ़ाइल को पार्स करता हैrails serverProcfile/.envkey=value; वे जोड़े अभी वहां चर नहीं बनते हैं और इसलिए, आप पहले से ही चर (चीजें डीआरवाई रखने के लिए) का उल्लेख नहीं कर सकते हैं, और न ही आप वहां "रूबी" कर सकते हैं (जैसा कि सशर्त ऊपर उल्लेख किया गया है), जिसे आप कर सकते हैं में करते हैं /config/app_environment_variables.rb। उदाहरण के लिए, चीजें रखने के मामले में DRY मैं कभी-कभी इस तरह से सामान करता हूं:

ENV['SUPPORT_EMAIL']='Company Support <support@company.com>'
ENV['MAILER_DEFAULT_FROM'] = ENV['SUPPORT_EMAIL']
ENV['MAILER_DEFAULT_TO']   = ENV['SUPPORT_EMAIL']

इसलिए, मैं फोरमैन का उपयोग अपने ऐप्स को स्थानीय रूप से चलाने के लिए करता हूं, लेकिन मैं इसकी .envफ़ाइल का उपयोग पर्यावरण चर को लोड करने के लिए नहीं करता हूं ; बल्कि मैं /config/app_environment_variables.rbऊपर वर्णित दृष्टिकोण के साथ संयोजन के रूप में फोरमैन का उपयोग करता हूं ।


3
मैं इस समाधान को पसंद करता हूं क्योंकि मैं यह सुनिश्चित करना चाहता था कि संवेदनशील सेटिंग्स (एपीआई कुंजी आदि) स्पष्ट रूप से पाठ की जगह और गिट रिपॉजिटरी के साथ बंडल नहीं की कीस्टोर में पर्याप्त रूप से सुरक्षित हैं। धन्यवाद।
रोरी स्टंपफ

10

जिस तरह से मैं अपने सवाल में ऐसा करने की कोशिश कर रहा हूं वह वास्तव में काम करता है!

# environment/development.rb

ENV['admin_password'] = "secret" 

मुझे बस सर्वर को पुनरारंभ करना था। मुझे लगा कि reload!रेल कंसोल में दौड़ना काफी होगा लेकिन मुझे वेब सर्वर को भी रिस्टार्ट करना होगा।

मैं अपना जवाब चुन रहा हूं क्योंकि मुझे लगता है कि ईएनवी वेरिएबल्स को लगाने और सेट करने के लिए यह एक बेहतर जगह है


खुशी है कि आपको पता चला कि यह काम क्यों नहीं कर रहा था! मैं व्यक्तिगत रूप से रेल पर्यावरण को बचाने config/application.rbऔर अपने अनुप्रयोग पर्यावरण को स्थापित करने के लिए अन्य तरीकों का उपयोग करना पसंद करता हूं , लेकिन निश्चित रूप से इसका मतलब यह नहीं है कि यह एकमात्र तरीका है (या यहां तक ​​कि "सही" तरीका :)config/environments/*.rb
मिशेल टिली

मुझे थोड़ी दूर फेंक दिया गया क्योंकि मैं उत्पादन और विकास के बीच चीजों को अलग तरह से सेट करने की कोशिश कर रहा था। लेकिन अब मैं आपसे पूरी तरह सहमत हूँ! न केवल मेरे मूल प्रश्न का उत्तर देने के लिए धन्यवाद, बल्कि रेल एप्लिकेशन संरचना को बेहतर ढंग से समझने में मेरी मदद करें!
लैन

8

यदि आप कुछ विकास सर्वरों का उपयोग कर रहे हैं, तो यहां समाधान के लिए एक तरफ, क्लीनर विकल्प हैं।

हरोकू के फोरमैन के साथ , आप प्रति-प्रोजेक्ट वातावरण चर को एक .envफ़ाइल में बना सकते हैं :

ADMIN_PASSOWRD="secret"

पाउडर के साथ , आप एक .powenvफ़ाइल का उपयोग कर सकते हैं :

export ADMIN_PASSOWRD="secret"

2

मुझे लगता है कि सबसे अच्छा तरीका है कि उन्हें किसी yml फ़ाइल में संग्रहीत किया जाए और फिर उस फाइल को intializer फ़ाइल में उपयोग करके लोड किया जाए

APP_CONFIG = YAML.load_file("#{Rails.root}/config/CONFIG.yml")[Rails.env].to_hash

आप आसानी से पर्यावरण से संबंधित कॉन्फ़िगरेशन चर का उपयोग कर सकते हैं।

आपकी Yml फाइल की मुख्य मूल्य संरचना है:

development:
  app_key: 'abc'
  app_secret: 'abc'

production:
  app_key: 'xyz'
  app_secret: 'ghq'

1

सिस्टम का वातावरण और रेल का वातावरण अलग-अलग चीजें हैं। ENVचलो आप रेल के वातावरण के साथ काम करते हैं, लेकिन अगर आप क्या करना चाहते हैं तो सिस्टम के वातावरण को रनटाइम में बदलना है तो आप केवल बैकटिक्स के साथ कमांड को घेर सकते हैं।

# ruby code
`export admin_password="secret"`
# more ruby code

1
बस एक नोट जो exportरिक्त स्थान के बारे में शिकायत करेगा; कोशिशexport admin_password="secret"
मिशेल Tilley

मैं वह (बहुत महत्वपूर्ण) विवरण भूल गया। मेरे उत्तर को सही किया, धन्यवाद!
गोन्कोलासिल्वा

यह काम नहीं करता है क्योंकि बैकटिक्स एक सब-टाइम स्पॉन और सब-वे में सेट किए गए चर अभिभावकों के वातावरण को प्रभावित नहीं कर सकता है।
एंड्रयूएफ

नहींं, यह काम करता है। उत्तर, जैसा कि स्पष्ट रूप से समझाया गया है, माता-पिता के वातावरण पर लक्षित नहीं है। पूरी तरह से अच्छे उत्तर हैं जो यह निर्देश देते हैं कि कैसे करें।
goncalossilva

1

कस्टम .envफ़ाइल लोड करने के लिए स्क्रिप्ट : लाइन और लाइन के /config/environment.rbबीच निम्न पंक्तियाँ जोड़ें :requireApplication.initialize

# Load the app's custom environment variables here, so that they are loaded before environments/*.rb

app_environment_variables = File.join(Rails.root, 'config', 'local_environment.env')
if File.exists?(app_environment_variables)
  lines = File.readlines(app_environment_variables)
  lines.each do |line|
    line.chomp!
    next if line.empty? or line[0] == '#'
    parts = line.partition '='
    raise "Wrong line: #{line} in #{app_environment_variables}" if parts.last.empty?
    ENV[parts.first] = parts.last
  end
end

और config/local_environment.env(आप इसे चाहते .gitignoreहैं) ऐसा दिखेगा:

# This is ignored comment
DATABASE_URL=mysql2://user:psw@0.0.0:3307/database
RACK_ENV=development

(@ User664833 के समाधान पर आधारित)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.