Запускаем rails dev: cache с аргументом - PullRequest
1 голос
/ 04 августа 2020

Команда Rails rails dev:cache переключает, работают ли функции кэширования Rails в локальной среде разработки. Это делается путем создания или уничтожения файла, который действует как флаг для функций. Однако для нашего сценария установки разработчика я хотел бы запустить команду, чтобы функции кеширования всегда были включены, а не переключены.

Исходный код для rails dev:cache включает эту enable_by_argument функцию :

def enable_by_argument(caching)
  FileUtils.mkdir_p("tmp")

  if caching
    create_cache_file
  elsif caching == false && File.exist?(FILE)
    delete_cache_file
  end
end

Как мне запустить команду rails dev:cache, чтобы она использовала этот аргумент? Я пробовал несколько вариантов, включая rails dev:cache[true], rails dev:cache\[true\] и rails dev:cache true, но все они использовали поведение переключения вместо поведения, управляемого аргументами.

Это не дубликат Как передать аргументы командной строки в задачу rake потому что этот вопрос касается передачи аргументов задачам Rake. Но вместо этого эта команда встроена в Rails.

1 Ответ

2 голосов
/ 04 августа 2020

Это невозможно сделать по умолчанию, потому что исходная задача вообще не принимает аргументов.

Однако, если мы немного улучшим код задачи, мы сможем заставить его делать то, что вы хотите. Поместите это в конец вашего Rakefile:

# Remove original task
Rake::Task["dev:cache"].clear

# Reimplement task with new and improved behavior
namespace :dev do
  desc "Toggle development mode caching on/off"
  task :cache, [:enable] do |task, args|
    enable = ActiveModel::Type::Boolean.new.cast(args[:enable])
    if enable.nil?
      # Old behavior: toggle
      Rails::DevCaching.enable_by_file
    else
      # New behavior: by argument
      Rails::DevCaching.enable_by_argument(enable)
      puts "Development mode is #{enable ? 'now' : 'no longer'} being cached."
    end
  end
end

Теперь вы можете использовать любой из них:

rails dev:cache
rails dev:cache[true]
rails dev:cache[false]
...