为 bundle exec 指定环境变量

Specify environment variables for bundle exec

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

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

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

这里发生的事情是,当您在开始时指定环境变量时,您的 shell(bash、zsh、...)为新启动的进程设置这些环境变量。这可以为任何过程完成。进程还继承了之前在 shell 中定义的环境变量。因此,第三个选项可能是 运行 this in your 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)默认为开发环境。