buildr 1.4.2-java → 1.4.3-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/CHANGELOG +29 -3
  2. data/LICENSE +0 -0
  3. data/NOTICE +0 -0
  4. data/_jbuildr +2 -0
  5. data/addon/buildr/antlr.rb +0 -0
  6. data/addon/buildr/cobertura.rb +0 -0
  7. data/addon/buildr/drb.rb +0 -0
  8. data/addon/buildr/emma.rb +0 -0
  9. data/addon/buildr/javacc.rb +0 -0
  10. data/addon/buildr/jdepend.rb +0 -0
  11. data/addon/buildr/jetty.rb +0 -0
  12. data/addon/buildr/jibx.rb +0 -0
  13. data/addon/buildr/nailgun.rb +0 -0
  14. data/addon/buildr/org/apache/buildr/BuildrNail.java +0 -0
  15. data/addon/buildr/org/apache/buildr/JettyWrapper.java +0 -0
  16. data/addon/buildr/xmlbeans.rb +0 -0
  17. data/buildr.gemspec +1 -1
  18. data/doc/_config.yml +0 -0
  19. data/doc/_layouts/preface.html +0 -0
  20. data/doc/css/syntax.css +0 -0
  21. data/doc/extending.textile +0 -0
  22. data/doc/images/asf-logo.gif +0 -0
  23. data/doc/images/buildr-hires.png +0 -0
  24. data/doc/images/buildr.png +0 -0
  25. data/doc/images/favicon.png +0 -0
  26. data/doc/images/growl-icon.tiff +0 -0
  27. data/doc/images/note.png +0 -0
  28. data/doc/images/project-structure.png +0 -0
  29. data/doc/images/tip.png +0 -0
  30. data/doc/images/zbuildr.png +0 -0
  31. data/doc/images/zbuildr.tif +0 -0
  32. data/doc/index.textile +14 -15
  33. data/doc/mailing_lists.textile +0 -0
  34. data/doc/more_stuff.textile +54 -1
  35. data/doc/releasing.textile +17 -16
  36. data/doc/settings_profiles.textile +13 -13
  37. data/lib/buildr.rb +1 -0
  38. data/lib/buildr/core.rb +1 -0
  39. data/lib/buildr/core/application.rb +8 -3
  40. data/lib/buildr/core/checks.rb +0 -0
  41. data/lib/buildr/core/doc.rb +15 -4
  42. data/lib/buildr/core/environment.rb +0 -0
  43. data/lib/buildr/core/generate.rb +0 -0
  44. data/lib/buildr/core/help.rb +0 -0
  45. data/lib/buildr/core/progressbar.rb +0 -0
  46. data/lib/buildr/core/run.rb +43 -0
  47. data/lib/buildr/core/util.rb +21 -3
  48. data/lib/buildr/ide.rb +0 -0
  49. data/lib/buildr/ide/idea.ipr.template +0 -0
  50. data/lib/buildr/ide/idea.rb +0 -0
  51. data/lib/buildr/ide/idea7x.ipr.template +0 -0
  52. data/lib/buildr/java/doc.rb +16 -0
  53. data/lib/buildr/java/packaging.rb +9 -4
  54. data/lib/buildr/packaging.rb +0 -0
  55. data/lib/buildr/packaging/archive.rb +4 -4
  56. data/lib/buildr/packaging/artifact.rb +16 -15
  57. data/lib/buildr/packaging/artifact_search.rb +0 -0
  58. data/lib/buildr/packaging/gems.rb +0 -0
  59. data/lib/buildr/packaging/package.rb +1 -1
  60. data/lib/buildr/packaging/version_requirement.rb +0 -0
  61. data/lib/buildr/packaging/ziptask.rb +6 -4
  62. data/lib/buildr/resources/buildr.icns +0 -0
  63. data/lib/buildr/run.rb +202 -0
  64. data/lib/buildr/scala/doc.rb +18 -0
  65. data/lib/buildr/scala/tests.rb +3 -0
  66. data/lib/buildr/shell.rb +1 -1
  67. data/lib/buildr/version.rb +1 -1
  68. data/rakelib/doc.rake +23 -5
  69. data/rakelib/release.rake +0 -0
  70. data/rakelib/setup.rake +2 -2
  71. data/rakelib/stage.rake +3 -3
  72. data/spec/addon/drb_spec.rb +0 -0
  73. data/spec/core/application_spec.rb +65 -27
  74. data/spec/core/doc_spec.rb +195 -0
  75. data/spec/core/run_spec.rb +92 -0
  76. data/spec/java/compiler_spec.rb +0 -194
  77. data/spec/java/doc_spec.rb +56 -0
  78. data/spec/java/packaging_spec.rb +30 -14
  79. data/spec/java/run_spec.rb +78 -0
  80. data/spec/packaging/archive_spec.rb +20 -5
  81. data/spec/packaging/artifact_spec.rb +23 -14
  82. data/spec/packaging/packaging_helper.rb +0 -0
  83. data/spec/scala/doc_spec.rb +68 -0
  84. metadata +146 -139
File without changes
@@ -74,7 +74,6 @@ module Buildr
74
74
  # Returns the documentation tool options.
75
75
  attr_reader :options
76
76
 
77
-
78
77
  attr_reader :project # :nodoc:
79
78
 
80
79
  def initialize(*args) #:nodoc:
@@ -158,6 +157,19 @@ module Buildr
158
157
  @engine ||= guess_engine
159
158
  end
160
159
 
160
+ # :call-seq:
161
+ # engine?(clazz) => boolean
162
+ #
163
+ # Check if the underlying engine is an instance of the given class
164
+ def engine?(clazz)
165
+ begin
166
+ @engine ||= guess_engine if project.compile.language
167
+ rescue
168
+ return false
169
+ end
170
+ @engine.is_a?(clazz) if @engine
171
+ end
172
+
161
173
  # :call-seq:
162
174
  # from(*sources) => self
163
175
  #
@@ -221,15 +233,14 @@ module Buildr
221
233
  Project.local_task :doc
222
234
  end
223
235
 
224
- before_define do |project|
236
+ before_define(:doc) do |project|
225
237
  DocTask.define_task('doc').tap do |doc|
226
238
  doc.send(:associate_with, project)
227
239
  doc.into project.path_to(:target, :doc)
228
- doc.using :windowtitle=>project.comment || project.name
229
240
  end
230
241
  end
231
242
 
232
- after_define do |project|
243
+ after_define(:doc) do |project|
233
244
  project.doc.from project
234
245
  end
235
246
 
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,43 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+ require 'buildr/run'
17
+ require 'buildr/java/commands'
18
+ require 'buildr/core/util'
19
+
20
+ module Buildr
21
+ module Run
22
+
23
+ class JavaRunner < Base
24
+ include Shell::JavaRebel
25
+
26
+ specify :name => :java, :languages => [:java, :scala, :groovy, :clojure]
27
+
28
+ def run(task)
29
+ fail "Missing :main option" unless task.options[:main]
30
+ cp = project.compile.dependencies + [project.path_to(:target, :classes)] + task.classpath
31
+ Java::Commands.java(task.options[:main], {
32
+ :properties => rebel_props(project).merge(task.options[:properties] || {}),
33
+ :classpath => cp,
34
+ :java_args => rebel_args + (task.options[:java_args] || [])
35
+ })
36
+ end
37
+ end # JavaRunnner
38
+
39
+ end
40
+ end
41
+
42
+ Buildr::Run.runners << Buildr::Run::JavaRunner
43
+
@@ -54,7 +54,7 @@ module Buildr
54
54
  def ruby(*args)
55
55
  options = Hash === args.last ? args.pop : {}
56
56
  cmd = []
57
- ruby_bin = File.normalize_path(Config::CONFIG['ruby_install_name'], Config::CONFIG['bindir'])
57
+ ruby_bin = normalize_path(Config::CONFIG['ruby_install_name'], Config::CONFIG['bindir'])
58
58
  if options.delete(:sudo) && !(win_os? || Process.uid == File.stat(ruby_bin).uid)
59
59
  cmd << 'sudo' << '-u' << "##{File.stat(ruby_bin).uid}"
60
60
  end
@@ -142,8 +142,20 @@ module Buildr
142
142
  # is not running interactively (on a tty)
143
143
  def install(*dependencies)
144
144
  raise ArgumentError, "Expected at least one argument" if dependencies.empty?
145
- remote = dependencies.map{ |dep| Gem.source_index.search(dep).last || Gem::SpecFetcher.fetcher.fetch( dep, true ).map{ |spec, source| spec }.last }
146
- not_found_deps, to_install = remote.partition { |gem| gem.is_a?(Gem::Dependency) || gem.nil? }
145
+ not_found_deps = []
146
+ to_install = []
147
+ remote = dependencies.each do |dep|
148
+ if spec = Gem.source_index.search(dep).last
149
+ # Found in local repo
150
+ to_install << spec
151
+ elsif (spec = Gem::SpecFetcher.fetcher.fetch(dep, true).map { |spec, source| spec }.last)
152
+ # Found in remote repo
153
+ to_install << spec
154
+ else
155
+ # Not found anywhere
156
+ not_found_deps << "#{dep.name} #{dep.requirement}"
157
+ end
158
+ end
147
159
  fail Gem::LoadError, "Build requires the gems #{not_found_deps.join(', ')}, which cannot be found in local or remote repository." unless not_found_deps.empty?
148
160
  uses = "This build requires the gems #{to_install.map(&:full_name).join(', ')}:"
149
161
  fail Gem::LoadError, "#{uses} to install, run Buildr interactively." unless $stdout.isatty
@@ -330,6 +342,12 @@ end
330
342
  if Buildr::Util.java_platform?
331
343
  require 'ffi'
332
344
 
345
+ # Workaround for BUILDR-535: when requiring 'ffi', JRuby defines an :error
346
+ # method with arity 0.
347
+ class Module
348
+ remove_method :error if method_defined?(:error)
349
+ end
350
+
333
351
  # Fix for BUILDR-292.
334
352
  # JRuby fails to rename a file on different devices
335
353
  # this monkey-patch wont be needed when JRUBY-3381 gets resolved.
File without changes
File without changes
File without changes
File without changes
@@ -18,6 +18,18 @@ require 'buildr/core/doc'
18
18
  module Buildr
19
19
  module Doc
20
20
 
21
+ module JavadocDefaults
22
+ include Extension
23
+
24
+ # Default javadoc -windowtitle to project's comment or name
25
+ after_define(:javadoc => :doc) do |project|
26
+ if project.doc.engine? Javadoc
27
+ options = project.doc.options
28
+ options[:windowtitle] = (project.comment || project.name) unless options[:windowtitle]
29
+ end
30
+ end
31
+ end
32
+
21
33
  # A convenient task for creating Javadocs from the project's compile task. Minimizes all
22
34
  # the hard work to calling #from and #using.
23
35
  #
@@ -65,6 +77,10 @@ module Buildr
65
77
  end
66
78
  end
67
79
  end
80
+
81
+ class Project
82
+ include JavadocDefaults
83
+ end
68
84
  end
69
85
 
70
86
  Buildr::Doc.engines << Buildr::Doc::Javadoc
@@ -56,9 +56,14 @@ module Buildr
56
56
  #
57
57
  # Parse the MANIFEST.MF entry of a ZIP (or JAR) file and return a new Manifest.
58
58
  def from_zip(file)
59
- Zip::ZipFile.open(file.to_s) do |zip|
60
- Manifest.parse zip.read('META-INF/MANIFEST.MF') rescue Manifest.new
59
+ Zip::ZipInputStream::open(file.to_s) do |zip|
60
+ while (entry = zip.get_next_entry)
61
+ if entry.name == 'META-INF/MANIFEST.MF'
62
+ return Manifest.parse zip.read
63
+ end
64
+ end
61
65
  end
66
+ Manifest.new
62
67
  end
63
68
 
64
69
  # :call-seq:
@@ -257,7 +262,7 @@ module Buildr
257
262
  @classes = []
258
263
  @libs = []
259
264
  enhance do |war|
260
- @libs.each {|lib| lib.invoke}
265
+ @libs.each {|lib| lib.invoke if lib.respond_to?(:invoke) }
261
266
  @classes.to_a.flatten.each { |classes| include classes, :as => 'WEB-INF/classes' }
262
267
  path('WEB-INF/lib').include Buildr.artifacts(@libs) unless @libs.nil? || @libs.empty?
263
268
  end
@@ -625,7 +630,7 @@ module Buildr
625
630
  selected = options[:only] ? projects(options[:only]) :
626
631
  options[:except] ? ([self] + projects - projects(options[:except])) :
627
632
  [self] + projects
628
- selected.reject { |project| project.compile.sources.empty? }.
633
+ selected.reject { |project| project.compile.sources.empty? && project.resources.target.nil? }.
629
634
  each { |project| project.package(:sources) }
630
635
  end
631
636
  end
File without changes
@@ -202,7 +202,7 @@ module Buildr
202
202
  end
203
203
 
204
204
  def include_as(source, as)
205
-
205
+
206
206
  @sources << proc { source }
207
207
  @actions << proc do |file_map|
208
208
  file = source.to_s
@@ -212,19 +212,19 @@ module Buildr
212
212
  path = rel_path.split('/')[1..-1]
213
213
  path.unshift as unless as == '.'
214
214
  dest = "#{@path}#{path.join('/')}"
215
- unless excluded?(dest)
215
+ unless excluded?(dest)
216
216
  trace "Adding #{dest}"
217
217
  file_map[dest] = file
218
218
  end
219
219
  end
220
220
  unless as == "."
221
221
  trace "Adding #{@path}#{as}/"
222
- file_map["#{@path}#{as}/"] = file #as is a folder, so the trailing / is required.
222
+ file_map["#{@path}#{as}/"] = nil # :as is a folder, so the trailing / is required.
223
223
  end
224
224
  else
225
225
  file_map["#{@path}#{as}"] = file
226
226
  end
227
-
227
+
228
228
  end
229
229
  end
230
230
  end
@@ -488,23 +488,23 @@ module Buildr
488
488
  end
489
489
 
490
490
  protected
491
-
491
+
492
492
  # :call-seq:
493
493
  # needed?
494
494
  #
495
495
  # Validates whether artifact is required to be downloaded from repository
496
496
  def needed?
497
- return true if snapshot? && File.exist?(name) && old?
498
- super
497
+ return true if snapshot? && File.exist?(name) && (update_snapshot? || old?)
498
+ super
499
499
  end
500
-
500
+
501
501
  private
502
-
502
+
503
503
  # :call-seq:
504
504
  # download_artifact
505
505
  #
506
- # Downloads artifact from given repository,
507
- # supports downloading snapshot artifact with relocation on succeed to local repository
506
+ # Downloads artifact from given repository,
507
+ # supports downloading snapshot artifact with relocation on succeed to local repository
508
508
  def download_artifact(path)
509
509
  download_file = "#{name}.#{Time.new.to_i}"
510
510
  begin
@@ -517,7 +517,7 @@ module Buildr
517
517
  File.delete(download_file) if File.exist?(download_file)
518
518
  end
519
519
  end
520
-
520
+
521
521
  # :call-seq:
522
522
  # :download_needed?
523
523
  #
@@ -529,22 +529,22 @@ module Buildr
529
529
  return false if offline? && File.exist?(name)
530
530
  return true if update_snapshot? || old?
531
531
  end
532
-
532
+
533
533
  return false
534
534
  end
535
-
535
+
536
536
  def update_snapshot?
537
537
  Buildr.application.options.update_snapshots
538
538
  end
539
-
539
+
540
540
  def offline?
541
541
  Buildr.application.options.work_offline
542
542
  end
543
-
543
+
544
544
  # :call-seq:
545
545
  # old?
546
546
  #
547
- # Checks whether existing artifact is older than period from build settings or one day
547
+ # Checks whether existing artifact is older than period from build settings or one day
548
548
  def old?
549
549
  settings = Buildr.application.settings
550
550
  time_to_be_old = settings.user[:expire_time] || settings.build[:expire_time] || 60 * 60 * 24
@@ -706,7 +706,8 @@ module Buildr
706
706
  # repositories.release_to[:password] = 'secret'
707
707
  def release_to
708
708
  unless @release_to
709
- value = Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['release_to']
709
+ value = (Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['release_to']) \
710
+ || (Buildr.settings.build['repositories'] && Buildr.settings.build['repositories']['release_to'])
710
711
  @release_to = Hash === value ? value.inject({}) { |hash, (key, value)| hash.update(key.to_sym=>value) } : { :url=>Array(value).first }
711
712
  end
712
713
  @release_to
@@ -757,7 +758,7 @@ module Buildr
757
758
  Rake::Task['rake:artifacts'].enhance [task]
758
759
  Artifact.register(task)
759
760
  unless spec[:type] == :pom
760
- Rake::Task['artifacts:sources'].enhance [task.sources_artifact]
761
+ Rake::Task['artifacts:sources'].enhance [task.sources_artifact]
761
762
  Rake::Task['artifacts:javadoc'].enhance [task.javadoc_artifact]
762
763
  end
763
764
  end
File without changes
File without changes
@@ -237,7 +237,7 @@ module Buildr
237
237
 
238
238
  def package_as_sources(file_name) #:nodoc:
239
239
  ZipTask.define_task(file_name).tap do |zip|
240
- zip.include :from=>compile.sources
240
+ zip.include :from=>[compile.sources, resources.target].compact
241
241
  end
242
242
  end
243
243
 
@@ -59,14 +59,16 @@ module Buildr
59
59
  Zip::ZipOutputStream.open name do |zip|
60
60
  seen = {}
61
61
  mkpath = lambda do |dir|
62
- unless dir == '.' || seen[dir]
63
- mkpath.call File.dirname(dir)
64
- zip.put_next_entry(dir + '/', compression_level)
65
- seen[dir] = true
62
+ dirname = (dir[-1..-1] =~ /\/$/) ? dir : dir + '/'
63
+ unless dir == '.' || seen[dirname]
64
+ mkpath.call File.dirname(dirname)
65
+ zip.put_next_entry(dirname, compression_level)
66
+ seen[dirname] = true
66
67
  end
67
68
  end
68
69
 
69
70
  file_map.each do |path, content|
71
+ warn "Warning: Path in zipfile #{name} contains backslash: #{path}" if path =~ /\\/
70
72
  mkpath.call File.dirname(path)
71
73
  if content.respond_to?(:call)
72
74
  zip.put_next_entry(path, compression_level)
File without changes
@@ -0,0 +1,202 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+
17
+ module Buildr
18
+ module Run
19
+ include Extension
20
+
21
+ class << self
22
+ def runners
23
+ @runners ||= []
24
+ end
25
+
26
+ def select_by_lang(lang)
27
+ fail 'Unable to define run task for nil language' if lang.nil?
28
+ runners.detect { |e| e.languages.nil? ? false : e.languages.include?(lang.to_sym) }
29
+ end
30
+
31
+ alias_method :select, :select_by_lang
32
+
33
+ def select_by_name(name)
34
+ fail 'Unable to define run task for nil' if name.nil?
35
+ runners.detect { |e| e.to_sym == name.to_sym }
36
+ end
37
+
38
+ end
39
+
40
+ # Base class for any run provider. Defines most
41
+ # common functionality (things like @lang@, @build?@ and friends).
42
+ class Base
43
+ attr_reader :project
44
+
45
+ class << self
46
+ attr_accessor :name, :languages
47
+
48
+ def specify(options)
49
+ @name ||= options[:name]
50
+ @languages ||= options[:languages]
51
+ end
52
+
53
+ def to_sym
54
+ @name ||= name.split('::').last.downcase.to_sym
55
+ end
56
+ end
57
+
58
+ def initialize(project)
59
+ @project = project
60
+ end
61
+
62
+ def build?
63
+ true
64
+ end
65
+
66
+ def launch
67
+ fail 'Not implemented'
68
+ end
69
+ end
70
+
71
+ class RunTask < Rake::Task
72
+ # Classpath dependencies.
73
+ attr_accessor :classpath
74
+
75
+ # Returns the run options.
76
+ attr_reader :options
77
+
78
+ # Returns file dependencies
79
+ attr_reader :files
80
+
81
+ attr_reader :project # :nodoc:
82
+
83
+ def initialize(*args) # :nodoc:
84
+ super
85
+ @options = {}
86
+ @classpath = []
87
+ @files = FileList[]
88
+ end
89
+
90
+ # :call-seq:
91
+ # with(*artifacts) => self
92
+ #
93
+ # Adds files and artifacts as classpath dependencies, and returns self.
94
+ def with(*specs)
95
+ @classpath |= Buildr.artifacts(specs.flatten).uniq
96
+ self
97
+ end
98
+
99
+ # :call-seq:
100
+ # using(options) => self
101
+ #
102
+ # Sets the run options from a hash and returns self.
103
+ #
104
+ # For example:
105
+ # run.using :main=>'org.example.Main'
106
+ def using(*args)
107
+ args.pop.each { |key, value| @options[key.to_sym] = value } if Hash === args.last
108
+
109
+ until args.empty?
110
+ new_runner = Run.select_by_name(args.pop)
111
+ @runner = new_runner.new(project) unless new_runner.nil?
112
+ end
113
+
114
+ self
115
+ end
116
+
117
+ # :call-seq:
118
+ # requires(*files) => self
119
+ #
120
+ # Adds additional files and directories as dependencies to the task and returns self.
121
+ # When specifying a directory, includes all files in that directory.
122
+ def requires(*files)
123
+ @files.include *files.flatten.compact
124
+ self
125
+ end
126
+
127
+ def runner
128
+ @runner ||= guess_runner
129
+ end
130
+
131
+ # :call-seq:
132
+ # runner?(clazz) => boolean
133
+ #
134
+ # Check if the underlying runner is an instance of the given class.
135
+ # If no class is supplied, simply check if runner is defined.
136
+ def runner?(clazz = nil)
137
+ begin
138
+ @runner ||= guess_runner if project.compile.language
139
+ rescue
140
+ return false
141
+ end
142
+ return !@runner.nil? unless clazz
143
+ @runner.is_a?(clazz) if @runner
144
+ end
145
+
146
+ def run
147
+ runner.run(self) if runner?
148
+ end
149
+
150
+ def prerequisites #:nodoc:
151
+ super + @files + classpath
152
+ end
153
+
154
+ private
155
+
156
+ def guess_runner
157
+ runner = Run.select project.compile.language
158
+ fail 'Unable to guess runner for project.' unless runner
159
+ runner.new project
160
+ end
161
+
162
+ def associate_with(project)
163
+ @project ||= project
164
+ end
165
+ end
166
+
167
+ first_time do
168
+ Project.local_task 'run'
169
+ end
170
+
171
+ before_define(:run => :test) do |project|
172
+ RunTask.define_task('run').tap do |run|
173
+ run.send(:associate_with, project)
174
+ run.enhance([project.compile, project.test]) do |t|
175
+ # double-enhance to execute the runner last
176
+ run.enhance { |t| t.run }
177
+ end
178
+ end
179
+ end
180
+
181
+ after_define(:run => :test) do |project|
182
+ project.run.with project.test.compile.dependencies
183
+ project.run.with project.test.compile.target if project.test.compile.target
184
+ end
185
+
186
+ # :call-seq:
187
+ # run(&block) => RunTask
188
+ #
189
+ # This method returns the project's run task. It also accepts a block to be executed
190
+ # when the run task is invoked.
191
+ def run(&block)
192
+ task('run').tap do |t|
193
+ t.enhance &block if block
194
+ end
195
+ end
196
+
197
+ end
198
+
199
+ class Project
200
+ include Run
201
+ end
202
+ end