klaas1979-ivy4r 0.1.0 → 0.2.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 +7 -0
- data/Manifest.txt +2 -1
- data/README.txt +8 -7
- data/bin/ivy4r +3 -0
- data/lib/buildr/ivy_extension.rb +547 -0
- data/lib/ivy/target.rb +22 -16
- data/lib/ivy4r.rb +1 -1
- metadata +6 -4
data/History.txt
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
+
=== 0.2.0 / 2009-06-18
|
2
|
+
|
3
|
+
* added the Buildr ivy_extension to include ivy in buildr for dependency managment
|
4
|
+
* small improvements in documentation
|
5
|
+
|
6
|
+
|
1
7
|
=== 0.1.0 / 2009-06-17
|
2
8
|
|
3
9
|
* initial release
|
4
10
|
* support for nearly all basic IVY Ant targets
|
5
11
|
* basic validation of parameters
|
12
|
+
|
data/Manifest.txt
CHANGED
@@ -2,6 +2,8 @@ History.txt
|
|
2
2
|
Manifest.txt
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
|
+
bin/ivy4r
|
6
|
+
lib/buildr/ivy_extension.rb
|
5
7
|
lib/ivy/artifactproperty.rb
|
6
8
|
lib/ivy/artifactreport.rb
|
7
9
|
lib/ivy/buildlist.rb
|
@@ -32,4 +34,3 @@ test/ivy/ivytest.xml
|
|
32
34
|
test/ivy/test_target.rb
|
33
35
|
test/ivy/test_targets.rb
|
34
36
|
test/test_ivy4r.rb
|
35
|
-
|
data/README.txt
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
= ivy4r
|
2
2
|
|
3
3
|
* http://github.com/klaas1979/ivy4r/tree/master
|
4
|
+
* http://ivy4r.rubyforge.org/
|
4
5
|
|
5
6
|
== DESCRIPTION:
|
6
7
|
|
7
|
-
Apache Ivy dependency manager wrapper for ruby (see http://ant.apache.org/ivy/index.html for more information).
|
8
|
-
|
8
|
+
Apache Ivy dependency manager wrapper for ruby (see {Apache Ivy}[http://ant.apache.org/ivy/index.html] for more information).
|
9
|
+
Use {Apache Ivy}[http://ant.apache.org/ivy/index.html] via a ruby wrapper without the need to use Apache Ant.
|
10
|
+
The wrapper uses Antwrap[http://antwrap.rubyforge.org/] to interface with Ivy.
|
11
|
+
|
12
|
+
Includes a Extension for Buildr[http://buildr.apache.org/] to use {Apache Ivy}[http://ant.apache.org/ivy/index.html]
|
13
|
+
for dependency management.
|
9
14
|
|
10
15
|
== FEATURES/PROBLEMS:
|
11
16
|
|
@@ -46,19 +51,15 @@ Supports most standard Ivy Ant targets via Antwrap.
|
|
46
51
|
== SYNOPSIS:
|
47
52
|
|
48
53
|
To init a new Ivy4r instance set the ANT_HOME and the Ivy lib dir
|
49
|
-
<tt>
|
50
54
|
ivy4r = Ivy4r.new
|
51
55
|
ivy4r.ant_home = 'PATH TO YOUR ANTHME'
|
52
56
|
ivy4r.lib_dir = 'PATH TO IVY LIB DIR'
|
53
|
-
</tt>
|
54
57
|
as an alternative to setting the ANT_HOME you can set an +Antwrap+ instance directly:
|
55
|
-
<tt>
|
56
58
|
ivy4r.ant = Buildr.ant('ivy')
|
57
|
-
</tt>
|
58
59
|
|
59
60
|
== REQUIREMENTS:
|
60
61
|
|
61
|
-
* Installed Apache Ant, to call Ivy via Antwrap
|
62
|
+
* Installed Apache Ant, to call Ivy via Antwrap
|
62
63
|
* Ivy and dependencies in a single directory. Dependencies depends on used features, see the ivy homepage for more information.
|
63
64
|
|
64
65
|
== INSTALL:
|
data/bin/ivy4r
CHANGED
@@ -0,0 +1,547 @@
|
|
1
|
+
require 'ivy4r'
|
2
|
+
|
3
|
+
module Buildr
|
4
|
+
module Ivy
|
5
|
+
|
6
|
+
# TODO extend extension to download ivy stuff with dependencies automatically
|
7
|
+
# VERSION = '2.1.0-rc1'
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def setting(*keys)
|
12
|
+
setting = Buildr.settings.build['ivy']
|
13
|
+
keys.each { |key| setting = setting[key] unless setting.nil? }
|
14
|
+
setting
|
15
|
+
end
|
16
|
+
|
17
|
+
# def version
|
18
|
+
# setting['version'] || VERSION
|
19
|
+
# end
|
20
|
+
# def dependencies
|
21
|
+
# @dependencies ||= [
|
22
|
+
# "org.apache.ivy:ivy:jar:#{version}",
|
23
|
+
# 'com.jcraft:jsch:jar:1.41',
|
24
|
+
# 'oro:oro:jar:2.08'
|
25
|
+
# ]
|
26
|
+
# end
|
27
|
+
end
|
28
|
+
|
29
|
+
class IvyConfig
|
30
|
+
|
31
|
+
attr_accessor :extension_dir, :resolved
|
32
|
+
|
33
|
+
# Store the current project and initialize ivy ant wrapper
|
34
|
+
def initialize(project)
|
35
|
+
@project = project
|
36
|
+
if project.parent.nil?
|
37
|
+
@extension_dir = File.join("#{@project.base_dir}", "#{ENV['BUILDR_EXT_DIR']}")
|
38
|
+
else
|
39
|
+
@extension_dir = @project.parent.ivy.extension_dir
|
40
|
+
@base_ivy = @project.parent.ivy unless own_file?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def enabled?
|
45
|
+
@enabled ||= Ivy.setting('enabled') || true
|
46
|
+
end
|
47
|
+
|
48
|
+
def own_file?
|
49
|
+
@own_file ||= File.exists?(@project.path_to(file))
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns the correct ant instance to use, if project has its own ivy file uses the ivy file
|
53
|
+
# of project, if not uses the ivy file of parent project.
|
54
|
+
def ant
|
55
|
+
unless @ant
|
56
|
+
if own_file?
|
57
|
+
@ant = ::Ivy4r.new(@project.ant('ivy'))
|
58
|
+
@ant.lib_dir = lib_dir
|
59
|
+
@ant.project_dir = @extension_dir
|
60
|
+
else
|
61
|
+
@ant = @project.parent.ivy.ant
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@ant
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns name of publish target to use for this project
|
68
|
+
def file_project
|
69
|
+
own_file? ? @project : @base_ivy.file_project
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns the artifacts for given configurations as array
|
73
|
+
def deps(*confs)
|
74
|
+
configure
|
75
|
+
pathid = "ivy.deps." + confs.join('.')
|
76
|
+
ant.cachepath :conf => confs.join(','), :pathid => pathid
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns ivy info for configured ivy file.
|
80
|
+
def info
|
81
|
+
if @base_ivy
|
82
|
+
@base_ivy.info
|
83
|
+
else
|
84
|
+
ant.settings :id => 'ivy.info.settingsref'
|
85
|
+
ant.info :file => file, :settingsRef => 'ivy.info.settingsref'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Configures the ivy instance with additional properties and loading the settings file if it was provided
|
90
|
+
def configure
|
91
|
+
if @base_ivy
|
92
|
+
@base_ivy.configure
|
93
|
+
else
|
94
|
+
unless @configured
|
95
|
+
ant.property['ivy.status'] = status
|
96
|
+
ant.property['ivy.home'] = home
|
97
|
+
properties.each {|key, value| ant.property[key.to_s] = value }
|
98
|
+
@configured = ant.settings :file => settings if settings
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Resolves the configured file once.
|
104
|
+
def resolve
|
105
|
+
if @base_ivy
|
106
|
+
@base_ivy.resolve
|
107
|
+
else
|
108
|
+
unless @resolved
|
109
|
+
@resolved = ant.resolve :file => file
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns the additional infos for the manifest file.
|
115
|
+
def manifest
|
116
|
+
if @base_ivy
|
117
|
+
@base_ivy.manifest
|
118
|
+
else
|
119
|
+
{
|
120
|
+
'organisation' => @resolved['ivy.organisation'],
|
121
|
+
'module' => @resolved['ivy.organisation'],
|
122
|
+
'revision' => revision
|
123
|
+
}
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Creates the standard ivy dependency report
|
128
|
+
def report
|
129
|
+
ant.report :todir => report_dir
|
130
|
+
end
|
131
|
+
|
132
|
+
# Publishs the project as defined in ivy file if it has not been published already
|
133
|
+
def publish
|
134
|
+
if @base_ivy
|
135
|
+
@base_ivy.publish
|
136
|
+
else
|
137
|
+
unless @published
|
138
|
+
options = {:status => status, :pubrevision => revision, :artifactspattern => "#{publish_from}/[artifact].[ext]"}
|
139
|
+
options = publish_options * options
|
140
|
+
ant.publish options
|
141
|
+
@published = true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def home
|
147
|
+
@ivy_home_dir ||= Ivy.setting('home.dir') || "#{@extension_dir}/ivy-home"
|
148
|
+
end
|
149
|
+
|
150
|
+
def lib_dir
|
151
|
+
@lib_dir ||= Ivy.setting('lib.dir') || "#{home}/jars"
|
152
|
+
end
|
153
|
+
|
154
|
+
def settings
|
155
|
+
@settings ||= Ivy.setting('settings.file') || "#{@extension_dir}/ant-scripts/ivysettings.xml"
|
156
|
+
end
|
157
|
+
|
158
|
+
def file
|
159
|
+
@ivy_file ||= Ivy.setting('ivy.file') || 'ivy.xml'
|
160
|
+
end
|
161
|
+
|
162
|
+
# Sets the revision to use for the project, this is useful for development revisions that
|
163
|
+
# have an appended timestamp or any other dynamic revisioning.
|
164
|
+
#
|
165
|
+
# To set a different revision this method can be used in different ways.
|
166
|
+
# 1. project.ivy.revision(revision) to set the revision directly
|
167
|
+
# 2. project.ivy.revision { |ivy| [calculate revision] } use the block for dynamic
|
168
|
+
# calculation of the revision. You can access ivy4r via <tt>ivy.ant.[method]</tt>
|
169
|
+
def revision(*revision, &block)
|
170
|
+
raise "Invalid call with parameters and block!" if revision.size > 0 && block
|
171
|
+
if revision.empty? && block.nil?
|
172
|
+
if @revision_calc
|
173
|
+
@revision ||= @revision_calc.call(self)
|
174
|
+
else
|
175
|
+
@revision ||= @project.version
|
176
|
+
end
|
177
|
+
elsif block.nil?
|
178
|
+
raise "revision value invalid #{revision.join(', ')}" unless revision.size == 1
|
179
|
+
@revision = revision[0]
|
180
|
+
self
|
181
|
+
else
|
182
|
+
@revision_calc = block
|
183
|
+
self
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
# Sets the status to use for the project, this is useful for custom status handling
|
188
|
+
# like integration, alpha, gold.
|
189
|
+
#
|
190
|
+
# To set a different status this method can be used in different ways.
|
191
|
+
# 1. project.ivy.status(status) to set the status directly
|
192
|
+
# 2. project.ivy.status { |ivy| [calculate status] } use the block for dynamic
|
193
|
+
# calculation of the status. You can access ivy4r via <tt>ivy.ant.[method]</tt>
|
194
|
+
def status(*status, &block)
|
195
|
+
raise "Invalid call with parameters and block!" if status.size > 0 && block
|
196
|
+
if status.empty? && block.nil?
|
197
|
+
if @status_calc
|
198
|
+
@status ||= @status_calc.call(self)
|
199
|
+
else
|
200
|
+
@status ||= Ivy.setting('status') || 'integration'
|
201
|
+
end
|
202
|
+
elsif status.empty? && block.nil?
|
203
|
+
raise "status value invalid #{status.join(', ')}" unless status.size == 1
|
204
|
+
@status = status[0]
|
205
|
+
self
|
206
|
+
else
|
207
|
+
@status_calc = block
|
208
|
+
self
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Sets the publish options to use for the project. The options are merged with the default
|
213
|
+
# options including value set via #publish_from and overwrite all of them.
|
214
|
+
#
|
215
|
+
# To set the options this method can be used in different ways.
|
216
|
+
# 1. project.ivy.publish_options(options) to set the options directly
|
217
|
+
# 2. project.ivy.publish_options { |ivy| [calculate options] } use the block for dynamic
|
218
|
+
# calculation of options. You can access ivy4r via <tt>ivy.ant.[method]</tt>
|
219
|
+
def publish_options(*options, &block)
|
220
|
+
raise "Invalid call with parameters and block!" if options.size > 0 && block
|
221
|
+
if options.empty? && block.nil?
|
222
|
+
if @publish_options_calc
|
223
|
+
@publish_options ||= @publish_options_calc.call(self)
|
224
|
+
else
|
225
|
+
@publish_options ||= Ivy.setting('publish.options')
|
226
|
+
end
|
227
|
+
else
|
228
|
+
raise "Could not set 'publish_options' for '#{@project.name}' without own ivy file!" unless own_file?
|
229
|
+
if options.size > 0 && block.nil?
|
230
|
+
raise "publish options value invalid #{options.join(', ')}" unless options.size == 1
|
231
|
+
@publish_options = options[0]
|
232
|
+
self
|
233
|
+
else
|
234
|
+
@publish_options_calc = block
|
235
|
+
self
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
# Sets the additional properties for the ivy process use a Hash with the properties to set.
|
241
|
+
def properties(*properties)
|
242
|
+
if properties.empty?
|
243
|
+
@properties ||= {}
|
244
|
+
else
|
245
|
+
raise "properties value invalid #{properties.join(', ')}" unless properties.size == 1
|
246
|
+
@properties = properties[0]
|
247
|
+
self
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
# Sets the local repository for ivy files
|
252
|
+
def local_repository(*local_repository)
|
253
|
+
if local_repository.empty?
|
254
|
+
if own_file?
|
255
|
+
@local_repository ||= Ivy.setting('local.repository.dir') || "#{home}/repository"
|
256
|
+
else
|
257
|
+
@project.parent.ivy.local_repository
|
258
|
+
end
|
259
|
+
else
|
260
|
+
raise "Could not set 'local_repository' for '#{@project.name}' without own ivy file!" unless own_file?
|
261
|
+
raise "local_repository value invalid #{local_repository.join(', ')}" unless local_repository.size == 1
|
262
|
+
@local_repository = local_repository[0]
|
263
|
+
self
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
# Maps a package to a different name for publishing. This name is used instead of the default name
|
268
|
+
# for publishing use a hash with the +package+ as key and the newly mapped name as value. I.e.
|
269
|
+
# <tt>ivy.name(package(:jar) => 'new_name_without_version_number.jar')</tt>
|
270
|
+
# Note that this method is additive, a second call adds the names to the first.
|
271
|
+
def name(*name_mappings)
|
272
|
+
if name_mappings.empty?
|
273
|
+
@name_mappings ||= {}
|
274
|
+
else
|
275
|
+
raise "name_mappings value invalid #{name_mappings.join(', ')}" unless name_mappings.size == 1
|
276
|
+
@name_mappings = @name_mappings ? @name_mappings + name_mappings[0] : name_mappings[0].dup
|
277
|
+
self
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
# Sets the directory to publish artifacts from.
|
282
|
+
def publish_from(*publish_dir)
|
283
|
+
if publish_dir.empty?
|
284
|
+
if own_file?
|
285
|
+
@publish_from ||= Ivy.setting('publish.from') || @project.path_to(:target)
|
286
|
+
else
|
287
|
+
@project.parent.ivy.publish_from
|
288
|
+
end
|
289
|
+
else
|
290
|
+
raise "Could not set 'publish_from' for '#{@project.name}' without own ivy file!" unless own_file?
|
291
|
+
raise "publish_from value invalid #{publish_dir.join(', ')}" unless publish_dir.size == 1
|
292
|
+
@publish_from = publish_dir[0]
|
293
|
+
self
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
# Sets the directory to create dependency reports in.
|
298
|
+
def report_dir(*report_dir)
|
299
|
+
if report_dir.empty?
|
300
|
+
if own_file?
|
301
|
+
@report_dir ||= Ivy.setting('report.dir') || @project.path_to(:reports, 'ivy')
|
302
|
+
else
|
303
|
+
@project.parent.ivy.report_dir
|
304
|
+
end
|
305
|
+
else
|
306
|
+
raise "Could not set 'report_dir' for '#{@project.name}' without own ivy file!" unless own_file?
|
307
|
+
raise "publish_from value invalid #{report_dir.join(', ')}" unless report_dir.size == 1
|
308
|
+
@report_dir = report_dir[0]
|
309
|
+
self
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# Set the configuration artifacts to use in package tasks like +:war+ or +:ear+.
|
314
|
+
# <tt>project.ivy.package_conf('server', 'client')</tt>
|
315
|
+
# or
|
316
|
+
# <tt>project.ivy.package_conf(['server', 'client'])</tt>
|
317
|
+
def package_conf(*package_conf)
|
318
|
+
if package_conf.empty?
|
319
|
+
@package_conf ||= [Ivy.setting('package.conf') || 'prod'].flatten.uniq
|
320
|
+
else
|
321
|
+
@package_conf = [package_conf].flatten.uniq
|
322
|
+
self
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
# Sets the includes pattern(s) to use for packages. I.e.
|
327
|
+
# <tt>project.ivy.package_include(/\.jar/, /\.gz/)</tt>
|
328
|
+
def package_include(*includes)
|
329
|
+
if includes.empty?
|
330
|
+
@package_include ||= [Ivy.setting('package.include') || /\.jar/].flatten.uniq
|
331
|
+
else
|
332
|
+
@package_include = [includes].flatten.uniq
|
333
|
+
self
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
# Sets the exclude pattern(s) to use for packages. I.e.
|
338
|
+
# <tt>project.ivy.package_exclude(/\.zip/, /\.tar/)</tt>
|
339
|
+
def package_exclude(*excludes)
|
340
|
+
if excludes.empty?
|
341
|
+
@package_exclude ||= [Ivy.setting('package.exlude') || ''].flatten.uniq
|
342
|
+
else
|
343
|
+
@package_exclude = [excludes].flatten.uniq
|
344
|
+
self
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
# Set the configuration artifacts to use for compile tasks, added to <tt>compile.with</tt>
|
349
|
+
# <tt>project.ivy.compile_conf('server', 'client')</tt>
|
350
|
+
def compile_conf(*compile_conf)
|
351
|
+
if compile_conf.empty?
|
352
|
+
@compile_conf ||= [Ivy.setting('compile.conf') || 'compile'].flatten.uniq
|
353
|
+
else
|
354
|
+
@compile_conf = [compile_conf].flatten.uniq
|
355
|
+
self
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
# Set the configuration artifacts to use for test tasks, added to <tt>test.compile.with</tt>
|
360
|
+
# and <tt>test.with</tt>. Note that all artifacts from #compile_conf are added automatically.
|
361
|
+
# <tt>project.ivy.test_conf('server', 'test')</tt>
|
362
|
+
def test_conf(*test_conf)
|
363
|
+
if test_conf.empty?
|
364
|
+
@test_conf ||= [Ivy.setting('test.conf') || 'test'].flatten.uniq
|
365
|
+
else
|
366
|
+
@test_conf = [test_conf].flatten.uniq
|
367
|
+
self
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
# The Ivy Buildr extension adding the new tasks for ivy.
|
373
|
+
module IvyExtension
|
374
|
+
include Buildr::Extension
|
375
|
+
|
376
|
+
class << self
|
377
|
+
def add_ivy_deps_to_java_tasks(project)
|
378
|
+
resolve_target = project.ivy.file_project.task('ivy:resolve')
|
379
|
+
project.task :compiledeps => resolve_target do
|
380
|
+
compile_conf = [project.ivy.compile_conf].flatten
|
381
|
+
project.compile.with project.ivy.deps(compile_conf)
|
382
|
+
info "Ivy adding compile dependencies '#{compile_conf.join(', ')}' to project '#{project.name}'"
|
383
|
+
end
|
384
|
+
project.task :compile => "#{project.name}:compiledeps"
|
385
|
+
|
386
|
+
project.task :testdeps => resolve_target do
|
387
|
+
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
388
|
+
project.test.with project.ivy.deps(confs)
|
389
|
+
info "Ivy adding test dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
390
|
+
end
|
391
|
+
project.task "test:compile" => "#{project.name}:testdeps"
|
392
|
+
|
393
|
+
project.task :javadocdeps => resolve_target do
|
394
|
+
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
395
|
+
project.javadoc.with project.ivy.deps(confs)
|
396
|
+
info "Ivy adding javadoc dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
397
|
+
end
|
398
|
+
project.task :javadoc => "#{project.name}:javadocdeps"
|
399
|
+
end
|
400
|
+
|
401
|
+
def add_manifest_to_distributeables(project)
|
402
|
+
pkgs = project.packages.find_all { |pkg| [:jar, :war, :ear].member? pkg.type }
|
403
|
+
pkgs.each do |pkg|
|
404
|
+
name = "#{pkg.name}manifest"
|
405
|
+
task = project.task name => project.ivy.file_project.task('ivy:resolve') do
|
406
|
+
pkg.with :manifest => project.manifest.merge(project.ivy.manifest)
|
407
|
+
info "Adding manifest entries to package '#{pkg.name}'"
|
408
|
+
end
|
409
|
+
project.task :build => task
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
def add_prod_libs_to_distributeables(project)
|
414
|
+
includes = project.ivy.package_include
|
415
|
+
excludes = project.ivy.package_exclude
|
416
|
+
pkgs = project.packages.find_all { |pkg| [:war, :ear].member? pkg.type }
|
417
|
+
pkgs.each do |pkg|
|
418
|
+
name = "#{pkg.name}deps"
|
419
|
+
task = project.task name => project.ivy.file_project.task('ivy:resolve') do
|
420
|
+
confs = project.ivy.package_conf
|
421
|
+
libs = project.ivy.deps(confs).find_all do |lib|
|
422
|
+
lib = File.basename(lib)
|
423
|
+
use = includes.any? {|include| include === lib } && !excludes.any? {|exclude| exclude === lib}
|
424
|
+
verbose "Including '#{lib}' from package '#{pkg}' in project '#{project.name}'" if use
|
425
|
+
info "Excluding '#{lib}' from package '#{pkg}' in project '#{project.name}'" unless use
|
426
|
+
use
|
427
|
+
end
|
428
|
+
pkg.with :libs => libs
|
429
|
+
info "Adding production libs from conf '#{confs.join(', ')}' to package '#{pkg.name}' in project '#{project.name}'"
|
430
|
+
end
|
431
|
+
project.task :build => task
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
def add_copy_tasks_for_publish(project)
|
436
|
+
if project.ivy.own_file?
|
437
|
+
Buildr.projects.each do |current|
|
438
|
+
current.packages.each do |pkg|
|
439
|
+
target_file = current.ivy.name[pkg] || File.basename(pkg.name).gsub(/-#{project.version}/, '')
|
440
|
+
taskname = current.path_to(project.ivy.publish_from, target_file)
|
441
|
+
if taskname != pkg.name
|
442
|
+
project.file taskname => pkg.name do
|
443
|
+
verbose "Ivy copying '#{pkg.name}' to '#{taskname}' for publishing"
|
444
|
+
FileUtils.mkdir File.dirname(taskname) unless File.directory?(File.dirname(taskname))
|
445
|
+
FileUtils.cp pkg.name, taskname
|
446
|
+
end
|
447
|
+
end
|
448
|
+
project.task 'ivy:publish' => taskname
|
449
|
+
end
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
# Returns the +ivy+ configuration for the project. Use this to configure Ivy.
|
456
|
+
# see IvyConfig for more details about configuration options.
|
457
|
+
def ivy
|
458
|
+
@ivy_config ||= IvyConfig.new(self)
|
459
|
+
end
|
460
|
+
|
461
|
+
first_time do
|
462
|
+
namespace 'ivy' do
|
463
|
+
desc 'Resolves the ivy dependencies'
|
464
|
+
task :resolve
|
465
|
+
|
466
|
+
desc 'Publish the artifacts to ivy repository as defined by environment'
|
467
|
+
task :publish
|
468
|
+
|
469
|
+
desc 'Creates a dependency report for the project'
|
470
|
+
task :report
|
471
|
+
|
472
|
+
desc 'Clean the local Ivy cache and the local ivy repository'
|
473
|
+
task :clean
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
before_define do |project|
|
478
|
+
if project.parent.nil? && project.ivy.enabled?
|
479
|
+
info = project.ivy.info
|
480
|
+
project.version = info['ivy.revision']
|
481
|
+
project.group = "#{info['ivy.organisation']}.#{info['ivy.module']}"
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
after_define do |project|
|
486
|
+
if project.ivy.enabled?
|
487
|
+
IvyExtension.add_ivy_deps_to_java_tasks(project)
|
488
|
+
IvyExtension.add_manifest_to_distributeables(project)
|
489
|
+
IvyExtension.add_prod_libs_to_distributeables(project)
|
490
|
+
IvyExtension.add_copy_tasks_for_publish(project)
|
491
|
+
|
492
|
+
task :clean do
|
493
|
+
# TODO This is redundant, refactor ivy_ant_wrap and this to use a single config object
|
494
|
+
info "Cleaning ivy reports"
|
495
|
+
rm_rf project.path_to(:reports, 'ivy')
|
496
|
+
end
|
497
|
+
|
498
|
+
namespace 'ivy' do
|
499
|
+
task :configure do
|
500
|
+
project.ivy.configure
|
501
|
+
end
|
502
|
+
|
503
|
+
task :resolve => "#{project.name}:ivy:configure" do
|
504
|
+
project.ivy.resolve
|
505
|
+
end
|
506
|
+
|
507
|
+
task :report => "#{project.name}:ivy:resolve" do
|
508
|
+
project.ivy.report
|
509
|
+
end
|
510
|
+
|
511
|
+
task :publish => "#{project.name}:ivy:resolve" do
|
512
|
+
project.ivy.publish
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
# Global targets that are not bound to a project
|
520
|
+
namespace 'ivy' do
|
521
|
+
task :clean do
|
522
|
+
info "Cleaning local ivy cache"
|
523
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
524
|
+
project.ivy.ant.clean
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
task :resolve do
|
529
|
+
info "Resolving all distinct ivy files"
|
530
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
531
|
+
project.task('ivy:resolve').invoke
|
532
|
+
end
|
533
|
+
end
|
534
|
+
|
535
|
+
task :publish => :package do
|
536
|
+
info "Publishing all distinct ivy files"
|
537
|
+
Buildr.projects.find_all{ |p| p.ivy.own_file? }.each do |project|
|
538
|
+
project.task('ivy:publish').invoke
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
class Buildr::Project # :nodoc:
|
544
|
+
include IvyExtension
|
545
|
+
end
|
546
|
+
end
|
547
|
+
end
|
data/lib/ivy/target.rb
CHANGED
@@ -2,19 +2,7 @@ require 'facets'
|
|
2
2
|
|
3
3
|
module Ivy
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
Parameter = Struct.new(:symbol, :mandatory) do
|
8
|
-
def mandatory?
|
9
|
-
mandatory
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
ResultValue = Struct.new(:matcher, :parser) do
|
14
|
-
def parse(value)
|
15
|
-
parser ? parser.call(value) : value
|
16
|
-
end
|
17
|
-
end
|
5
|
+
# Base class with general logic to call a Ivy ant target
|
18
6
|
class Target
|
19
7
|
attr_reader :params
|
20
8
|
|
@@ -22,11 +10,16 @@ module Ivy
|
|
22
10
|
@ant = ant
|
23
11
|
end
|
24
12
|
|
25
|
-
# Executes this ivy target with given parameters returning a result
|
13
|
+
# Executes this ivy target with given parameters returning a result.
|
14
|
+
# __params__ can be a single Hash or an Array with or without a Hash as last value.
|
15
|
+
# every value in array will be converted to string and set to __true__.
|
16
|
+
#
|
17
|
+
# I.e. <tt>[:force, 'validate', {'name' => 'Blub'}]</tt>
|
18
|
+
# results in parameters <tt>{'force'=>true, 'validate' => true, 'name'=>'Blub'}</tt>
|
26
19
|
def execute(*params)
|
27
20
|
@params = {}
|
28
21
|
params.pop.each { |key, value| @params[key] = value } if Hash === params.last
|
29
|
-
params.each { |key| @params[key] = true }
|
22
|
+
params.each { |key| @params[key.to_s] = true }
|
30
23
|
|
31
24
|
validate
|
32
25
|
before_hook
|
@@ -118,5 +111,18 @@ module Ivy
|
|
118
111
|
@ant.project.references
|
119
112
|
end
|
120
113
|
end
|
121
|
-
|
114
|
+
|
115
|
+
COMMA_SPLITTER = Proc.new {|value| value.to_s.split(',').map(&:strip)}
|
116
|
+
|
117
|
+
Parameter = Struct.new(:symbol, :mandatory) do
|
118
|
+
def mandatory?
|
119
|
+
mandatory
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
ResultValue = Struct.new(:matcher, :parser) do
|
124
|
+
def parse(value)
|
125
|
+
parser ? parser.call(value) : value
|
126
|
+
end
|
127
|
+
end
|
122
128
|
end
|
data/lib/ivy4r.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: klaas1979-ivy4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Klaas Prause
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-18 00:00:00 -07:00
|
13
13
|
default_executable: ivy4r
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 2.1.0
|
34
34
|
version:
|
35
|
-
description: Apache Ivy dependency manager wrapper for ruby (see http://ant.apache.org/ivy/index.html for more information).Use Ivy via a ruby wrapper without the need to use Apache Ant. The wrapper uses Antwrap
|
35
|
+
description: Apache Ivy dependency manager wrapper for ruby (see {Apache Ivy}[http://ant.apache.org/ivy/index.html] for more information). Use {Apache Ivy}[http://ant.apache.org/ivy/index.html] via a ruby wrapper without the need to use Apache Ant. The wrapper uses Antwrap[http://antwrap.rubyforge.org/] to interface with Ivy. Includes a Extension for Buildr[http://buildr.apache.org/] to use {Apache Ivy}[http://ant.apache.org/ivy/index.html] for dependency management.
|
36
36
|
email:
|
37
37
|
- klaas.prause@googlemail.com
|
38
38
|
executables:
|
@@ -48,6 +48,8 @@ files:
|
|
48
48
|
- Manifest.txt
|
49
49
|
- README.txt
|
50
50
|
- Rakefile
|
51
|
+
- bin/ivy4r
|
52
|
+
- lib/buildr/ivy_extension.rb
|
51
53
|
- lib/ivy/artifactproperty.rb
|
52
54
|
- lib/ivy/artifactreport.rb
|
53
55
|
- lib/ivy/buildlist.rb
|
@@ -105,7 +107,7 @@ rubyforge_project: ivy4r
|
|
105
107
|
rubygems_version: 1.2.0
|
106
108
|
signing_key:
|
107
109
|
specification_version: 3
|
108
|
-
summary: Apache Ivy dependency manager wrapper for ruby (see http://ant.apache.org/ivy/index.html for more information)
|
110
|
+
summary: Apache Ivy dependency manager wrapper for ruby (see {Apache Ivy}[http://ant.apache.org/ivy/index.html] for more information)
|
109
111
|
test_files:
|
110
112
|
- test/test_ivy4r.rb
|
111
113
|
- test/ivy/test_target.rb
|