Как остановить Rake от ненужного выполнения файловых задач с зависимостями? - PullRequest
1 голос
/ 04 февраля 2020

Файловые задачи в Rake следует выполнять только в том случае, если файл, именем которого они названы, еще не существует.

У меня есть одна файловая задача, которая создает directory, и одна файловая задача, которая создает * 1004. * в этом каталоге. Теперь файл не может быть создан, если каталог не существует, поэтому я установил задачу каталога как зависимость для задачи файла:

file "directory" do
  mkdir_p "directory"
end

file "file" => "directory" do
  touch "directory/file"
end

desc "Create file"
task build: "file"

Когда я впервые запускаю здесь задачу build, все работает в соответствии с plan: сначала создается каталог, затем файл:

$ rake -t build
** Invoke build (first_time)
** Invoke file (first_time)
** Invoke directory (first_time)
** Execute directory
mkdir -p directory
** Execute file
touch directory/file
** Execute build

Когда я запускаю его второй раз после создания файла и содержащего его каталога, я ожидаю, что Rake ничего не сделает (not_needed), поскольку все файлы, с которыми связаны файловые задачи, уже существуют. Вместо этого задача каталога пропускается, но задача файла выполняется:

$ rake -t build
** Invoke build (first_time)
** Invoke file (first_time)
** Invoke directory (first_time, not_needed)
** Execute file
touch directory/file
** Execute build

Как заставить Rake не запускать задачу file, если directory и file оба уже существуют?

1 Ответ

2 голосов
/ 04 февраля 2020

Ваша file задача неверна. Он заявляет, как будто он создает file в каталоге root, но на самом деле он создает file в каталоге directory. Rake проверяет, существует ли file в каталоге root и, если его нет, запускает задачу. Для правильной работы вам нужно переименовать задачу file :

file "directory/file" => "directory" do
  touch "directory/file"
end

desc "Create file"
task build: "directory/file"

Таким образом, Rake проверяет файл на наличие и не запускает задачу 'directory / file'.

** Invoke build (first_time)
** Invoke directory/file (first_time, not_needed)
** Invoke directory (first_time, not_needed)
** Execute build
...