在下面的代码中,我想设置一些存储在文件中的环境变量。我错过了什么吗?在'bundle exec when'之后在生产中打印env没有显示设置的环境变量。每当gem用于预定的cron任务并花费数小时来计算这个。也可以建议任何其他方式。
every 1.day, :at => '2:30 am' do
# Run shell script to assign variables and continue the rake task
system "for line in `cat config/myEnvFile.env` ; do export $line ; done"
rake "task:continue_doing_my_task"
end
答案 0 :(得分:1)
system
不是每当工作类型。它是Kernel.system
,执行when命令运行时传递给它的String,而不是将该String转换为cron语法。看起来你真正的意思是:
command "for line in `cat config/myEnvFile.env` ; do export $line ; done"
# Note: command instead of system
command
是由here随时定义的内置作业类型。
every
- 块内的每行代码都按照自己的命令运行。如果你运行whenever
(没有任何参数,所以它只显示 放在crontab中的内容而不实际修改crontab,并且在我上面描述的修正后),你会看到输出是这样的:
30 2 * * * * /bin/bash -l -c 'for line in `cat config/myEnvFile.env` ; do export $line ; done'
30 2 * * * * /bin/bash -l -c 'cd /path/to/project && RAILS_ENV=production bundle exec rake task:continue_doing_my_task --silent > my_log_file.log 2&>1'
注意2个问题:
首先,这两个命令彼此无关 - 它们作为两个完全独立的进程运行。
第一个是在cron的默认目录中运行,该目录可能是不是,其中config / myEnvFile.env位于此处。
要解决此问题,您需要将所有内容合并到一个命令中。通过使用每当rake
作业类型,您将结束在正确的目录中,但您仍然以某种方式导出所有这些变量。
执行此操作的一种方法是重命名文件.ruby-env
并使用rvm。 rvm,除了为您管理ruby版本外,还会在您输入目录时自动加载.ruby-env
中定义的所有环境变量。
如果RVM不是您的选项,或者您想要更轻量级的内容,请重命名文件.env
并使用dotenv。他们的自述文件准确记录了如何使用gem或without Rails。没有Rails,就这么简单:
对您的Rakefile进行此更改:
require 'dotenv/tasks' # 1. require this file
namespace :task
task continue_doing_my_task: :dotenv do # 2. make :dotenv a prerequisite for your task