如何通过rake或script / generate运行Rails代码?

时间:2010-03-18 02:22:10

标签: ruby-on-rails

我有一个有点重量的插件。 (Bullet,配置了Growl通知。)如果我只是运行rake任务或生成器,我不想启用它,因为它在这些情况下没用。有没有办法判断是否是这种情况?

7 个答案:

答案 0 :(得分:34)

就这么简单:

if $rails_rake_task
  puts 'Guess what, I`m running from Rake'
else
  puts 'No; this is not a Rake task'
end

Rails 4 +

使用:

而不是$rails_rake_task
File.basename($0) == 'rake'

答案 1 :(得分:9)

我更喜欢NickMervin的答案,因为它不依赖于Rake的内部实现(例如,在Rake的全局变量上)。

这更好 - 不需要正则表达式

  File.split($0).last == 'rake'

需要File.split(),因为有人可以用它的完整路径启动rake,例如:

  /usr/local/bin/rake taskname

答案 2 :(得分:6)

$0保持当前正在运行的ruby程序,所以这应该有效:

$0 =~ /rake$/

答案 3 :(得分:3)

似乎运行rake会定义global variable $rakefile,但在我的情况下,它会设置为nil;所以最好只检查是否定义了$rakefile ...看到__FILE__$FILENAME没有被定义为任何特殊内容。

$ cat test.rb 
puts(global_variables.include? "$rakefile")
puts __FILE__
puts $FILENAME
$ cat Rakefile 
task :default do
    load 'test.rb'
end
$ ruby test.rb
false
test.rb
-
$ rake
(in /tmp)
true
./test.rb
-

不确定脚本/生成器。

答案 4 :(得分:1)

您可以使用环境变量禁用插件:

$ DISABLE_BULLET= 1 rake some:task

然后在你的代码中:

unless ENV['DISABLE_BULLET']
end

答案 5 :(得分:1)

最稳定的选择是在$is_rake = true的开头添加Rakefile,并从您的代码中使用它。

使用$0$PROGRAM_NAME有时会失败,例如,当使用spring并检查config / initializers中的变量时

答案 6 :(得分:0)

我们可以问这个

Rake.application.top_level_tasks

在 rails 应用程序中,这是一个空数组,而在 Rake 任务中,数组中包含任务名称。

top_level_tasks 可能不是公共 API,因此可能会发生变化。但这是我唯一发现的东西。