加强全球环境任务rails
enhancing the global environment task rails
在我从 Rails 3.2.22.4
升级到 Rails 4.0.13
的应用程序中,以下用于增强全局环境任务的代码块由于未在目标上工作而成为障碍 Rails版本:
Rails.application.class.rake_tasks do
Rake::Task["environment"].enhance do
...
end
end
这在 3.2
上工作正常,但在 4.0
上失败并显示 Don't know how to build task 'environment'
错误消息。
在 3.2 中,Rails.application.class.rake_tasks
returns 一个 Proc object
( [#<Proc:0x007f978602a470@.../lib/rails/application.rb:301>]
) 指向 this line in the rails codebase。在 4.0 上,它 returns 是一个空数组。
上面Proc object
中提到的行似乎在this commit中被删除了。
在 Rails 4.x
中增强 environment
rake 任务的首选方法是什么?
以上代码在lib/subdomain/rake.rb
文件中,在lib/subdomain/engine.rb
中包含以下代码:
module Subdomain
class Engine < Rails::Engine
...
rake_tasks do |_app|
require 'subdomain/rake'
end
...
end
end
Rake 任务无法执行,因为命令失败并出现此错误。 rails server|console
命令工作正常。
选项 1
如果我正确地理解了这个问题,那么通过将这些任务放置在 lib/tasks/environment.rake
这样的标准位置应该可以解决类似的问题。注意:None 其中特别是 Rails-specific。
# Re-opening the task gives the ability to extend the task
task :environment do
puts "One way to prepend behavior on the :environment rake task..."
end
task custom: :environment do
puts "This is a custom task that depends on :environment..."
end
task :environment_extension do
puts "This is another way to prepend behavior on the :environment rake task..."
end
# You can "enhance" the rake task directly too
Rake::Task[:environment].enhance [:environment_extension]
这个输出将是:
$ rake custom
This is another way to prepend behavior on the :environment rake task...
One way to prepend behavior on the :environment rake task...
This is a custom task that depends on :environment...
选项 2
然而,问题仍然是为什么 :environment
需要延长。如果要在 db:migrate
之前触发某些东西,您最好重新打开有问题的任务并向该特定任务添加另一个依赖项。例如:
task custom: :environment do
puts "This is a custom task that depends on :environment..."
end
task :custom_extension do
puts "This is a new dependency..."
end
# Re-opening the task in question allows you to added dependencies
task custom: :custom_extension
结果是:
$ rake custom
This is a new dependency on :custom
This is a custom task that depends on :environment...
C-C-C-组合断路器!!
结合所有内容,输出将如下所示:
$ rake custom
This is another way to prepend behavior on the :environment rake task...
One way to prepend behavior on the :environment rake task...
This is a new dependency on :custom
This is a custom task that depends on :environment...
在我从 Rails 3.2.22.4
升级到 Rails 4.0.13
的应用程序中,以下用于增强全局环境任务的代码块由于未在目标上工作而成为障碍 Rails版本:
Rails.application.class.rake_tasks do
Rake::Task["environment"].enhance do
...
end
end
这在 3.2
上工作正常,但在 4.0
上失败并显示 Don't know how to build task 'environment'
错误消息。
在 3.2 中,Rails.application.class.rake_tasks
returns 一个 Proc object
( [#<Proc:0x007f978602a470@.../lib/rails/application.rb:301>]
) 指向 this line in the rails codebase。在 4.0 上,它 returns 是一个空数组。
上面Proc object
中提到的行似乎在this commit中被删除了。
在 Rails 4.x
中增强 environment
rake 任务的首选方法是什么?
以上代码在lib/subdomain/rake.rb
文件中,在lib/subdomain/engine.rb
中包含以下代码:
module Subdomain
class Engine < Rails::Engine
...
rake_tasks do |_app|
require 'subdomain/rake'
end
...
end
end
Rake 任务无法执行,因为命令失败并出现此错误。 rails server|console
命令工作正常。
选项 1
如果我正确地理解了这个问题,那么通过将这些任务放置在 lib/tasks/environment.rake
这样的标准位置应该可以解决类似的问题。注意:None 其中特别是 Rails-specific。
# Re-opening the task gives the ability to extend the task
task :environment do
puts "One way to prepend behavior on the :environment rake task..."
end
task custom: :environment do
puts "This is a custom task that depends on :environment..."
end
task :environment_extension do
puts "This is another way to prepend behavior on the :environment rake task..."
end
# You can "enhance" the rake task directly too
Rake::Task[:environment].enhance [:environment_extension]
这个输出将是:
$ rake custom
This is another way to prepend behavior on the :environment rake task...
One way to prepend behavior on the :environment rake task...
This is a custom task that depends on :environment...
选项 2
然而,问题仍然是为什么 :environment
需要延长。如果要在 db:migrate
之前触发某些东西,您最好重新打开有问题的任务并向该特定任务添加另一个依赖项。例如:
task custom: :environment do
puts "This is a custom task that depends on :environment..."
end
task :custom_extension do
puts "This is a new dependency..."
end
# Re-opening the task in question allows you to added dependencies
task custom: :custom_extension
结果是:
$ rake custom
This is a new dependency on :custom
This is a custom task that depends on :environment...
C-C-C-组合断路器!!
结合所有内容,输出将如下所示:
$ rake custom
This is another way to prepend behavior on the :environment rake task...
One way to prepend behavior on the :environment rake task...
This is a new dependency on :custom
This is a custom task that depends on :environment...