为bundle exec指定环境变量

meo*_*lic 4 ruby-on-rails redmine

我见过两种不同的方法在执行时指定环境变量bundle exec。Linux 上哪一个是正确的?也许两者都有?我正在寻找一般答案,我知道在这种特殊情况下(更新Redmine)指定 RAILS_ENV 可能甚至是不必要的。

bundle exec rake db:migrate RAILS_ENV=production
Run Code Online (Sandbox Code Playgroud)
RAILS_ENV=production bundle exec rake db:migrate
Run Code Online (Sandbox Code Playgroud)

Hol*_*ust 5

这两个选项都可以为 rake 任务定义环境变量。但是,对于其他可执行文件(例如rails可执行文件),仅支持在可执行文件之前定义变量的变体。

这里发生的情况是,当您在开始时指定环境变量时,您的 shell(bash、zsh 等)会为新启动的进程设置这些环境变量。这可以对任何过程进行。进程还继承之前在 shell 中定义的环境变量。因此,第三种选择可能是在 shell 中运行它:

export RAILS_ENV=production
bundle exec rake db:migrate
Run Code Online (Sandbox Code Playgroud)

现在,如果您将变量指定为rake可执行文件的参数,shell 不会影响、读取或写入这些变量。相反,rake它本身会检查给定的进程参数,并在将控制权交给实际的 rake 任务之前(db:migrate在本例中)为其自己的进程设置环境变量。

为了使您为各种可执行文件定义环境变量的能力更加一致,我个人倾向于坚持在 shell 中设置环境变量的选项,而不是使用该rake功能来解析其参数。

最后,关于您所说的RAILS_ENV环境变量在这里可能不是必需的:这可能不是真的。Rails 应用程序(例如 Redmine)根据加载的环境定义不同的行为,包括它们连接到的数据库(如文件中定义的config/database.yml)、其他设置(如 参考资料中为 Redmine 定义的config/configuration.yml)以及内部参数(例如日志记录详细程度和异常处理)。因此,您很可能希望始终RAILS_ENV=production在任何地方使用,因为如果未指定任何内容,Rails(和Redmine)默认为开发环境。