"Ванильный" Ruby dotenv подхватывает какой-нибудь файл, кроме .env? - PullRequest
0 голосов
/ 20 мая 2019

Я хочу использовать переменные, специфичные для среды, в моем приложении на Ruby, не относящемся к Rails.

Я пробовал разные имена файлов, такие как .env.test.local, .env.local, .env.test

Я пыталсяиспользуя Dotenv.load и require 'dotenv/load' подходы

Вот как я завершаю задачу

require 'rspec'
require 'rack/test'
require 'rspec/core/rake_task'
require 'dotenv/tasks'

task test: :dotenv do
  RSpec::Core::RakeTask.new(:spec).run_task(verbose: true)
end

Это мой сервер

require 'dotenv/load'
require 'sinatra'
require 'sinatra/reloader' if development?

set :bind, '0.0.0.0'

get ENV['API_URL'] do
  'Hello World!'
end

Мой .env.test файл

API_URL=/api/v1

Ожидаемое поведение

Переменная API_URL должна быть доступна для кода, запускаемого задачей :test (с использованием bundle exec rake test).

Наблюдаемое поведение

Ошибка, вызванная тем, что ENV['API_URL'] является нулевым.

/Users/mariogil/.rvm/rubies/ruby-2.6.3/bin/ruby -I/Users/mariogil/.rvm/gems/ruby-2.6.3/gems/rspec-core-3.8.0/lib:/Users/mariogil/.rvm/gems/ruby-2.6.3/gems/rspec-support-3.8.0/lib /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/rspec-core-3.8.0/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb

An error occurred while loading ./spec/server_spec.rb.
Failure/Error:
  get ENV['API_URL'] do
    'Hello World!'
  end

TypeError:
  NilClass can't be coerced into Mustermann::Pattern
# /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/mustermann-1.0.3/lib/mustermann.rb:73:in `new'
# /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/sinatra-2.0.5/lib/sinatra/base.rb:1641:in `compile'
# /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/sinatra-2.0.5/lib/sinatra/base.rb:1629:in `compile!'
# /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/sinatra-2.0.5/lib/sinatra/base.rb:1604:in `route'
# /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/sinatra-2.0.5/lib/sinatra/base.rb:1386:in `get'
# /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/sinatra-2.0.5/lib/sinatra/base.rb:1925:in `block (2 levels) in delegate'
# ./lib/server.rb:9:in `<top (required)>'
# ./spec/server_spec.rb:6:in `require'
# ./spec/server_spec.rb:6:in `<top (required)>'
No examples found.


Finished in 0.00026 seconds (files took 0.18951 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples

/Users/mariogil/.rvm/rubies/ruby-2.6.3/bin/ruby -I/Users/mariogil/.rvm/gems/ruby-2.6.3/gems/rspec-core-3.8.0/lib:/Users/mariogil/.rvm/gems/ruby-2.6.3/gems/rspec-support-3.8.0/lib /Users/mariogil/.rvm/gems/ruby-2.6.3/gems/rspec-core-3.8.0/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb failed

См. Репо

1 Ответ

0 голосов
/ 20 мая 2019

Я нашел этот обходной путь

require 'dotenv'
require 'sinatra'
require 'sinatra/reloader' if development?
Dotenv.load(".env.#{ENV['APP_ENV']}") # Remember to set your app environment

set :bind, '0.0.0.0'

get ENV['API_URL'] do
  'Hello World!'
end

Работает только для .env.<ENVIROMENT> файлов. Может быть, это можно обернуть в функцию, но я определенно хотел бы, чтобы это обрабатывалось гемом, как в приложениях Rails, для меня это имеет больше смысла.

...