Чтение переменных из файла в Ruby

есть ли способ прочитать в файле переменных среды?

в bash у меня есть файл env.sh что я могу использовать

env.sh

foo="bar"

файл bash

set -a
source env.sh

Это позволит мне просто использовать foo, как если бы я удалил его в рубиновом скрипте.

также есть ли способ убедиться, что этот файл нечитаем, чтобы пароли могли храниться в этом файле?

3 ответов


похоже, вы должны предоставить пример файла для пользователя/администратора, чтобы изменить его для своей личной среды, а затем заполнить среду из этого, избегая, возможно, наличия этого файла с конфиденциальной информацией в репозитории. Примечание: в файл безопасности будет решаться, где этот файл находится и вашей операционной системы и серверного программного обеспечения.

если это так, то вы можете предоставить файл, который содержит шаблон того, что вам потребуется от администратора / пользователя программы, которую вы настраиваете.

у Руби есть ENV константа, которая действует как Hash и содержит среду оболочки, которую вы используете.

в качестве примера, есть файл под названием environment.рубидий.образец, которым можно поделиться с кем угодно, публично. Он имеет инструкции и содержит шаблон, который пользователи могут свободно изменять, с инструкциями по копированию файла в environment.rb. Пример файла выглядит так это:

# environment.rb.sample
# Copy this file to environment.rb and change the name and password to your credentials
ENV['temp_user_name'] = 'Foo Bar'
ENV['temp_password'] = 'Dazz Kezz

файл затем копируется в это, возможно:

# environment.rb
ENV['temp_user_name'] = 'Joe Admin'
ENV['temp_password'] = 'Super Secure Password'

файл, который загружает это и использует это просто файл Ruby, который свободно изменяется пользователем/администратором программного обеспечения, и выглядит так, а также публично.

# load_environment
require './environment'
puts ENV['temp_user_name']
puts ENV['temp_password']

загружает файл и использует ENV это глобально постоянного применения.

права доступа к файлам затем управляются пользователем / администратором системы и защищена, как и любая другая конфиденциальная информация в их системе. Чувствительный файл также должен быть указан в механизме игнорирования репозитория. Это никогда не должно быть обнародовано.


целью локальной переменной является временное использование в определении метода или блока. Использование его вне таких сред, особенно в файлах, побеждает его цель. Вам не нужно это делать, и у Ruby нет простого способа сделать это.

если вы правильно используете переменные и хотите делиться переменными между файлами, это должны быть другие типы переменных, такие как экземпляр, класс или глобальные переменные. Или для целей установления среде, вы должны использовать константы. Среди них глобальные переменные и константы могут быть записаны в файл, загружены в другой файл и использоваться.

.
$foo = 1
FOO = 2
.
load "file-a.rb"
$foo # => 1
FOO # => 2

как, например, и переменные класса, они принадлежат классу или его экземпляру, поэтому они должны быть определены в такой среде. И вы можете снова открыть тот же класс в другом файле и загрузить его в другой файл.

.
class Bar
  @@foo = 1
  def initialize; @foo = 2 end
end
.
load "file-a.rb"
Bar.class_variable_get("@@foo") # => 1
Bar.new.instance_variable_get("@foo") # => 2

Да, есть, и если по какой-то странной, тайной причине вы должны использовать его, это eval:

предупреждение: Не используйте это, если у вас нет очень, очень веской причины

eval(File.read("name_of_var_file"), binding)

Если вы действительно пытаетесь написать файл конфигурации, используйте YAML. Такой файл:

конфиг.и YAML:

foo: "bar"

можно так:

require 'yaml'
conf = YAML.loads(File.read("config.yaml"))
conf['foo'] #=> 'bar'

Это безопасно и управляемо, не говоря уже о стандартной практике.


Что касается недоступности файла, это проблема уровня операционной системы, которая не может быть решена без информации об окружающей среде, ОС, настройке и т. д.