Ограничить область действия правила, определенного внутри пространства имен - PullRequest
0 голосов
/ 05 января 2019

У меня есть следующий Rakefile (это упрощенный пример):

namespace :green do
  rule(/^build:/) do |t|
    puts "[green] #{t}"
  end

  task :start do
    puts '[green] start'
  end

  task run: ['build:app', :start]
end

namespace :blue do
  rule(/^build:/) do |t|
    puts "[blue] #{t}"
  end

  task :start do
    puts '[blue] start'
  end

  task run: ['build:app', :start]
end

Я бы хотел, чтобы каждое правило "сборки" применялось только в пределах пространства имен, в котором оно определено. Другими словами, это то, что я хочу, чтобы произошло:

$ rake blue:run
[blue] build:app
[blue] start

Но что на самом деле происходит, так это (с Rake 12.3.1):

$ rake blue:run
[green] build:app
[blue] start

Есть ли способ ограничить область действия правил "сборки", чтобы правило, определенное в "зеленом" пространстве имен, не было доступно из "синего" пространства имен?

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Я знаю, что это не лучшее решение, но я думаю, что оно может вам помочь.

rule(/^build*/) do |t|
  Rake::Task["green:build"].invoke if ARGV[0].start_with? "green"
  Rake::Task["blue:build"].invoke if ARGV[0].start_with? "blue"
end

namespace :green do
  task :build do
    puts '[green] build'
  end

  task :start do
    puts '[green] start'
  end

  task run: ['build.app', :start]
end

namespace :blue do
  task :build do
    puts '[blue] build'
  end

  task :start do
    puts '[blue] start'
  end

  task run: ['build.app', :start]
end

Тестирование у нас:

rake green:run # [green] build
               # [green] start

rake blue:run # [blue] build
              # [blue] start
0 голосов
/ 05 января 2019

Похоже, что Rake не поддерживает это изначально. Задачи ограничиваются пространством имен, в котором они определены (путем добавления пути к области в качестве префикса), но правила не получают такого префикса.

Я смог заставить это работать с помощью Rake-патчирования, что не идеально:

# Monkey-patch rake
module Rake
  module TaskManager
    # Copied from rake 12.3.1 and enhanced for scoped rules
    def lookup_in_scope(name, scope)
      loop do
        tn = scope.path_with_task_name(name)
        task = @tasks[tn]
        return task if task
        break if scope.empty?
        # BEGIN ADDED LINES
        task = enhance_with_matching_rule(tn)
        return task if task
        # END ADDED LINES
        scope = scope.tail
      end
      nil
    end
  end

  module DSL
    # Create a rule inside a namespace scope
    def scoped_rule(name, &block)
      pattern = "^#{Rake.application.current_scope.path}:#{name}:"
      Rake.application.create_rule(Regexp.new(pattern), &block)
    end
  end
end

namespace :green do
  scoped_rule :build do |t|
    puts t
  end

  task :start do |t|
    puts t
  end

  task run: ['build:app', :start]
end

namespace :blue do
  scoped_rule :build do |t|
    puts t
  end

  task :start do |t|
    puts t
  end

  task run: ['build:app', :start]
end

Выход:

$ rake green:run
green:build:app
green:start
$ rake blue:run
blue:build:app
blue:start
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...