【问题标题】:Load rake files and run tasks from other files加载 rake 文件并从其他文件运行任务
【发布时间】:2012-11-25 13:49:43
【问题描述】:

目前我正在尝试拆分我的 rake 文件以更好地组织它们。为此,我在assets 目录中添加了一个rake 文件夹,该文件夹为每组任务保存一个rake 文件。

由于我来自 PHP,我只有 非常基本的 Ruby/Rake 知识,并且无法在加载文件后运行我的命名空间默认操作。

app:init 中注释掉的 Rake :: Task ...-string 在我的 CL 中引发错误:

rake aborted! 
uninitialized constant TASK

这是命名空间/类(如果这是正确的话)。

task :default => [ 'app:init' ]
namespace :app do

    rake_dir   = "#{Dir.pwd}/assets/rake/"
    rake_files = FileList.new( "#{rake_dir}*" )

    desc "Loads rake modules (Default action)"
    task :init do
        puts "\t Importing rake files for processing"

        puts "\t loading..."
        rake_files.each() { |rake|
            puts "\t #{rake}"
            require rake
            # @link rubular.com
            name = rake.split( rake_dir ).last.gsub( /.rb\z/, '' )
            puts "\t #{name}"
            #Rake :: Task[ "#{name}:default" ].invoke
        }
    end
end

提前致谢。

编辑:至少,我可以确定文件已加载,因为这些文件开头的纯 puts "file loaded" 得到了回显。问题似乎只是在于加载的 rake 文件中命名空间的 :default 操作未加载。

【问题讨论】:

    标签: rake rakefile


    【解决方案1】:

    正如@splattael 所说,您始终可以使用Rake.add_rakelib 'tasks'。你需要知道的一件事,'tasks'目录中的文件需要有'.rake'而不是'.rb'的扩展名,否则,rake不会为你加载它。

    示例文件:

    完成上述所有操作后,使用rake -T 检查您的作业,看看 rake 是否已成功加载您的任务。

    【讨论】:

      【解决方案2】:

      您可以将您的任务放入rake 默认加载的rakelib/ 文件夹中,也可以通过以下方式在您的Rakefile 中添加特定文件夹:

      Rake.add_rakelib 'lib/tasks'
      

      【讨论】:

      • 从来不知道这件事。谢谢!
      • 一项改进:您可以提到使用load "file.rb" 可以轻松加载单个文件。那么这应该是公认的答案。
      • 这个答案应该受到保护。我从来不知道这个rakelib/ 目录
      【解决方案3】:

      如果您的目标是从外部文件加载 rake 任务,那么您可以执行以下操作。首先,假设您在名为 <project>/lib/tasks/hello.rake 的文件中有一个 rake 任务,如下所示:

      desc "Say hello"
      task :hello do 
        puts "Hello World!"
      end
      

      然后你可以在你的<project> 目录中创建一个简单的Rakefile 来像这样加载它:

      Dir.glob('lib/tasks/*.rake').each { |r| load r}
      
      desc "Say goodbye"
      task :goodbye do
        puts "See you later!"
      end
      

      当然,这将加载所有以rake 扩展名结尾的文件。您可以像这样简单地加载hello.rake

      load './lib/tasks/hello.rake'
      
      desc "Say goodbye"
      task :goodbye do
        puts "See you later!"
      end
      

      要查看所有已加载的任务,请使用rake -T。请注意,我使用了lib/tasks,因为这是 Rails 应用程序采用的标准方法。你可以使用assets 或任何你喜欢的东西,尽管我更喜欢lib/tasks,即使在非Rails 项目中也是如此。我也倾向于根据命名空间来分隔我的任务文件。

      【讨论】:

      • 为什么必须加载而不需要?
      • require 是 Ruby 本身的一部分,但 load 是 Rake DSL 的一部分。不过,它不必加载。 Rake 提供了其他可能更明确的方法来执行此操作。例如:Dir.glob('tasks/**/*.rake').each { |r| Rake.application.add_import r }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2019-12-18
      相关资源
      最近更新 更多