buildr 0.16.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +45 -0
- data/README +4 -0
- data/lib/buildr.rb +15 -3
- data/lib/core/artifact.rb +22 -23
- data/lib/core/build.rb +52 -41
- data/lib/core/core.rb +119 -4
- data/lib/core/project.rb +213 -187
- data/lib/java/compile.rb +152 -174
- data/lib/java/eclipse.rb +79 -0
- data/lib/java/java.rb +39 -1
- data/lib/java/jetty.rb +123 -0
- data/lib/java/jetty/JettyWrapper$1.class +0 -0
- data/lib/java/jetty/JettyWrapper$BuildrHandler.class +0 -0
- data/lib/java/jetty/JettyWrapper.class +0 -0
- data/lib/java/jetty/JettyWrapper.java +107 -0
- data/lib/java/openjpa.rb +8 -10
- data/lib/java/packaging.rb +65 -32
- data/lib/java/test.rb +121 -51
- data/lib/java/xmlbeans.rb +6 -4
- data/lib/tasks/filter.rb +15 -4
- data/lib/tasks/zip.rb +10 -36
- metadata +9 -2
data/lib/core/project.rb
CHANGED
@@ -10,19 +10,18 @@ module Buildr
|
|
10
10
|
# +foo:build+ and +foo:deploy+.
|
11
11
|
#
|
12
12
|
# Projects have properties, some of which they inherit from their
|
13
|
-
# parent project. Built
|
13
|
+
# parent project. Built in tasks use these properties, for example,
|
14
14
|
# the +clean+ task will remove the target directory specified by
|
15
15
|
# the +target_dir+ property. The +compile+ tasks uses the compiler
|
16
16
|
# option: you can set these options on the parent project and they
|
17
17
|
# will be inherited by all sub-projects.
|
18
18
|
#
|
19
|
-
# You can only define a project once using #define.
|
20
|
-
# the project using #project.
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# take a project definition and use it as a classpath dependency.
|
19
|
+
# You can only define a project once using #define. Afterwards, you
|
20
|
+
# can obtain the project definition using #project. However, when
|
21
|
+
# working with sub-projects, one project may reference another ahead
|
22
|
+
# of its definition: the sub-project definitions are then evaluated
|
23
|
+
# based on their dependencies with each other. Circular dependencies
|
24
|
+
# are not allowed.
|
26
25
|
#
|
27
26
|
# For example:
|
28
27
|
# define "project1" do
|
@@ -38,7 +37,9 @@ module Buildr
|
|
38
37
|
# end
|
39
38
|
# end
|
40
39
|
#
|
41
|
-
#
|
40
|
+
# projects.map(&:name)
|
41
|
+
# => [ "project", "project:module1", "project1:module2" ]
|
42
|
+
# project("project1").sub_projects.map(&:name)
|
42
43
|
# => [ "project1:module1", "project1:module2" ]
|
43
44
|
# project("project1:module1").parent.name
|
44
45
|
# => "project1"
|
@@ -50,45 +51,66 @@ module Buildr
|
|
50
51
|
# uses a sub-directory relative to the parent project.
|
51
52
|
#
|
52
53
|
# For the above example, the directory structure is:
|
53
|
-
#
|
54
|
-
# |
|
55
|
-
# |
|
54
|
+
# project1/
|
55
|
+
# |__Rakefile
|
56
|
+
# |__module1/
|
57
|
+
# |__module2/
|
56
58
|
#
|
57
|
-
# The project definition tasks a block and
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
# The following two are equivalent:
|
62
|
-
# define "project1" do |project|
|
59
|
+
# The project definition tasks a block and executes it in the context of
|
60
|
+
# the project object. For example:
|
61
|
+
# define "project1" do
|
63
62
|
# project.version = "1.1"
|
64
|
-
# self.version = "1.1"
|
65
63
|
# end
|
66
|
-
|
64
|
+
# puts project("project1").version
|
65
|
+
# => "1.1"
|
66
|
+
class Project < Rake::Task
|
67
67
|
|
68
68
|
class << self
|
69
69
|
|
70
70
|
# See Buildr#define.
|
71
71
|
def define(*args, &block)
|
72
72
|
name, properties = name_and_properties_from_args(*args)
|
73
|
-
|
74
|
-
|
75
|
-
|
73
|
+
# Make sure a sub-project is only defined within the parent project,
|
74
|
+
# to prevent silly mistakes that lead to inconsistencies (e.g.
|
75
|
+
# namespaces will be all out of whack).
|
76
|
+
Rake.application.current_scope == name.split(":")[0...-1] or
|
77
|
+
raise "You can only define a sub project (#{name}) within the definition of its parent process"
|
76
78
|
|
77
|
-
# See Buildr#project.
|
78
|
-
def project(name)
|
79
79
|
@projects ||= {}
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
raise "You cannot define the same project (#{name}) more than once" if @projects[name]
|
81
|
+
Project.define_task(name).tap do |project|
|
82
|
+
@projects[name] = project
|
83
|
+
project.enhance { |project| @on_define.each { |callback| callback[project] } } if @on_define
|
84
|
+
# Set the project properties first, actions may use them.
|
85
|
+
properties.each { |name, value| project.send "#{name}=", value }
|
86
|
+
# Enhance the project definition with the block.
|
87
|
+
if block
|
88
|
+
project.enhance { project.instance_eval &block }
|
89
|
+
end
|
90
|
+
|
91
|
+
if project.parent
|
92
|
+
project.parent.enhance { project.invoke }
|
83
93
|
else
|
84
|
-
|
94
|
+
project.invoke
|
85
95
|
end
|
86
96
|
end
|
87
97
|
end
|
88
98
|
|
99
|
+
# See Buildr#project.
|
100
|
+
def project(name)
|
101
|
+
@projects && @projects[name] or raise "No such project #{name}"
|
102
|
+
returning(@projects[name]) { |project| project.invoke }
|
103
|
+
end
|
104
|
+
|
89
105
|
# See Buildr#projects.
|
90
|
-
def projects()
|
91
|
-
|
106
|
+
def projects(*args)
|
107
|
+
@projects ||= {}
|
108
|
+
if args.empty?
|
109
|
+
@projects.keys.map { |name| project(name) }.sort_by(&:name)
|
110
|
+
else
|
111
|
+
args.map { |name| project(name) or raise "No such project #{name}" }.
|
112
|
+
uniq.sort_by(&:name)
|
113
|
+
end
|
92
114
|
end
|
93
115
|
|
94
116
|
# Discard all project definitions.
|
@@ -96,6 +118,30 @@ module Buildr
|
|
96
118
|
@projects.clear if @projects
|
97
119
|
end
|
98
120
|
|
121
|
+
# Enhances this task into a local task. A local task executes the same
|
122
|
+
# task on the project in the local directory.
|
123
|
+
#
|
124
|
+
# For example, if the current directory project is +foo+, then
|
125
|
+
# +rake build+ executes +rake foo:build+.
|
126
|
+
#
|
127
|
+
# The current directory project is a project with the base directory
|
128
|
+
# being the same as the current directory. For example:
|
129
|
+
# cd bar
|
130
|
+
# rake build
|
131
|
+
# Will execute the +foo:bar:build+ task, after switching to the directory
|
132
|
+
# of the sub-project +bar+.
|
133
|
+
def local_task(task)
|
134
|
+
task = task(task) unless Rake::Task === task
|
135
|
+
task.enhance do |task|
|
136
|
+
projects = Project.projects.select { |project| project.base_dir == Rake.application.original_dir }
|
137
|
+
if verbose && projects.empty?
|
138
|
+
warn "No projects defined for directory #{Rake.application.original_dir}"
|
139
|
+
end
|
140
|
+
projects.each { |project| task("#{project.name}:#{task.name}").invoke }
|
141
|
+
end
|
142
|
+
task
|
143
|
+
end
|
144
|
+
|
99
145
|
# The Project class defines minimal behavior for new projects.
|
100
146
|
# Use #on_define to add behavior when defining new projects.
|
101
147
|
# Whenever a new project is defined, it will yield to the block
|
@@ -110,8 +156,20 @@ module Buildr
|
|
110
156
|
# Keep in mind that the order in which #on_define blocks are
|
111
157
|
# called is not determined. You cannot depend on a previous
|
112
158
|
# #on_define to set properties or create new tasks. You would
|
113
|
-
# want to use the #
|
114
|
-
# from within #
|
159
|
+
# want to use the #enhance method instead, by calling it
|
160
|
+
# from within #on_define.
|
161
|
+
#
|
162
|
+
# For example:
|
163
|
+
# Project.on_define do |project|
|
164
|
+
# puts "defining"
|
165
|
+
# project.enhance { puts "defined" }
|
166
|
+
# end
|
167
|
+
# define "foo" do
|
168
|
+
# puts "block"
|
169
|
+
# end
|
170
|
+
# => defining
|
171
|
+
# block
|
172
|
+
# defined
|
115
173
|
def on_define(&block)
|
116
174
|
(@on_define ||= []) << block if block
|
117
175
|
end
|
@@ -119,7 +177,7 @@ module Buildr
|
|
119
177
|
# :nodoc:
|
120
178
|
def name_and_properties_from_args(*args)
|
121
179
|
if Hash === args.last
|
122
|
-
properties = args.pop.
|
180
|
+
properties = args.pop.dup
|
123
181
|
else
|
124
182
|
properties = {}
|
125
183
|
end
|
@@ -141,12 +199,15 @@ module Buildr
|
|
141
199
|
# * Are referenced but never defined. This is probably a typo.
|
142
200
|
# * Do not have a base directory.
|
143
201
|
(@projects || {}).each do |name, project|
|
144
|
-
msgs << "Project #{name} is referenced but not defined; you probably have a typo somewhere" unless project.defined?
|
145
202
|
msgs << "Project #{name} refers to the directory #{project.base_dir}, which does not exist" unless File.exist?(project.base_dir)
|
146
203
|
end
|
147
204
|
end
|
148
205
|
end
|
149
206
|
|
207
|
+
def scope_name(scope, task_name)
|
208
|
+
task_name
|
209
|
+
end
|
210
|
+
|
150
211
|
end
|
151
212
|
|
152
213
|
include Attributes
|
@@ -158,6 +219,21 @@ module Buildr
|
|
158
219
|
# The parent project if this is a sub-project.
|
159
220
|
attr_reader :parent
|
160
221
|
|
222
|
+
# :nodoc:
|
223
|
+
def initialize(*args)
|
224
|
+
super
|
225
|
+
split = name.split(":")
|
226
|
+
if split.size > 1
|
227
|
+
# Get parent project, but do not invoke it's definition to
|
228
|
+
# prevent circular dependencies (it's being invoked right now).
|
229
|
+
@parent = task(split[0...-1].join(":"))
|
230
|
+
raise "No parent project #{split[0...-1].join(":")}" unless @parent && Project === parent
|
231
|
+
end
|
232
|
+
# We want to lazily evaluate base_dir, but default initialize
|
233
|
+
# will set it to the current directory.
|
234
|
+
@base_dir = nil
|
235
|
+
end
|
236
|
+
|
161
237
|
# The base directory of this project. The default for a top-level project
|
162
238
|
# is the same directory that holds the Rakefile. The default for a
|
163
239
|
# sub-project is a child directory with the same name.
|
@@ -165,38 +241,34 @@ module Buildr
|
|
165
241
|
# A project definition can change the base directory using the base_dir
|
166
242
|
# hash value. Be advised that the base directory and all values that
|
167
243
|
# depend on it can only be determined after the project is defined.
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
# For top-level project, a good default is the directory where we found the Rakefile.
|
181
|
-
@base_dir = Dir.pwd
|
244
|
+
def base_dir()
|
245
|
+
unless @base_dir
|
246
|
+
if @parent
|
247
|
+
# For sub-project, a good default is a directory in the parent's base_dir,
|
248
|
+
# using the same name as the project.
|
249
|
+
sub_dir = File.join(@parent.base_dir, name.split(":").last)
|
250
|
+
@base_dir = File.exist?(sub_dir) ? sub_dir : @parent.base_dir
|
251
|
+
@base_dir = sub_dir
|
252
|
+
else
|
253
|
+
# For top-level project, a good default is the directory where we found the Rakefile.
|
254
|
+
@base_dir = Dir.pwd
|
255
|
+
end
|
182
256
|
end
|
183
|
-
@
|
184
|
-
|
257
|
+
@base_dir
|
258
|
+
end
|
259
|
+
|
260
|
+
# Set the base directory. Note: you can only do this once for a project,
|
261
|
+
# and only before accessing the base directory. If you try reading the
|
262
|
+
# value with #base_dir, the base directory cannot be set again.
|
263
|
+
def base_dir=(dir)
|
264
|
+
raise "Cannot set base directory twice, or after reading its value" if @base_dir
|
265
|
+
@base_dir = File.expand_path(dir)
|
185
266
|
end
|
186
267
|
|
187
268
|
# Define a new sub-project within this project.
|
188
269
|
def define(*args, &block)
|
189
270
|
name, properties = Project.name_and_properties_from_args(*args)
|
190
|
-
|
191
|
-
end
|
192
|
-
|
193
|
-
# Returns true if the project was already defined.
|
194
|
-
def defined?()
|
195
|
-
@defined
|
196
|
-
end
|
197
|
-
|
198
|
-
def to_s()
|
199
|
-
name
|
271
|
+
Project.define "#{self.name}:#{name}", properties, &block
|
200
272
|
end
|
201
273
|
|
202
274
|
# Returns a path made from multiple arguments. Relative paths are turned into
|
@@ -222,8 +294,8 @@ module Buildr
|
|
222
294
|
end
|
223
295
|
|
224
296
|
# Same as Buildr#projects.
|
225
|
-
def projects()
|
226
|
-
Project.projects
|
297
|
+
def projects(*args)
|
298
|
+
Project.projects(*args)
|
227
299
|
end
|
228
300
|
|
229
301
|
def sub_projects()
|
@@ -231,6 +303,44 @@ module Buildr
|
|
231
303
|
Project.projects.select { |project| project.name.starts_with?(prefix) }.sort_by(&:name)
|
232
304
|
end
|
233
305
|
|
306
|
+
# Create or return a file task. This is similar to Rake's file method,
|
307
|
+
# with the exception that all relative paths are resolved relative to
|
308
|
+
# the project's base directory.
|
309
|
+
#
|
310
|
+
# You can call this from within or outside the project definition.
|
311
|
+
def file(args, &block)
|
312
|
+
task_name, deps = Rake.application.resolve_args(args)
|
313
|
+
unless task = Rake.application.lookup(task_name, [])
|
314
|
+
task = Rake::FileTask.define_task(File.expand_path(task_name, base_dir))
|
315
|
+
task.base_dir = base_dir
|
316
|
+
end
|
317
|
+
deps = [deps] unless deps.respond_to?(:to_ary)
|
318
|
+
task.enhance deps, &block
|
319
|
+
end
|
320
|
+
|
321
|
+
# Create or return a task. This is similar to Rake's task method,
|
322
|
+
# with the exception that the task is always defined within the project's
|
323
|
+
# namespace.
|
324
|
+
#
|
325
|
+
# If called from within the project definition, it returns a task,
|
326
|
+
# creating a new one no such task exists. If called from outside the
|
327
|
+
# project definition, it returns a task and raises an error if the
|
328
|
+
# task does not exist.
|
329
|
+
def task(args, &block)
|
330
|
+
task_name, deps = Rake.application.resolve_args(args)
|
331
|
+
if Rake.application.current_scope == name.split(":")
|
332
|
+
Rake::Task.define_task(task_name=>deps, &block)
|
333
|
+
else
|
334
|
+
if task = Rake.application.lookup(task_name, name.split(":"))
|
335
|
+
deps = [deps] unless deps.respond_to?(:to_ary)
|
336
|
+
task.enhance deps, &block
|
337
|
+
else
|
338
|
+
full_name = "#{name}:#{task_name}"
|
339
|
+
raise "You cannot define a project task outside the project definition, and no task #{full_name} defined in the project"
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
234
344
|
# Define a recursive task.
|
235
345
|
#
|
236
346
|
# A recursive task executes the task with the same name in the project,
|
@@ -254,62 +364,23 @@ module Buildr
|
|
254
364
|
#
|
255
365
|
# This method defines a RakeTask. If you need a different type of task,
|
256
366
|
# define the task first and then call #recursive_task.
|
257
|
-
def recursive_task(
|
258
|
-
|
259
|
-
|
367
|
+
def recursive_task(args, &block)
|
368
|
+
task_name, deps = Rake.application.resolve_args(args)
|
369
|
+
deps = [deps] unless deps.respond_to?(:to_ary)
|
370
|
+
returning(task(task_name=>deps)) do |task|
|
260
371
|
if parent
|
261
|
-
Rake
|
372
|
+
Rake.application.lookup(task_name, parent.name.split(":")).enhance [task]
|
373
|
+
#Rake::Task["^#{name}"].enhance([ task ])
|
262
374
|
end
|
263
375
|
task.enhance &block
|
264
376
|
end
|
265
377
|
end
|
266
378
|
|
267
|
-
|
268
|
-
|
269
|
-
#
|
270
|
-
# Project.on_define do |project|
|
271
|
-
# puts "defining"
|
272
|
-
# project.after_block { puts "defined" }
|
273
|
-
# end
|
274
|
-
# define "foo" do
|
275
|
-
# puts "block"
|
276
|
-
# end
|
277
|
-
# => defining
|
278
|
-
# block
|
279
|
-
# defined
|
280
|
-
def after_block(&block)
|
281
|
-
@after_block << block if block
|
282
|
-
end
|
283
|
-
|
284
|
-
# :nodoc:
|
285
|
-
def _define(properties, &block)
|
286
|
-
fail "Project #{name} already defined" if @defined
|
287
|
-
@defined = true
|
288
|
-
@base_dir = File.expand_path(properties.delete(:base_dir)) if properties.has_key?(:base_dir)
|
289
|
-
# How convenient: project name is used to create compound namespace for task.
|
290
|
-
# Keep in mind that we're already in a namespace context if it's a sub-project.
|
291
|
-
namespace name.split(":").last do
|
379
|
+
def execute()
|
380
|
+
Rake.application.in_namespace ":#{name}" do
|
292
381
|
# Everything we do inside the project is relative to its working directory.
|
293
|
-
Dir.chdir
|
294
|
-
# on_define blocks may have use for project properties.
|
295
|
-
properties.each { |name, value| send "#{name}=", value }
|
296
|
-
(self.class.instance_variable_get(:@on_define) || []).each { |callback| callback.call self }
|
297
|
-
if block
|
298
|
-
begin
|
299
|
-
# Evaluate in context of project, and pass project. And for that we need
|
300
|
-
# a method definition, on the singleton so we don't conflict with anyone else.
|
301
|
-
singleton = (class << self ; self ; end)
|
302
|
-
singleton.send :define_method, :__enhance__, &block
|
303
|
-
self.__enhance__ self
|
304
|
-
ensure
|
305
|
-
singleton.send :remove_method, :__enhance__
|
306
|
-
end
|
307
|
-
end
|
308
|
-
# And now for all the callbacks created by on_define.
|
309
|
-
@after_block.each { |callback| callback.call self }
|
310
|
-
end
|
382
|
+
Dir.chdir(base_dir) { super }
|
311
383
|
end
|
312
|
-
self
|
313
384
|
end
|
314
385
|
|
315
386
|
end
|
@@ -329,22 +400,18 @@ module Buildr
|
|
329
400
|
# You can also pass the project name in the properties hash.
|
330
401
|
#
|
331
402
|
# The easiest way to define a project and configure its tasks is by passing
|
332
|
-
# a block. The #define method executes the block
|
333
|
-
# project, as if with instance_eval. It also passes the project to the block.
|
403
|
+
# a block. The #define method executes the block in the context of the project.
|
334
404
|
#
|
335
405
|
# For example:
|
336
406
|
# define "foo", :version=>"1.0" do
|
337
|
-
#
|
338
|
-
# end
|
339
|
-
#
|
340
|
-
# define "bar" do |project|
|
341
|
-
# project.version = "1.0"
|
342
|
-
# . . .
|
407
|
+
# puts version
|
343
408
|
# end
|
344
409
|
#
|
345
|
-
# define "
|
346
|
-
#
|
410
|
+
# define "bar" do
|
411
|
+
# puts name
|
347
412
|
# end
|
413
|
+
3 # => "1.0"
|
414
|
+
# "bar"
|
348
415
|
#
|
349
416
|
# Each project also has a #define method that operates the same way, but
|
350
417
|
# defines a sub-project. A sub-project has a compound name using the parent
|
@@ -369,86 +436,45 @@ module Buildr
|
|
369
436
|
# For a sub-project, use the full name, for example "foo:bar" to find
|
370
437
|
# the sub-project "bar" of the parent project "foo".
|
371
438
|
#
|
372
|
-
# You
|
373
|
-
#
|
374
|
-
#
|
375
|
-
# project
|
376
|
-
# are
|
439
|
+
# You cannot reference a project before the project is defined, with one
|
440
|
+
# exception. When working with sub-projects, the project definitions are
|
441
|
+
# stored but not executed until the parent project is defined. So within
|
442
|
+
# a sub-project definition you can reference another sub-project definition.
|
443
|
+
# The definitions are then performed (invoked) based on that dependency.
|
444
|
+
# You cannot have circular references between project definitions.
|
377
445
|
#
|
378
446
|
# For example:
|
379
|
-
#
|
380
|
-
#
|
381
|
-
# end
|
447
|
+
# define "project1" do
|
448
|
+
# self.version = "1.1"
|
382
449
|
#
|
383
|
-
#
|
384
|
-
#
|
450
|
+
# define "module1" do
|
451
|
+
# package :jar
|
452
|
+
# end
|
453
|
+
#
|
454
|
+
# define "module2" do
|
455
|
+
# compile.with project("project1:module1")
|
456
|
+
# package :jar
|
457
|
+
# end
|
385
458
|
# end
|
386
459
|
def project(name)
|
387
460
|
Project.project(name)
|
388
461
|
end
|
389
462
|
|
390
|
-
#
|
463
|
+
# With no arguments, returns a list of all the projects defined so far.
|
464
|
+
#
|
465
|
+
# With arguments, returns a list of these projects. Equivalent to calling #project
|
466
|
+
# for each named project.
|
391
467
|
#
|
392
468
|
# For example:
|
393
469
|
# files = projects.map { |prj| FileList[prj.path_to("src/**/*.java") }.flatten
|
394
470
|
# puts "There are #{files.size} source files in #{projects.size} projects"
|
395
|
-
def projects()
|
396
|
-
Project.projects
|
397
|
-
end
|
398
|
-
|
399
|
-
|
400
|
-
# The local directory task executes the same task on the project
|
401
|
-
# in the local directory.
|
402
|
-
#
|
403
|
-
# For example, if the current directory project is +foo+, then
|
404
|
-
# +rake task+ executes +rake foo:task+.
|
405
471
|
#
|
406
|
-
#
|
407
|
-
|
408
|
-
|
409
|
-
# rake build
|
410
|
-
# Will execute the +foo:bar:build+ task, after switching to the directory
|
411
|
-
# of the sub-project +bar+.
|
412
|
-
class LocalDirectoryTask < Rake::Task
|
413
|
-
|
414
|
-
def initialize(*args)
|
415
|
-
super
|
416
|
-
enhance do |task|
|
417
|
-
projects = Project.projects.select { |project| project.base_dir == Rake.application.original_dir }
|
418
|
-
if verbose && projects.empty?
|
419
|
-
warn "No projects defined for directory #{Rake.application.original_dir}"
|
420
|
-
end
|
421
|
-
projects.each { |project| task("#{project.name}:#{task.name}").invoke }
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
end
|
426
|
-
|
427
|
-
|
428
|
-
class CheckTask < Rake::Task
|
429
|
-
|
430
|
-
def execute()
|
431
|
-
@warnings = []
|
432
|
-
super
|
433
|
-
report
|
434
|
-
end
|
435
|
-
|
436
|
-
def note(*msg)
|
437
|
-
@warnings += msg
|
438
|
-
end
|
439
|
-
|
440
|
-
def report()
|
441
|
-
if @warnings.empty?
|
442
|
-
puts HighLine.new.color("No warnings", :green)
|
443
|
-
else
|
444
|
-
warn "These are possible problems with your Rakefile"
|
445
|
-
@warnings.each { |msg| warn " #{msg}" }
|
446
|
-
end
|
447
|
-
end
|
448
|
-
|
472
|
+
# projects("project1", "project2").map(&:base_dir)
|
473
|
+
def projects(*args)
|
474
|
+
Project.projects *args
|
449
475
|
end
|
450
476
|
|
451
|
-
|
452
|
-
|
477
|
+
# Add project definition tests.
|
478
|
+
task("check") { |task| task.note *Project.warnings }
|
453
479
|
|
454
480
|
end
|