2013-12-12 3 views
1

В Rake я могу использовать следующий синтаксис, чтобы объявить, что задача требует, чтобы задачи alpha и bravo были выполнены в первую очередь.Как объявить rake :: PackageTask с предварительными условиями?

task :charlie => [:alpha, :bravo] 

Это, кажется, работает хорошо, если charlie типичная задача Rake или задача файла, но я не могу понять, как сделать это для Rake::PackageTask. Вот соответствующие части rakefile до сих пор:

require 'rake/packagetask' 

file :package_jar => [:compile] do 
    puts("Packaging library.jar...") 
    # code omitted for brevity, but this bit works fine 
end 

Rake::PackageTask.new("library", "1.0") do |pt| 
    puts("Packaging library distribution artefact...") 
    pt.need_tar = true 
    pt.package_files = ["target/library.jar"] 
end 
task :package => :package_jar 

То, что здесь происходит, что, для чистой сборки, он жалуется, что «не знает, как построить задачу„цель/library.jar“» , Я должен запустить rake package_jar из командной строки вручную, чтобы заставить его работать, что немного неприятно. Есть ли способ, который я могу сделать package зависит от package_jar?

Для чего это стоит, я использую Rake версии 0.9.2.2 с Ruby 1.8.7 на Linux.

ответ

1

При запуске rake package (без предварительного запуска что-нибудь еще, чтобы создать все необходимые файлы) Грабли видит, что задача пакет нуждается в файле target/library.jar. Поскольку этот файл еще не существует, рейк проверяет, знает ли он, как его создать. Он не знает каких-либо правил, которые будут создавать этот файл, поэтому он не работает с ошибкой, которую вы видите.

Rake делает есть задача, которую он считает создаст файл с именем package_jar, и эта задача на самом деле создает файл target/library.jar, но он не понимает этого.

Исправление состоит в том, чтобы сообщить Rake точно, какой файл создан в задаче file. Тогда Rake автоматически найдет зависимость.

Изменить

file :package_jar => [:compile] do 

в

file 'target/library.jar' => [:compile] do 

и затем удалить строку

task :package => :package_jar 

так package_jar больше не существует и Рейк будет найти зависимость от файла самостоятельно.

+0

Это работает, спасибо. Однако это кажется сумасшедшим, что вы вынуждены назвать свои задачи после того, как они производят артефакт, а не то, что они на самом деле делают! Я не думаю, что есть способ обойти это, не так ли? – ATG

+0

@ATG В случае задач 'file' я думаю, что имеет смысл называть их после создаваемого файла. Вы говорите Rake «это то, что вы делаете, чтобы создать этот файл», а это значит, что если Rake необходимо создать файл (как в этом случае), он знает, что делать. Вы всегда можете добавить 'task: package_jar => 'target/library.jar'', если хотите, чтобы вы могли сами вызвать эту задачу с более простым именем. – matt

+0

Я понимаю вашу точку зрения, но я привык к тому, что могу дать свои задачи/методы и т. Д. Значащие имена, которые описывают, что они делают. Также кажется странным, что обычные задачи построения, такие как «компиляция» и «тест», называются после выполнения действия, а не результатом операции. В любом случае, спасибо за вашу помощь! – ATG

0

В общем случае, если вы хотите добавить зависимость к задаче, вам нужно имя этой задачи. Поэтому вам нужно выяснить имя фактической задачи рейка, которую регистрирует Rake::PackageTask.

Самый простой способ сделать это - запустить с помощью --trace - он перечисляет имя каждой задачи во время ее выполнения.

(я считаю, что имя задачи Buildr пакета является имя файла пакета, который он производит, но я не помню точно. Используйте --trace, чтобы узнать.)

+0

Выполнение «рейк-пакета -trace» дает после трассировки стека следующее: Задачи: TOP => package => target/library-1.0.tgz и добавление «задачи» target/library-1.0.tgz "=>: package_jar 'в rakefile ничего не меняет. По-видимому, похоже, что поиск реального файла JAR является обязательной задачей, как ни странно. – ATG

0

Вы можете добавить зависимость к любому задача в письменной форме,

someTask.enhance [other, tasks] 

где other и tasks могут быть либо имена задач или объекты задач.

Так что в вашем случае, вы могли бы написать:

library = Rake::PackageTask.new(...) do 
    ... 
end 

task(:package).enhance([library]) 
+0

Это не работает, я боюсь. Он не работает: «Не знаю, как построить задачу» # '", что, по-видимому, предполагает, что Rake :: PackageTask не является даже правильной задачей рейка! Есть идеи? – ATG

 Смежные вопросы

  • Нет связанных вопросов^_^