In Rake, I can use the following syntax to declare that task charlie
requires tasks alpha
and bravo
to have been completed first.
task :charlie => [:alpha, :bravo]
This seems to work fine if charlie
is a typical Rake task or a file task but I cannot figure out how to do this for a Rake::PackageTask
. Here are the relevant parts of the rakefile so far:
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
What's happening here is that, for a clean build, it complains that it doesn't "know how to build task 'target/library.jar'". I have to run rake package_jar
from the command line manually to get it to work, which is a bit of a nuisance. Is there any way I can make package
depend on package_jar
?
For what it's worth, I am using Rake version 0.9.2.2 with Ruby 1.8.7 on Linux.
When you run
rake package
(without previously running anything else to create any needed files) Rake sees that the package task needs the filetarget/library.jar
. Since this file doesn’t yet exist Rake checks to see if it knows how to create it. It doesn’t know of any rules that will create this file, so it fails with the error you see.Rake does have a task that it thinks will create a file named
package_jar
, and that task in fact creates the filetarget/library.jar
, but it doesn’t realise this.The fix is to tell Rake exactly what file is created in the
file
task. Rake will then automatically find the dependency.Change
to
and then remove the line
since
package_jar
no longer exists and Rake will find the dependency on the file by itself.