ivy4r 0.9.15 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +29 -0
- data/README.txt +14 -5
- data/lib/buildr/ivy_extension.rb +328 -262
- data/lib/ivy/target.rb +80 -50
- data/lib/ivy4r.rb +62 -49
- data/lib/rake/ivy_extension.rb +89 -56
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,3 +1,32 @@
|
|
1
|
+
=== 0.10.0 / 2010-03-30
|
2
|
+
|
3
|
+
* Add caching support to ivy4r. Ivy4r has now an optional parameter to a caching directory where it
|
4
|
+
stores results from calls to the tasks for each parameter set. If caching is enabled and a call
|
5
|
+
with the same parameters is done the cached result is used instead of executing the task again. This
|
6
|
+
should speed up local development because long running tasks like "ivy:resolve" are cached.
|
7
|
+
Caching can be enabled in buildr with:
|
8
|
+
* add this to your build.yaml or the [home]/.buildr/settings.yaml:
|
9
|
+
ivy:
|
10
|
+
caching.enabled: true
|
11
|
+
* add a marker file to your project under the path project.path_to('use_ivy_caching') Note that this is
|
12
|
+
a marker file only the existence of the file is checked not the content!! If the file exists caching
|
13
|
+
will be used!
|
14
|
+
|
15
|
+
|
16
|
+
=== 0.9.15 / 2010-03-20
|
17
|
+
|
18
|
+
* Revert changes from 0.9.14 because the fix does not work in all environments. Use the old code again
|
19
|
+
till a fix is found that circumvents the circular dependency issue and keeps the functionality of the tasks.
|
20
|
+
|
21
|
+
=== 0.9.14 / 2010-03-14
|
22
|
+
|
23
|
+
* Do not use Buildr.projects because of a circular dependency issue with the new buildr thanks to
|
24
|
+
Pepijn Van Eeckhoudt: He has bumped into an issue in the ivy4r buildr extension that triggers
|
25
|
+
circular dependency exceptions. The culprit is the call to Buildr.projects in add_copy_tasks_for_publish.
|
26
|
+
This can cause a call to project.invoke on the project being defined itself. He has checked with the
|
27
|
+
buildr devs and they told me that Buildr.projects should probably not be called from before/after
|
28
|
+
define callbacks.
|
29
|
+
|
1
30
|
=== 0.9.13 / 2010-02-16
|
2
31
|
|
3
32
|
* Fix problems with Facets and ActiveSupport. We now only include the required core extensions,
|
data/README.txt
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
= ivy4r
|
2
2
|
|
3
3
|
* http://github.com/klaas1979/ivy4r/tree/master
|
4
|
-
* http://hamburgrb.rubyforge.org/
|
5
4
|
|
6
5
|
== DESCRIPTION:
|
7
6
|
|
@@ -9,12 +8,14 @@ Apache Ivy dependency manager wrapper for ruby (see {Apache Ivy}[http://ant.apac
|
|
9
8
|
Use {Apache Ivy}[http://ant.apache.org/ivy/index.html] via a ruby wrapper without the need to use Apache Ant.
|
10
9
|
The wrapper uses Antwrap[http://antwrap.rubyforge.org/] to interface with Ivy.
|
11
10
|
|
12
|
-
Includes a Extension for Buildr[http://buildr.apache.org/]
|
13
|
-
for dependency management.
|
11
|
+
Includes a Extension for Buildr[http://buildr.apache.org/] and Rake[http://rake.rubyforge.org] to use
|
12
|
+
{Apache Ivy}[http://ant.apache.org/ivy/index.html] for dependency management.
|
14
13
|
|
15
14
|
== FEATURES/PROBLEMS:
|
16
15
|
|
17
|
-
Supports most standard Ivy Ant targets via Antwrap.
|
16
|
+
Supports most standard Ivy Ant targets via Antwrap. Provides a caching feature so that long running ivy tasks
|
17
|
+
like resolve can be cached and are not rerun for local builds. For more information about caching see the History.txt
|
18
|
+
and checkout the source of buildr/ivy_extension.rb and rake/ivy_extension.rb.
|
18
19
|
|
19
20
|
=== Supported Ivy targets:
|
20
21
|
* info
|
@@ -48,11 +49,19 @@ Supports most standard Ivy Ant targets via Antwrap.
|
|
48
49
|
* cachefileset
|
49
50
|
* var
|
50
51
|
|
52
|
+
=== Caching of Ivy results:
|
53
|
+
For Buildr the targets ivy:enableresultcache, ivy:disableresultcache and ivy:cleanresultcache have been added.
|
54
|
+
Additionally the result cache can be enabled via the build.yaml or the global buildr settings.yaml by setting
|
55
|
+
the variable "ivy: caching.enabled: true".
|
56
|
+
|
57
|
+
For Rake the targets ivy:enableresultcache, ivy:disableresultcache and ivy:cleanresultcache have been added as
|
58
|
+
well. For Rake there is no other way to enable the caching beside this targets.
|
59
|
+
|
51
60
|
== SYNOPSIS:
|
52
61
|
|
53
62
|
To init a new Ivy4r instance set the ANT_HOME and the Ivy lib dir
|
54
63
|
ivy4r = Ivy4r.new
|
55
|
-
ivy4r.ant_home = 'PATH TO YOUR
|
64
|
+
ivy4r.ant_home = 'PATH TO YOUR ANTHOME'
|
56
65
|
ivy4r.lib_dir = 'PATH TO IVY LIB DIR'
|
57
66
|
as an alternative to setting the ANT_HOME you can set an +Antwrap+ instance directly:
|
58
67
|
ivy4r.ant = Buildr.ant('ivy')
|
data/lib/buildr/ivy_extension.rb
CHANGED
@@ -2,7 +2,7 @@ require 'ivy4r'
|
|
2
2
|
|
3
3
|
module Buildr
|
4
4
|
module Ivy
|
5
|
-
|
5
|
+
|
6
6
|
class << self
|
7
7
|
def setting(*keys)
|
8
8
|
setting = Buildr.settings.build['ivy']
|
@@ -14,14 +14,14 @@ module Buildr
|
|
14
14
|
class IvyConfig
|
15
15
|
TARGETS = [:compile, :test, :package]
|
16
16
|
TYPES = [:conf, :type, :include, :exclude]
|
17
|
-
|
17
|
+
|
18
18
|
attr_accessor :extension_dir, :resolved
|
19
|
-
|
19
|
+
|
20
20
|
attr_reader :post_resolve_task_list
|
21
21
|
|
22
22
|
# Hash of all artifacts to publish with mapping from artifact name to ivy publish name
|
23
23
|
attr_reader :publish_mappings
|
24
|
-
|
24
|
+
|
25
25
|
# Store the current project and initialize ivy ant wrapper
|
26
26
|
def initialize(project)
|
27
27
|
@project = project
|
@@ -36,22 +36,28 @@ module Buildr
|
|
36
36
|
|hash, key| hash[key] = {}
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
def enabled?
|
41
41
|
@enabled ||= Ivy.setting('enabled') || true
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def own_file?
|
45
45
|
@own_file ||= File.exists?(@project.path_to(file))
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
# Returns the correct ivy4r instance to use, if project has its own ivy file uses the ivy file
|
49
49
|
# of project, if not uses the ivy file of parent project.
|
50
50
|
# Use this for low-level access to ivy functions as needed, i.e. in +post_resolve+
|
51
51
|
def ivy4r
|
52
52
|
unless @ivy4r
|
53
53
|
if own_file?
|
54
|
-
@ivy4r = ::Ivy4r.new
|
54
|
+
@ivy4r = ::Ivy4r.new do |i|
|
55
|
+
i.ant = @project.ant('ivy')
|
56
|
+
if caching_enabled?
|
57
|
+
i.cache_dir = result_cache_dir
|
58
|
+
@project.send(:info, "Using IVY result caching in dir '#{i.cache_dir}'")
|
59
|
+
end
|
60
|
+
end
|
55
61
|
@ivy4r.lib_dir = lib_dir if lib_dir
|
56
62
|
@ivy4r.project_dir = @extension_dir
|
57
63
|
else
|
@@ -60,12 +66,30 @@ module Buildr
|
|
60
66
|
end
|
61
67
|
@ivy4r
|
62
68
|
end
|
63
|
-
|
69
|
+
|
70
|
+
# Returns if ivy result caching is enabled via build or user properties or by existence of the
|
71
|
+
# marker file.
|
72
|
+
def caching_enabled?
|
73
|
+
Buildr.settings.user['ivy']['caching.enabled'] || Ivy.setting('caching.enabled') || File.exists?(caching_marker)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns the use ivy result caching marker file
|
77
|
+
def caching_marker
|
78
|
+
project.path_to('use_ivy_caching')
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the dir to store ivy caching results in.
|
82
|
+
def result_cache_dir
|
83
|
+
dir = @project.path_to('target', 'ivycaching')
|
84
|
+
FileUtils.mkdir_p dir
|
85
|
+
dir
|
86
|
+
end
|
87
|
+
|
64
88
|
# Returns name of the project the ivy file belongs to.
|
65
89
|
def file_project
|
66
90
|
own_file? ? @project : @base_ivy.file_project
|
67
91
|
end
|
68
|
-
|
92
|
+
|
69
93
|
# Returns the artifacts for given configurations as array
|
70
94
|
# this is a post resolve task.
|
71
95
|
# the arguments are checked for the following:
|
@@ -89,11 +113,11 @@ module Buildr
|
|
89
113
|
pathid = "ivy.deps." + confs.join('.') + '.' + types.join('.')
|
90
114
|
params = {:conf => confs.join(','), :pathid => pathid}
|
91
115
|
params[:type] = types.join(',') unless types.nil? || types.size == 0
|
92
|
-
|
116
|
+
|
93
117
|
ivy4r.cachepath params
|
94
118
|
end
|
95
119
|
end
|
96
|
-
|
120
|
+
|
97
121
|
# Returns ivy info for configured ivy file using a new ivy4r instance.
|
98
122
|
def info
|
99
123
|
if @base_ivy
|
@@ -105,7 +129,7 @@ module Buildr
|
|
105
129
|
result
|
106
130
|
end
|
107
131
|
end
|
108
|
-
|
132
|
+
|
109
133
|
# Configures the ivy instance with additional properties and loading the settings file if it was provided
|
110
134
|
def configure
|
111
135
|
if @base_ivy
|
@@ -119,7 +143,7 @@ module Buildr
|
|
119
143
|
end
|
120
144
|
end
|
121
145
|
end
|
122
|
-
|
146
|
+
|
123
147
|
# Resolves the configured file once.
|
124
148
|
def __resolve__
|
125
149
|
if @base_ivy
|
@@ -132,7 +156,7 @@ module Buildr
|
|
132
156
|
end
|
133
157
|
end
|
134
158
|
end
|
135
|
-
|
159
|
+
|
136
160
|
# Returns the additional infos for the manifest file.
|
137
161
|
def manifest
|
138
162
|
if @base_ivy
|
@@ -145,18 +169,18 @@ module Buildr
|
|
145
169
|
}
|
146
170
|
end
|
147
171
|
end
|
148
|
-
|
172
|
+
|
149
173
|
# Creates the standard ivy dependency report
|
150
174
|
def report
|
151
175
|
ivy4r.report :todir => report_dir
|
152
176
|
end
|
153
|
-
|
177
|
+
|
154
178
|
# Cleans the ivy cache
|
155
179
|
def cleancache
|
156
180
|
ivy4r.cleancache
|
157
181
|
end
|
158
|
-
|
159
|
-
|
182
|
+
|
183
|
+
|
160
184
|
# Publishs the project as defined in ivy file if it has not been published already
|
161
185
|
def __publish__
|
162
186
|
if @base_ivy
|
@@ -170,11 +194,11 @@ module Buildr
|
|
170
194
|
end
|
171
195
|
end
|
172
196
|
end
|
173
|
-
|
197
|
+
|
174
198
|
def home
|
175
199
|
@ivy_home_dir ||= Ivy.setting('home.dir') || "#{@extension_dir}/ivy-home"
|
176
200
|
end
|
177
|
-
|
201
|
+
|
178
202
|
def lib_dir
|
179
203
|
@lib_dir ||= Ivy.setting('lib.dir')
|
180
204
|
end
|
@@ -182,11 +206,11 @@ module Buildr
|
|
182
206
|
def settings
|
183
207
|
@settings ||= Ivy.setting('settings.file') || "#{@extension_dir}/ant-scripts/ivysettings.xml"
|
184
208
|
end
|
185
|
-
|
209
|
+
|
186
210
|
def file
|
187
211
|
@ivy_file ||= Ivy.setting('ivy.file') || 'ivy.xml'
|
188
212
|
end
|
189
|
-
|
213
|
+
|
190
214
|
# Sets the revision to use for the project, this is useful for development revisions that
|
191
215
|
# have an appended timestamp or any other dynamic revisioning.
|
192
216
|
#
|
@@ -211,7 +235,7 @@ module Buildr
|
|
211
235
|
self
|
212
236
|
end
|
213
237
|
end
|
214
|
-
|
238
|
+
|
215
239
|
# Sets the status to use for the project, this is useful for custom status handling
|
216
240
|
# like integration, alpha, gold.
|
217
241
|
#
|
@@ -236,7 +260,7 @@ module Buildr
|
|
236
260
|
self
|
237
261
|
end
|
238
262
|
end
|
239
|
-
|
263
|
+
|
240
264
|
# Sets the publish options to use for the project. The options are merged with the default
|
241
265
|
# options including value set via #publish_from and overwrite all of them.
|
242
266
|
#
|
@@ -264,7 +288,7 @@ module Buildr
|
|
264
288
|
end
|
265
289
|
end
|
266
290
|
end
|
267
|
-
|
291
|
+
|
268
292
|
# Sets the additional properties for the ivy process use a Hash with the properties to set.
|
269
293
|
def properties(*properties)
|
270
294
|
if properties.empty?
|
@@ -275,7 +299,7 @@ module Buildr
|
|
275
299
|
self
|
276
300
|
end
|
277
301
|
end
|
278
|
-
|
302
|
+
|
279
303
|
# Sets the local repository for ivy files
|
280
304
|
def local_repository(*local_repository)
|
281
305
|
if local_repository.empty?
|
@@ -291,7 +315,7 @@ module Buildr
|
|
291
315
|
self
|
292
316
|
end
|
293
317
|
end
|
294
|
-
|
318
|
+
|
295
319
|
# :call-seq:
|
296
320
|
# ivy.publish(package(:jar) => 'new_name_without_version_number.jar')
|
297
321
|
# #deprecated! ivy.name(package(:jar) => 'new_name_without_version_number.jar')
|
@@ -314,7 +338,7 @@ module Buildr
|
|
314
338
|
puts "name(*args) is deprecated use publish(*args)!"
|
315
339
|
publish(*args)
|
316
340
|
end
|
317
|
-
|
341
|
+
|
318
342
|
# Sets the directory to publish artifacts from.
|
319
343
|
def publish_from(*publish_dir)
|
320
344
|
if publish_dir.empty?
|
@@ -330,7 +354,7 @@ module Buildr
|
|
330
354
|
self
|
331
355
|
end
|
332
356
|
end
|
333
|
-
|
357
|
+
|
334
358
|
# Sets the directory to create dependency reports in.
|
335
359
|
def report_dir(*report_dir)
|
336
360
|
if report_dir.empty?
|
@@ -346,14 +370,14 @@ module Buildr
|
|
346
370
|
self
|
347
371
|
end
|
348
372
|
end
|
349
|
-
|
373
|
+
|
350
374
|
# Adds given block as post resolve action that is executed directly after #resolve has been called.
|
351
375
|
# Yields this ivy config object into block.
|
352
376
|
# <tt>project.ivy.post_resolve { |ivy| p "all deps:" + ivy.deps('all').join(", ") }</tt>
|
353
377
|
def post_resolve(&block)
|
354
378
|
post_resolve_tasks << block if block
|
355
379
|
end
|
356
|
-
|
380
|
+
|
357
381
|
# Filter artifacts for given configuration with provided filter values, this is a post resolve
|
358
382
|
# task like #deps.
|
359
383
|
# <tt>project.ivy.filter('server', 'client', :include => /b.*.jar/, :exclude => [/a\.jar/, /other.*\.jar/])</tt>
|
@@ -363,7 +387,7 @@ module Buildr
|
|
363
387
|
raise ArgumentError, "Invalid filter use :include and/or :exclude only: given #{filter.keys.inspect}"
|
364
388
|
end
|
365
389
|
includes, excludes, types = filter[:include] || [], filter[:exclude] || [], filter[:type] || []
|
366
|
-
|
390
|
+
|
367
391
|
artifacts = deps(confs.flatten, types.flatten)
|
368
392
|
if artifacts
|
369
393
|
artifacts = artifacts.find_all do |lib|
|
@@ -373,10 +397,10 @@ module Buildr
|
|
373
397
|
should_include && !excludes.any? {|exclude| exclude === lib}
|
374
398
|
end
|
375
399
|
end
|
376
|
-
|
400
|
+
|
377
401
|
artifacts
|
378
402
|
end
|
379
|
-
|
403
|
+
|
380
404
|
# :call-seq:
|
381
405
|
# for types:
|
382
406
|
# project.ivy.include(:compile => [/\.jar/, /\.gz/], :package => 'cglib.jar')
|
@@ -419,41 +443,41 @@ module Buildr
|
|
419
443
|
t = targets.to_s.split('_').find { |target| TARGETS.member? target.to_sym }
|
420
444
|
t ? t.to_sym : nil
|
421
445
|
end
|
422
|
-
|
446
|
+
|
423
447
|
def type(types)
|
424
448
|
t = types.to_s.split('_').find { |type| TYPES.member? type.to_sym }
|
425
449
|
t ? t.to_sym : nil
|
426
450
|
end
|
427
|
-
|
451
|
+
|
428
452
|
def valid_config_call?(method_name)
|
429
453
|
valid_calls = []
|
430
454
|
TYPES.each do|type|
|
431
|
-
|
432
|
-
|
433
|
-
end
|
434
|
-
end
|
435
|
-
valid_calls.member? method_name.to_s
|
436
|
-
end
|
437
|
-
|
438
|
-
# Sets a variable for given basename and type to given values. If values are empty returns the
|
439
|
-
# current value.
|
440
|
-
# I.e. <tt>handle_variable(:package, :include, /blua.*\.jar/, /da.*\.jar/)</tt>
|
441
|
-
def handle_variable(target, type, *values)
|
442
|
-
unless TARGETS.member?(target) && TYPES.member?(type)
|
443
|
-
raise ArgumentError, "Unknown config value for target #{target.inspect} and type #{type.inspect}"
|
444
|
-
end
|
445
|
-
if values.empty?
|
446
|
-
@target_config[target][type] ||= [Ivy.setting("#{target.to_s}.#{type.to_s}") || ''].flatten.uniq
|
447
|
-
else
|
448
|
-
@target_config[target][type] = [values].flatten.uniq
|
449
|
-
self
|
450
|
-
end
|
451
|
-
end
|
452
|
-
|
453
|
-
def post_resolve_tasks
|
454
|
-
@base_ivy ? @base_ivy.post_resolve_task_list : post_resolve_task_list
|
455
|
+
TARGETS.each do|target|
|
456
|
+
valid_calls << type.to_s << target.to_s << "#{type}_#{target}" << "#{target}_#{type}"
|
455
457
|
end
|
456
458
|
end
|
459
|
+
valid_calls.member? method_name.to_s
|
460
|
+
end
|
461
|
+
|
462
|
+
# Sets a variable for given basename and type to given values. If values are empty returns the
|
463
|
+
# current value.
|
464
|
+
# I.e. <tt>handle_variable(:package, :include, /blua.*\.jar/, /da.*\.jar/)</tt>
|
465
|
+
def handle_variable(target, type, *values)
|
466
|
+
unless TARGETS.member?(target) && TYPES.member?(type)
|
467
|
+
raise ArgumentError, "Unknown config value for target #{target.inspect} and type #{type.inspect}"
|
468
|
+
end
|
469
|
+
if values.empty?
|
470
|
+
@target_config[target][type] ||= [Ivy.setting("#{target.to_s}.#{type.to_s}") || ''].flatten.uniq
|
471
|
+
else
|
472
|
+
@target_config[target][type] = [values].flatten.uniq
|
473
|
+
self
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
def post_resolve_tasks
|
478
|
+
@base_ivy ? @base_ivy.post_resolve_task_list : post_resolve_task_list
|
479
|
+
end
|
480
|
+
end
|
457
481
|
|
458
482
|
=begin rdoc
|
459
483
|
The Ivy Buildr extension adding the new tasks for ivy.
|
@@ -475,229 +499,271 @@ To use ivy in a +buildfile+ do something like:
|
|
475
499
|
|
476
500
|
For more configuration options see IvyConfig.
|
477
501
|
=end
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
end
|
495
|
-
end
|
496
|
-
|
497
|
-
project.task :compile => "#{project.name}:compiledeps"
|
498
|
-
|
499
|
-
project.task :testdeps => resolve_target do
|
500
|
-
includes = project.ivy.test_include
|
501
|
-
excludes = project.ivy.test_exclude
|
502
|
-
types = project.ivy.test_type
|
503
|
-
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
504
|
-
if deps = project.ivy.filter(confs, :type => types, :include => includes, :exclude => excludes)
|
505
|
-
project.test.with [deps, project.test.dependencies].flatten
|
506
|
-
sort_dependencies(project.test.dependencies, deps, project.path_to(''))
|
507
|
-
sort_dependencies(project.test.compile.dependencies, deps, project.path_to(''))
|
508
|
-
info "Ivy adding test dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
509
|
-
end
|
510
|
-
end
|
511
|
-
project.task "test:compile" => "#{project.name}:testdeps"
|
512
|
-
|
513
|
-
project.task :javadocdeps => resolve_target do
|
514
|
-
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
515
|
-
if deps = project.ivy.deps(confs)
|
516
|
-
project.javadoc.with deps
|
517
|
-
info "Ivy adding javadoc dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
518
|
-
end
|
519
|
-
end
|
520
|
-
project.task :javadoc => "#{project.name}:javadocdeps"
|
521
|
-
|
522
|
-
[project.task(:eclipse), project.task(:idea), project.task(:idea7x)].each do |task|
|
523
|
-
task.prerequisites.each{|p| p.enhance ["#{project.name}:compiledeps", "#{project.name}:testdeps"]}
|
524
|
-
end
|
502
|
+
module IvyExtension
|
503
|
+
include Buildr::Extension
|
504
|
+
|
505
|
+
class << self
|
506
|
+
|
507
|
+
def add_ivy_deps_to_java_tasks(project)
|
508
|
+
resolve_target = project.ivy.file_project.task('ivy:resolve')
|
509
|
+
project.task :compiledeps => resolve_target do
|
510
|
+
includes = project.ivy.compile_include
|
511
|
+
excludes = project.ivy.compile_exclude
|
512
|
+
types = project.ivy.compile_type
|
513
|
+
confs = [project.ivy.compile_conf].flatten
|
514
|
+
if deps = project.ivy.filter(confs, :type => types, :include => includes, :exclude => excludes)
|
515
|
+
project.compile.with [deps, project.compile.dependencies].flatten
|
516
|
+
sort_dependencies(project.compile.dependencies, deps, project.path_to(''))
|
517
|
+
info "Ivy adding compile dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
525
518
|
end
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
1
|
550
|
-
else
|
551
|
-
old_deps.index(a) <=> old_deps.index(b)
|
552
|
-
end
|
553
|
-
end
|
519
|
+
end
|
520
|
+
|
521
|
+
project.task :compile => "#{project.name}:compiledeps"
|
522
|
+
|
523
|
+
project.task :testdeps => resolve_target do
|
524
|
+
includes = project.ivy.test_include
|
525
|
+
excludes = project.ivy.test_exclude
|
526
|
+
types = project.ivy.test_type
|
527
|
+
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
528
|
+
if deps = project.ivy.filter(confs, :type => types, :include => includes, :exclude => excludes)
|
529
|
+
project.test.with [deps, project.test.dependencies].flatten
|
530
|
+
sort_dependencies(project.test.dependencies, deps, project.path_to(''))
|
531
|
+
sort_dependencies(project.test.compile.dependencies, deps, project.path_to(''))
|
532
|
+
info "Ivy adding test dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
533
|
+
end
|
534
|
+
end
|
535
|
+
project.task "test:compile" => "#{project.name}:testdeps"
|
536
|
+
|
537
|
+
project.task :javadocdeps => resolve_target do
|
538
|
+
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
539
|
+
if deps = project.ivy.deps(confs)
|
540
|
+
project.javadoc.with deps
|
541
|
+
info "Ivy adding javadoc dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
554
542
|
end
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
543
|
+
end
|
544
|
+
project.task :javadoc => "#{project.name}:javadocdeps"
|
545
|
+
|
546
|
+
[project.task(:eclipse), project.task(:idea), project.task(:idea7x)].each do |task|
|
547
|
+
task.prerequisites.each{|p| p.enhance ["#{project.name}:compiledeps", "#{project.name}:testdeps"]}
|
548
|
+
end
|
549
|
+
end
|
550
|
+
|
551
|
+
# Sorts the dependencies in #deps replacing the old order.
|
552
|
+
# Sorting is done as follows:
|
553
|
+
# 1. all dependencies that belong to the project identified by #project_path,
|
554
|
+
# .i.e. instrumented-classes, resources in the order the are contained in the array
|
555
|
+
# 2. all ivy dependencies identified by #ivy_deps
|
556
|
+
# 3. all dependencies added automatically by buildr
|
557
|
+
def sort_dependencies(deps, ivy_deps, project_path)
|
558
|
+
old_deps = deps.dup
|
559
|
+
belongs_to_project = /#{project_path}/
|
560
|
+
deps.sort! do |a, b|
|
561
|
+
a_belongs_to_project = belongs_to_project.match(a.to_s)
|
562
|
+
b_belongs_to_project = belongs_to_project.match(b.to_s)
|
563
|
+
a_ivy = ivy_deps.member? a
|
564
|
+
b_ivy = ivy_deps.member? b
|
565
|
+
|
566
|
+
if a_belongs_to_project && !b_belongs_to_project
|
567
|
+
-1
|
568
|
+
elsif !a_belongs_to_project && b_belongs_to_project
|
569
|
+
1
|
570
|
+
elsif a_ivy && !b_ivy
|
571
|
+
-1
|
572
|
+
elsif !a_ivy && b_ivy
|
573
|
+
1
|
574
|
+
else
|
575
|
+
old_deps.index(a) <=> old_deps.index(b)
|
566
576
|
end
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
pkg.with :libs => [deps, pkg.libs].flatten
|
578
|
-
info "Adding production libs from conf '#{confs.join(', ')}' to WAR '#{pkg.name}' in project '#{project.name}'"
|
579
|
-
end
|
580
|
-
end
|
581
|
-
project.task :build => task
|
582
|
-
end
|
583
|
-
|
584
|
-
pkgs = project.packages.find_all { |pkg| ['ear'].member? pkg.type.to_s }
|
585
|
-
pkgs.each do |pkg|
|
586
|
-
task = project.task "#{pkg.name}deps" => project.ivy.file_project.task('ivy:resolve') do
|
587
|
-
includes = project.ivy.package_include
|
588
|
-
excludes = project.ivy.package_exclude
|
589
|
-
types = project.ivy.package_type
|
590
|
-
confs = project.ivy.package_conf
|
591
|
-
if deps = project.ivy.filter(confs, :type => types, :include => includes, :exclude => excludes)
|
592
|
-
pkg.add deps, :type => :lib, :path => ''
|
593
|
-
info "Adding production libs from conf '#{confs.join(', ')}' to EAR '#{pkg.name}' in project '#{project.name}'"
|
594
|
-
end
|
595
|
-
end
|
596
|
-
project.task :build => task
|
597
|
-
end
|
577
|
+
end
|
578
|
+
end
|
579
|
+
|
580
|
+
def add_manifest_to_distributeables(project)
|
581
|
+
pkgs = project.packages.find_all { |pkg| ['jar', 'war', 'ear'].member? pkg.type.to_s }
|
582
|
+
pkgs.each do |pkg|
|
583
|
+
name = "#{pkg.name}manifest"
|
584
|
+
task = project.task name => project.ivy.file_project.task('ivy:resolve') do
|
585
|
+
pkg.with :manifest => pkg.manifest.merge(project.manifest.merge(project.ivy.manifest))
|
586
|
+
info "Adding manifest entries to package '#{pkg.name}'"
|
598
587
|
end
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
end
|
615
|
-
end
|
588
|
+
project.task :build => task
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
592
|
+
def add_prod_libs_to_distributeables(project)
|
593
|
+
pkgs = project.packages.find_all { |pkg| ['war'].member? pkg.type.to_s }
|
594
|
+
pkgs.each do |pkg|
|
595
|
+
task = project.task "#{pkg.name}deps" => project.ivy.file_project.task('ivy:resolve') do
|
596
|
+
includes = project.ivy.package_include
|
597
|
+
excludes = project.ivy.package_exclude
|
598
|
+
types = project.ivy.package_type
|
599
|
+
confs = project.ivy.package_conf
|
600
|
+
if deps = project.ivy.filter(confs, :type => types, :include => includes, :exclude => excludes)
|
601
|
+
pkg.with :libs => [deps, pkg.libs].flatten
|
602
|
+
info "Adding production libs from conf '#{confs.join(', ')}' to WAR '#{pkg.name}' in project '#{project.name}'"
|
616
603
|
end
|
617
604
|
end
|
605
|
+
project.task :build => task
|
618
606
|
end
|
619
|
-
|
620
|
-
# Returns the +ivy+ configuration for the project. Use this to configure Ivy.
|
621
|
-
# see IvyConfig for more details about configuration options.
|
622
|
-
def ivy
|
623
|
-
@ivy_config ||= IvyConfig.new(self)
|
624
|
-
end
|
625
|
-
|
626
|
-
first_time do
|
627
|
-
namespace 'ivy' do
|
628
|
-
desc 'Resolves the ivy dependencies'
|
629
|
-
task :resolve
|
630
|
-
|
631
|
-
desc 'Publish the artifacts to ivy repository as defined by environment'
|
632
|
-
task :publish
|
633
|
-
|
634
|
-
desc 'Creates a dependency report for the project'
|
635
|
-
task :report
|
636
607
|
|
637
|
-
|
638
|
-
|
608
|
+
pkgs = project.packages.find_all { |pkg| ['ear'].member? pkg.type.to_s }
|
609
|
+
pkgs.each do |pkg|
|
610
|
+
task = project.task "#{pkg.name}deps" => project.ivy.file_project.task('ivy:resolve') do
|
611
|
+
includes = project.ivy.package_include
|
612
|
+
excludes = project.ivy.package_exclude
|
613
|
+
types = project.ivy.package_type
|
614
|
+
confs = project.ivy.package_conf
|
615
|
+
if deps = project.ivy.filter(confs, :type => types, :include => includes, :exclude => excludes)
|
616
|
+
pkg.add deps, :type => :lib, :path => ''
|
617
|
+
info "Adding production libs from conf '#{confs.join(', ')}' to EAR '#{pkg.name}' in project '#{project.name}'"
|
618
|
+
end
|
639
619
|
end
|
620
|
+
project.task :build => task
|
640
621
|
end
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
# TODO This is redundant, refactor ivy_ant_wrap and this to use a single config object
|
656
|
-
rm_rf project.path_to(:reports, 'ivy')
|
657
|
-
project.ivy.cleancache
|
658
|
-
end
|
659
|
-
|
660
|
-
task :resolve => "#{project.name}:ivy:configure" do
|
661
|
-
project.ivy.__resolve__
|
662
|
-
end
|
663
|
-
|
664
|
-
task :report => "#{project.name}:ivy:resolve" do
|
665
|
-
project.ivy.report
|
666
|
-
end
|
667
|
-
|
668
|
-
task :publish => "#{project.name}:ivy:resolve" do
|
669
|
-
project.ivy.__publish__
|
622
|
+
end
|
623
|
+
|
624
|
+
def add_copy_tasks_for_publish(project)
|
625
|
+
if project.ivy.own_file?
|
626
|
+
Buildr.projects.each do |current|
|
627
|
+
current.packages.each do |pkg|
|
628
|
+
target_file = current.ivy.name[pkg] || File.basename(pkg.name).gsub(/-#{project.version}/, '')
|
629
|
+
taskname = current.path_to(project.ivy.publish_from, target_file)
|
630
|
+
if taskname != pkg.name
|
631
|
+
project.file taskname => pkg.name do
|
632
|
+
verbose "Ivy copying '#{pkg.name}' to '#{taskname}' for publishing"
|
633
|
+
FileUtils.mkdir File.dirname(taskname) unless File.directory?(File.dirname(taskname))
|
634
|
+
FileUtils.cp pkg.name, taskname
|
635
|
+
end
|
670
636
|
end
|
637
|
+
project.task 'ivy:publish' => taskname
|
671
638
|
end
|
672
639
|
end
|
673
640
|
end
|
674
641
|
end
|
675
|
-
|
676
|
-
|
642
|
+
end
|
643
|
+
|
644
|
+
# Returns the +ivy+ configuration for the project. Use this to configure Ivy.
|
645
|
+
# see IvyConfig for more details about configuration options.
|
646
|
+
def ivy
|
647
|
+
@ivy_config ||= IvyConfig.new(self)
|
648
|
+
end
|
649
|
+
|
650
|
+
first_time do
|
677
651
|
namespace 'ivy' do
|
678
|
-
|
679
|
-
|
680
|
-
|
652
|
+
desc 'Resolves the ivy dependencies'
|
653
|
+
task :resolve
|
654
|
+
|
655
|
+
desc 'Publish the artifacts to ivy repository as defined by environment'
|
656
|
+
task :publish
|
657
|
+
|
658
|
+
desc 'Creates a dependency report for the project'
|
659
|
+
task :report
|
660
|
+
|
661
|
+
desc 'Clean the local Ivy cache and the local ivy repository'
|
662
|
+
task :clean
|
663
|
+
|
664
|
+
desc 'Clean the local Ivy result cache to force execution of ivy targets'
|
665
|
+
task :cleanresultcache
|
666
|
+
|
667
|
+
desc 'Enable the local Ivy result cache by creating the marker file'
|
668
|
+
task :enableresultcache
|
669
|
+
|
670
|
+
desc 'Disable the local Ivy result cache by removing the marker file'
|
671
|
+
task :disableresultcache
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
675
|
+
after_define do |project|
|
676
|
+
if project.ivy.enabled?
|
677
|
+
IvyExtension.add_ivy_deps_to_java_tasks(project)
|
678
|
+
IvyExtension.add_manifest_to_distributeables(project)
|
679
|
+
IvyExtension.add_prod_libs_to_distributeables(project)
|
680
|
+
IvyExtension.add_copy_tasks_for_publish(project)
|
681
|
+
|
682
|
+
namespace 'ivy' do
|
683
|
+
task :configure do
|
684
|
+
project.ivy.configure
|
681
685
|
end
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
project.task('ivy:resolve').invoke
|
686
|
+
|
687
|
+
task :clean => :configure do
|
688
|
+
# TODO This is redundant, refactor ivy_ant_wrap and this to use a single config object
|
689
|
+
rm_rf project.path_to(:reports, 'ivy')
|
690
|
+
project.ivy.cleancache
|
688
691
|
end
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
692
|
+
|
693
|
+
task :cleanresultcache do
|
694
|
+
project.send(:info, "Deleting IVY result cache dir '#{project.ivy.result_cache_dir}'")
|
695
|
+
rm_rf project.ivy.result_cache_dir
|
696
|
+
end
|
697
|
+
|
698
|
+
task :enableresultcache do
|
699
|
+
project.send(:info, "Creating IVY caching marker file '#{project.ivy.caching_marker}'")
|
700
|
+
touch project.ivy.caching_marker
|
701
|
+
end
|
702
|
+
|
703
|
+
task :disableresultcache do
|
704
|
+
project.send(:info, "Deleting IVY aching marker file '#{project.ivy.caching_marker}'")
|
705
|
+
rm_f project.ivy.caching_marker
|
706
|
+
end
|
707
|
+
|
708
|
+
task :resolve => "#{project.name}:ivy:configure" do
|
709
|
+
project.ivy.__resolve__
|
710
|
+
end
|
711
|
+
|
712
|
+
task :report => "#{project.name}:ivy:resolve" do
|
713
|
+
project.ivy.report
|
714
|
+
end
|
715
|
+
|
716
|
+
task :publish => "#{project.name}:ivy:resolve" do
|
717
|
+
project.ivy.__publish__
|
695
718
|
end
|
696
719
|
end
|
697
720
|
end
|
721
|
+
end
|
722
|
+
end
|
698
723
|
|
699
|
-
|
700
|
-
|
724
|
+
# Global targets that are not bound to a project
|
725
|
+
namespace 'ivy' do
|
726
|
+
task :clean do
|
727
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
728
|
+
project.task('ivy:clean').invoke
|
729
|
+
end
|
730
|
+
end
|
731
|
+
|
732
|
+
task :cleanresultcache do
|
733
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
734
|
+
project.task('ivy:cleanresultcache').invoke
|
701
735
|
end
|
702
736
|
end
|
737
|
+
|
738
|
+
task :enableresultcache do
|
739
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
740
|
+
project.task('ivy:enableresultcache').invoke
|
741
|
+
end
|
742
|
+
end
|
743
|
+
|
744
|
+
task :disableresultcache do
|
745
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
746
|
+
project.task('ivy:disableresultcache').invoke
|
747
|
+
end
|
748
|
+
end
|
749
|
+
|
750
|
+
task :resolve do
|
751
|
+
info "Resolving all distinct ivy files"
|
752
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
753
|
+
project.task('ivy:resolve').invoke
|
754
|
+
end
|
755
|
+
end
|
756
|
+
|
757
|
+
task :publish => :package do
|
758
|
+
info "Publishing all distinct ivy files"
|
759
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
760
|
+
project.task('ivy:publish').invoke
|
761
|
+
end
|
762
|
+
end
|
763
|
+
end
|
764
|
+
|
765
|
+
class Buildr::Project # :nodoc:
|
766
|
+
include IvyExtension
|
767
|
+
end
|
768
|
+
end
|
703
769
|
end
|