加载rake文件并从其他文件运行任务

kai*_*ser 31 rake rakefile

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

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

Rake :: Task ...内部的通配out -string在app:initCL处抛出一个错误:

rake aborted! 
uninitialized constant TASK
Run Code Online (Sandbox Code Playgroud)

这是命名空间/类(如果这是正确的单词).

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
Run Code Online (Sandbox Code Playgroud)

提前致谢.

编辑:至少,我可以确定文件被加载,因为puts "file loaded"这些文件开头的平面得到回应.问题似乎只是:default加载的rake文件中的命名空间的操作未加载.

小智 51

您可以把您的任务到rakelib/该文件夹中rake加载默认情况下,或在您添加特定的文件夹Rakefile通过:

Rake.add_rakelib 'lib/tasks'
Run Code Online (Sandbox Code Playgroud)

  • 一个改进:您可以提到使用`load"file.rb"`可以轻松加载单个文件.那么这应该是公认的答案. (5认同)
  • 从来不知道这一点.谢谢! (3认同)

Aar*_*sey 38

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

desc "Say hello"
task :hello do 
  puts "Hello World!"
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以Rakefile<project>目录中创建一个简单的加载方式,如下所示:

Dir.glob('lib/tasks/*.rake').each { |r| load r}

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end
Run Code Online (Sandbox Code Playgroud)

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

load './lib/tasks/hello.rake'

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end
Run Code Online (Sandbox Code Playgroud)

要查看已加载的所有任务,请使用rake -T.请注意,我已经使用过,lib/tasks因为这是Rails应用程序采用的标准方法.您可以使用assets或任何您喜欢的,但我lib/tasks甚至更喜欢非Rails项目.我还倾向于根据命名空间分离我的任务文件.


Xia*_*nyu 5

您可以随时使用@ Rake.add_rakelib 'tasks',如@splattael所述。您需要知道的一件事是,“任务”目录中的文件必须具有“ .rake”而不是“ .rb”的扩展名,否则rake不会为您加载该文件。

样本文件:

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