我使用dotenv gem将用于开发的环境变量存储在机密文件中。在我的计算机上升级ruby和rails后,gem不再提取变量。为了找到原因,在尝试了一段时间不同的选项后,我最终创建了两个相同的应用程序,但只有两个差异。ruby和rails版本。一个应用程序能够提取环境变量,另一个返回零。有什么建议吗?
我的设置
工作应用程序具有
ruby "2.5.0"
gem 'rails', '~> 5.1.6'
非工作应用程序具有
ruby "2.6.5"
gem 'rails', '~> 6.0.0'
到目前为止我尝试了什么
- 我阅读了gem网站上的信息,并尝试将
Dotenv::Railtie.load
添加到我的config/application.rb
文件中 - 此外,我尝试在我的Gemfile中添加
require: 'dotenv/rails-now'
,以防因为另一个gem问题 - 我将
require 'dotenv/load'
添加到需要变量的文件中 - 我在
config/application.rb
文件的各个位置添加了'require dotenv/load'
我单独做的每一次更改都使用byebug检查终端中是否加载了变量。并且每次变量仍然是CCD_ 7。
我缺了什么吗?有什么建议吗?或者我应该换一颗宝石?我听说费加罗可能会做同样的事情,只是以前从未使用过。提前感谢您的帮助。
好的,我找到了一种让它工作的方法。不确定我下面的解释是否能解释为什么gem dotenv不能与Rails6一起使用。但是,在最新版本的Rails中,有一种更好的方法可以做到这一点。
参考
我之所以能找到这个答案,是因为Romil Mehta的这篇博客文章(Rails6增加了对多环境凭据的支持(
背景
似乎从Rails 5.2开始,我们就可以存储凭证而不是秘密了。我不知道这一点,并继续使用上述宝石。
现在发生了什么
因此,在创建新的RoR应用程序时,会在Rails应用程序中创建一个configcredentials.yml.enc
文件,该文件使用configmaster.key
文件中的主密钥进行加密。(注意:您应该在第一次提交git或使用任何其他版本跟踪器之前隐藏此文件。(
有很多方法可以编辑加密的文件,以便为开发添加自己的变量。博客作者以rails控制台行为例:EDITOR=vim rails credentials:edit
。我更喜欢"nano"作为我的编辑器,所以我将控制台行更改为:EDITOR=nano rails credentials:edit
。
新方法
从nanoshell中,credentials.yml.enc
文件被解密,我可以读取它。然后我添加了存储在我的机密文件中的凭据,我试图在整个应用程序中访问该凭据。类似这样的东西:
oauth:
server_base_url: http://localhost:3000
oauth_token: 123
oauth_secret: 456
以前,在我的应用程序中,我只需像在ENV['server_base_url']
或ENV['oauth_token']
中那样调用ENV['variable_name']
,就可以引用其中一个密钥,并且我会得到'http://localhost:3000'或'123'。现在,要做同样的事情,我需要有代码:Rails.application.credentials.section_name[:variable_name]
,其中"section_name"在上面的列表中是"oauth",后面跟着三个变量名。因此,为了引用"oauth_token",我会这样做:Rails.application.credentials.oauth[:oauth_token]
。
一旦我将所有ENV
调用更改为Rails.application.credentials
代码,我的应用程序就工作了。它提取了秘密变量(现在是"redentials"(,并让我的示例应用程序连接到oauth服务器以授权登录。
摘要
同样,我不确定这是如何解释为什么gem"dotenv"在我的新Ruby和Rails环境中不起作用的。但是,如果其他人也有同样的问题,这里有一个解决方法!由于这是RoR应用程序的一个功能,它可能不是一个变通方法,而是对应用程序进行编码的正确方法。
快乐编码!
我遇到了类似的问题,在将环境变量添加到Gemfile并运行bundle
后,dotenv没有加载环境变量。Spring需要重新启动才能使更改生效。spring stop
和重新启动rails控制台/服务器后,ENV变量被识别。