簡體   English   中英

Rake 任務僅調用一次時執行兩次

[英]Rake task executing twice when only called once

我寫了一個非常簡單的 rake 任務來嘗試找到這個問題的根源。

namespace :foo do
 task bar: :environment do
  puts 'RUNNING'
 end
end

在控制台rake foo:bar中執行時,output 是:

RUNNING
RUNNING

當我執行任何 rake 任務時會發生這種情況。 有沒有人遇到過這樣的事情?

編輯

上面的 rake 任務就是寫在那個 .rake 文件中的所有內容。

這是當前正在使用的 Rakefile。

require File.expand_path('../config/application', __FILE__)

OurApp::Application.load_tasks

這里還有運行 --trace 的 output。

** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: ourhost
** Execute foo:bar
RUNNING
RUNNING

這可以在全新的應用程序中重現。 如果不將:environment參數傳遞給rake任務,該問題將消失。

我將問題追溯到~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb ,在此我們為該rake任務兩次點擊了~/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb enhance()方法:

[99, 108] in /Users/inovakov/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/task.rb
    99:     # Enhance a task with prerequisites or actions.  Returns self.
   100:     def enhance(deps=nil, &block)
   101:       byebug if self.to_s.include? 'foo'
   102:       @prerequisites |= deps if deps
   103:       @actions << block if block_given?
=> 104:       self
   105:     end
   106: 
   107:     # Name of the task, including any namespace qualifiers.
   108:     def name
(byebug) @actions
[#<Proc:0x007ff492701aa0@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>, #<Proc:0x007ff4920d3f70@/Users/inovakov/source/test_app/lib/tasks/foo.rake:4>]

在第一次和第二次之間,我們使用此方法初始化環境-在本例中為app/config/environments/development.rb

如果在rake任務中有兩個輸出,我們將同時看到它們:

bash-3.2$ bundle exec rake foo:bar --trace
** Invoke foo:bar (first_time)
** Invoke environment (first_time)
** Execute environment
Hostname is: localhost
** Execute foo:bar
RUNNING
STILL RUNNING
RUNNING
STILL RUNNING

(我知道這不是一個答案,但是我還沒有評論權限,這有望對討論有所幫助。)

Rake任務可以運行兩次的原因很多,在這種特定情況下,我認為它可能與Rake環境加載多次有關,正如@kucaahbe所鏈接的問題所暗示的那樣。

我實際上是在這里自己尋求幫助的,但是我的問題有所不同,我設法找到了答案。 認為這不會對這個特定問題有所幫助,但我也將其保留在此處。

確保您的Rake環境僅加載一次

@kucaahbe鏈接問題之后,這表明如果您的環境兩次加載並初始化Rake,則會發生這種情況。

在上下文中,Rake任務需要運行rake並已初始化,因此請確保您的任務不包含以下行:

require 'rake'
...
Rake.application.init
Rake.application.load_rakefile

在這種特定情況下,任務似乎沒有做任何事情,因此我將檢查其他任務或Rakefile以強制Rake上下文加載兩次。

重新定義之前清除先前存在的任務

剛剛發生此問題是由於gem創建了一個具有相同名稱的Rake任務。

例如,如果您在Rails應用程序中聲明以下任務:

namespace :assets do
  task :precompile do
    puts "Hello"
  end
end

並運行rake assets:precompile

...
I, [2017-07-31T11:25:09.498897 #9455]  INFO -- : Writing /home/pfac/...css.gz
Hello
Hello

但是,如果您使用Rake::Task#clear

namespace :assets do
  task(:precompile).clear
  task :precompile do
    puts "Hello"
  end
end

它禁用任何先前存在的行為,並且僅打印Hello

我不認為此選項可以解決此特定問題,除非@ broc-broccoli定義了其他foo:bar rake任務。

無論如何,希望這會有所幫助。

對我來說,由於我的測試文件中存在以下內容,因此我的rake應用程序在我的Rails應用程序中加載了兩次:

setup do
  MyApp::Application.load_tasks
end

我將其刪除,並且該任務被調用了一次。

希望能有所幫助。

對不起我的英語不好。

在我的例子中,我明確地添加了從Rakefile加載的任務:

Rake.add_rakelib 'lib/tasks'

因此,刪除 so case 行可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM