【问题标题】:Specify environment variables for bundle exec为 bundle exec 指定环境变量
【发布时间】:2021-01-27 08:05:53
【问题描述】:

在执行bundle exec 时,我已经看到了两种不同的方式来指定环境变量。哪一个在 Linux 上是正确的?也许两者兼而有之?我正在寻找一般性答案,我知道在这种特殊情况下(更新 Redmine)可能甚至不需要指定 RAILS_ENV。

bundle exec rake db:migrate RAILS_ENV=production
RAILS_ENV=production bundle exec rake db:migrate

【问题讨论】:

  • 作为一种习惯,我总是在实际命令之前使用它。

标签: ruby-on-rails redmine


【解决方案1】:

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

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

export RAILS_ENV=production
bundle exec rake db:migrate

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多