在capistrano 3自定义任务中使用dotenv变量

时间:2014-01-23 13:33:43

标签: ruby-on-rails-4 capistrano capistrano3

我正在尝试创建capistrano任务,该任务将显示由.env文件中的dotenv设置的变量

任务:

namespace :test do
  task :env do
    on roles(:app) do
      info ENV['TEST_ENV'].inspect
    end
  end
end

.env文件:

TEST_ENV='confusing'

运行任务:

$ cap staging test:env
DEBUG [37c8a9e6] Running /usr/bin/env [ ! -d ~/.rbenv/versions/2.0.0-p353 ] on x.x.x.x
DEBUG [37c8a9e6] Command: [ ! -d ~/.rbenv/versions/2.0.0-p353 ]
DEBUG [37c8a9e6] Finished in 14.776 seconds with exit status 1 (failed).
 INFO nil

这是一个工作上限的rails 4应用程序(我可以运行cap staging deploy就好了)

任何人都可以告诉我,我错过了什么?

编辑:

因为它可能不够清楚,我真正需要的是在我的本地机器中访问.env,实际案例:

  

我在.env中存储一个秘密api密钥,它将用于在部署后通知外部api服务,api密钥本身不应该存储在其他任何地方并且应用程序是独占的(每个应用程序都有自己的密钥)所以将它永久存储在本地环境中并不是一个好主意

2 个答案:

答案 0 :(得分:11)

我发现它,我需要在使用ENV之前使用Dotenv.load并在Capfile中添加require 'dotenv'

它实际上记录在dotenv自述文件中:https://github.com/bkeepers/dotenv#sinatra-or-plain-ol-ruby

应该仔细阅读..

答案 1 :(得分:1)

此时,您的rails应用程序未运行,

或者至少你的capistrano任务没有在rails上下文中运行。

因此,您的.env尚未加载到ENV中。

除此之外,你的ruby代码(也就是你的任务)在客户端(你的机器)执行。

获取环境变量os远程机器的一种方法是使用bash:

    namespace :test do
      task :env do
        on roles(:app) do
          info caputure('echo $TEST_ENV')
        end
      end
    end