15

我想指示 Capistrano 加载在远程服务器上定义的环境变量。我怎样才能做到这一点?

似乎当我在.bashrc文件中导出我的环境变量时,Capistrano 没有考虑到它们。Capistrano 似乎正在执行 a/usr/bin/env来创建执行远程命令的环境,但这似乎不是从.bashrc.

让我告诉你我也在使用rvm-capistrano(以防万一它可能有帮助)。

有什么线索吗?

4

4 回答 4

31

Capistrano 实际上确实加载了.bashrc。但在文件顶部附近,您会发现以下行之一:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# If not running interactively, don't do anything
[[ $- != *i* ]] && return
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

如果您export在上述行之后执行任何操作,Capistrano 将无法访问它。解决方案只是将我的设置移到这条线之上——Capistrano 可以按照我的意愿工作。

此解决方案也在此 GitHub 问题中得到了说明。

于 2015-03-30T11:04:37.067 回答
0

您可以通过发出以下命令将当前环境变量传递给 ssh 远程执行:

env | ssh user@host remote_program

也从这里拿了例子

on roles(:app), in: :sequence, wait: 5 do
  within "/opt/sites/example.com" do
    # commands in this block execute in the
    # directory: /opt/sites/example.com
    as :deploy  do
      # commands in this block execute as the "deploy" user.
      with rails_env: :production do
        # commands in this block execute with the environment
        # variable RAILS_ENV=production
        rake   "assets:precompile"
        runner "S3::Sync.notify"
      end
    end
  end
end

看起来您可以使用with设置环境变量来执行。因此,请阅读您当前的环境变量并使用with.

于 2014-08-26T14:20:02.370 回答
-1

Capistrano 不会加载.bashrc,因为它不是交互式外壳。据我记得虽然它确实加载.bash_profile了,所以你可能会使用它有更好的运气。

于 2014-08-25T07:59:04.463 回答
-1

In Capistrano 3 it's set :default_env, { ... }

Like here:

set :default_environment, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}

You can refer to this: Previous post..

于 2014-08-25T14:31:27.250 回答