我有一个有点重量的插件。 (Bullet,配置了Growl通知。)如果我只是运行rake任务或生成器,我不想启用它,因为它在这些情况下没用。有没有办法判断是否是这种情况?
答案 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_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,因此可能会发生变化。但这是我唯一发现的东西。