finnlabs-warbler 0.9.14
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +108 -0
- data/LICENSES.txt +37 -0
- data/Manifest.txt +35 -0
- data/README.txt +170 -0
- data/Rakefile +61 -0
- data/bin/warble +68 -0
- data/generators/warble/templates/warble.rb +89 -0
- data/generators/warble/warble_generator.rb +19 -0
- data/lib/jruby-complete-1.3.1.jar +0 -0
- data/lib/jruby-rack-0.9.4.jar +0 -0
- data/lib/warbler.rb +16 -0
- data/lib/warbler/config.rb +240 -0
- data/lib/warbler/gems.rb +36 -0
- data/lib/warbler/task.rb +347 -0
- data/lib/warbler/version.rb +9 -0
- data/spec/sample/app/controllers/application.rb +15 -0
- data/spec/sample/app/helpers/application_helper.rb +3 -0
- data/spec/sample/config/boot.rb +109 -0
- data/spec/sample/config/environment.rb +67 -0
- data/spec/sample/config/environments/development.rb +17 -0
- data/spec/sample/config/environments/production.rb +22 -0
- data/spec/sample/config/environments/test.rb +22 -0
- data/spec/sample/config/initializers/inflections.rb +10 -0
- data/spec/sample/config/initializers/mime_types.rb +5 -0
- data/spec/sample/config/initializers/new_rails_defaults.rb +15 -0
- data/spec/sample/config/routes.rb +41 -0
- data/spec/spec_helper.rb +43 -0
- data/spec/warbler/config_spec.rb +110 -0
- data/spec/warbler/gems_spec.rb +39 -0
- data/spec/warbler/task_spec.rb +486 -0
- data/tasks/warbler.rake +18 -0
- data/web.xml.erb +32 -0
- metadata +102 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
# Disable automatic framework detection by uncommenting/setting to false
|
2
|
+
# Warbler.framework_detection = false
|
3
|
+
|
4
|
+
# Warbler web application assembly configuration file
|
5
|
+
Warbler::Config.new do |config|
|
6
|
+
# Temporary directory where the application is staged
|
7
|
+
# config.staging_dir = "tmp/war"
|
8
|
+
|
9
|
+
# Application directories to be included in the webapp.
|
10
|
+
config.dirs = %w(app config lib log vendor tmp)
|
11
|
+
|
12
|
+
# Additional files/directories to include, above those in config.dirs
|
13
|
+
# config.includes = FileList["db"]
|
14
|
+
|
15
|
+
# Additional files/directories to exclude
|
16
|
+
# config.excludes = FileList["lib/tasks/*"]
|
17
|
+
|
18
|
+
# Additional Java .jar files to include. Note that if .jar files are placed
|
19
|
+
# in lib (and not otherwise excluded) then they need not be mentioned here.
|
20
|
+
# JRuby and JRuby-Rack are pre-loaded in this list. Be sure to include your
|
21
|
+
# own versions if you directly set the value
|
22
|
+
# config.java_libs += FileList["lib/java/*.jar"]
|
23
|
+
|
24
|
+
# Loose Java classes and miscellaneous files to be placed in WEB-INF/classes.
|
25
|
+
# config.java_classes = FileList["target/classes/**.*"]
|
26
|
+
|
27
|
+
# One or more pathmaps defining how the java classes should be copied into
|
28
|
+
# WEB-INF/classes. The example pathmap below accompanies the java_classes
|
29
|
+
# configuration above. See http://rake.rubyforge.org/classes/String.html#M000017
|
30
|
+
# for details of how to specify a pathmap.
|
31
|
+
# config.pathmaps.java_classes << "%{target/classes/,}p"
|
32
|
+
|
33
|
+
# Gems to be included. You need to tell Warbler which gems your application needs
|
34
|
+
# so that they can be packaged in the war file.
|
35
|
+
# The Rails gems are included by default unless the vendor/rails directory is present.
|
36
|
+
# config.gems += ["activerecord-jdbcmysql-adapter", "jruby-openssl"]
|
37
|
+
# config.gems << "tzinfo"
|
38
|
+
|
39
|
+
# Uncomment this if you don't want to package rails gem.
|
40
|
+
# config.gems -= ["rails"]
|
41
|
+
|
42
|
+
# The most recent versions of gems are used.
|
43
|
+
# You can specify versions of gems by using a hash assignment:
|
44
|
+
# config.gems["rails"] = "2.0.2"
|
45
|
+
|
46
|
+
# You can also use regexps or Gem::Dependency objects for flexibility or
|
47
|
+
# fine-grained control.
|
48
|
+
# config.gems << /^merb-/
|
49
|
+
# config.gems << Gem::Dependency.new("merb-core", "= 0.9.3")
|
50
|
+
|
51
|
+
# Include gem dependencies not mentioned specifically
|
52
|
+
config.gem_dependencies = true
|
53
|
+
|
54
|
+
# Files to be included in the root of the webapp. Note that files in public
|
55
|
+
# will have the leading 'public/' part of the path stripped during staging.
|
56
|
+
# config.public_html = FileList["public/**/*", "doc/**/*"]
|
57
|
+
|
58
|
+
# Pathmaps for controlling how public HTML files are copied into the .war
|
59
|
+
# config.pathmaps.public_html = ["%{public/,}p"]
|
60
|
+
|
61
|
+
# Name of the war file (without the .war) -- defaults to the basename
|
62
|
+
# of RAILS_ROOT
|
63
|
+
# config.war_name = "mywar"
|
64
|
+
|
65
|
+
# Name of the MANIFEST.MF template for the war file. Defaults to the
|
66
|
+
# MANIFEST.MF normally generated by `jar cf`.
|
67
|
+
# config.manifest_file = "config/MANIFEST.MF"
|
68
|
+
|
69
|
+
# Value of RAILS_ENV for the webapp -- default as shown below
|
70
|
+
# config.webxml.rails.env = ENV['RAILS_ENV'] || 'production'
|
71
|
+
|
72
|
+
# Application booter to use, one of :rack, :rails, or :merb. (Default :rails)
|
73
|
+
# config.webxml.booter = :rails
|
74
|
+
|
75
|
+
# When using the :rack booter, "Rackup" script to use.
|
76
|
+
# The script is evaluated in a Rack::Builder to load the application.
|
77
|
+
# Examples:
|
78
|
+
# config.webxml.rackup = %{require './lib/demo'; run Rack::Adapter::Camping.new(Demo)}
|
79
|
+
# config.webxml.rackup = require 'cgi' && CGI::escapeHTML(File.read("config.ru"))
|
80
|
+
|
81
|
+
# Control the pool of Rails runtimes. Leaving unspecified means
|
82
|
+
# the pool will grow as needed to service requests. It is recommended
|
83
|
+
# that you fix these values when running a production server!
|
84
|
+
# config.webxml.jruby.min.runtimes = 2
|
85
|
+
# config.webxml.jruby.max.runtimes = 4
|
86
|
+
|
87
|
+
# JNDI data source name
|
88
|
+
# config.webxml.jndi = 'jdbc/rails'
|
89
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#--
|
2
|
+
# (c) Copyright 2007-2008 Sun Microsystems, Inc.
|
3
|
+
# See the file LICENSES.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
class WarbleGenerator < Rails::Generator::Base
|
8
|
+
def manifest
|
9
|
+
record do |m|
|
10
|
+
m.directory 'config'
|
11
|
+
m.template 'warble.rb', File.join('config', 'warble.rb')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
def banner
|
17
|
+
"Usage: #{$0} warble"
|
18
|
+
end
|
19
|
+
end
|
Binary file
|
Binary file
|
data/lib/warbler.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#--
|
2
|
+
# (c) Copyright 2007-2008 Sun Microsystems, Inc.
|
3
|
+
# See the file LICENSES.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
# Warbler is a lightweight, flexible, Rake-based system for packaging your Rails apps
|
8
|
+
# into .war files.
|
9
|
+
module Warbler
|
10
|
+
WARBLER_HOME = File.expand_path(File.dirname(__FILE__) + '/..') unless defined?(WARBLER_HOME)
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'warbler/gems'
|
14
|
+
require 'warbler/config'
|
15
|
+
require 'warbler/task'
|
16
|
+
require 'warbler/version'
|
@@ -0,0 +1,240 @@
|
|
1
|
+
#--
|
2
|
+
# (c) Copyright 2007-2008 Sun Microsystems, Inc.
|
3
|
+
# See the file LICENSES.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'ostruct'
|
8
|
+
|
9
|
+
module Warbler
|
10
|
+
# Warbler assembly configuration.
|
11
|
+
class Config
|
12
|
+
TOP_DIRS = %w(app config lib log vendor)
|
13
|
+
FILE = "config/warble.rb"
|
14
|
+
BUILD_GEMS = %w(warbler rake rcov)
|
15
|
+
|
16
|
+
# Directory where files will be staged, defaults to tmp/war
|
17
|
+
attr_accessor :staging_dir
|
18
|
+
|
19
|
+
# Directory where the war file will be written. Can be used to direct
|
20
|
+
# Warbler to place your war file directly in your application server's
|
21
|
+
# autodeploy directory. Defaults to the root of the Rails directory.
|
22
|
+
attr_accessor :autodeploy_dir
|
23
|
+
|
24
|
+
# Top-level directories to be copied into WEB-INF. Defaults to
|
25
|
+
# names in TOP_DIRS
|
26
|
+
attr_accessor :dirs
|
27
|
+
|
28
|
+
# Additional files beyond the top-level directories to include in the
|
29
|
+
# WEB-INF directory
|
30
|
+
attr_accessor :includes
|
31
|
+
|
32
|
+
# Files to exclude from the WEB-INF directory
|
33
|
+
attr_accessor :excludes
|
34
|
+
|
35
|
+
# Java classes and other files to copy to WEB-INF/classes
|
36
|
+
attr_accessor :java_classes
|
37
|
+
|
38
|
+
# Java libraries to copy to WEB-INF/lib
|
39
|
+
attr_accessor :java_libs
|
40
|
+
|
41
|
+
# Rubygems to install into the webapp at WEB-INF/gems
|
42
|
+
attr_accessor :gems
|
43
|
+
|
44
|
+
# Whether to include dependent gems (default true)
|
45
|
+
attr_accessor :gem_dependencies
|
46
|
+
|
47
|
+
# Whether to exclude **/*.log files (default is true)
|
48
|
+
attr_accessor :exclude_logs
|
49
|
+
|
50
|
+
# Public HTML directory file list, to be copied into the root of the war
|
51
|
+
attr_accessor :public_html
|
52
|
+
|
53
|
+
# Container of pathmaps used for specifying source-to-destination transformations
|
54
|
+
# under various situations (<tt>public_html</tt> and <tt>java_classes</tt> are two
|
55
|
+
# entries in this structure).
|
56
|
+
attr_accessor :pathmaps
|
57
|
+
|
58
|
+
# Name of war file (without the .war), defaults to the directory name containing
|
59
|
+
# the Rails application
|
60
|
+
attr_accessor :war_name
|
61
|
+
|
62
|
+
# Name of the MANIFEST.MF template. Defaults to the MANIFEST.MF normally generated
|
63
|
+
# by jar -cf....
|
64
|
+
attr_accessor :manifest_file
|
65
|
+
|
66
|
+
# Extra configuration for web.xml. Controls how the dynamically-generated web.xml
|
67
|
+
# file is generated.
|
68
|
+
#
|
69
|
+
# * <tt>webxml.jndi</tt> -- the name of one or more JNDI data sources name to be
|
70
|
+
# available to the application. Places appropriate <resource-ref> entries
|
71
|
+
# in the file.
|
72
|
+
# * <tt>webxml.ignored</tt> -- array of key names that will be not used to
|
73
|
+
# generate a context param. Defaults to ['jndi', 'booter']
|
74
|
+
#
|
75
|
+
# Any other key/value pair placed in the open structure will be dumped as a
|
76
|
+
# context parameter in the web.xml file. Some of the recognized values are:
|
77
|
+
#
|
78
|
+
# * <tt>webxml.rails.env</tt> -- the Rails environment to use for the
|
79
|
+
# running application, usually either development or production (the
|
80
|
+
# default).
|
81
|
+
# * <tt>webxml.jruby.min.runtimes</tt> -- minimum number of pooled runtimes to
|
82
|
+
# keep around during idle time
|
83
|
+
# * <tt>webxml.jruby.max.runtimes</tt> -- maximum number of pooled Rails
|
84
|
+
# application runtimes
|
85
|
+
#
|
86
|
+
# Note that if you attempt to access webxml configuration keys in a conditional,
|
87
|
+
# you might not obtain the result you want. For example:
|
88
|
+
# <%= webxml.maybe.present.key || 'default' %>
|
89
|
+
# doesn't yield the right result. Instead, you need to generate the context parameters:
|
90
|
+
# <%= webxml.context_params['maybe.present.key'] || 'default' %>
|
91
|
+
attr_accessor :webxml
|
92
|
+
|
93
|
+
def initialize(warbler_home = WARBLER_HOME)
|
94
|
+
@staging_dir = File.join("tmp", "war")
|
95
|
+
@dirs = TOP_DIRS.select {|d| File.directory?(d)}
|
96
|
+
@includes = FileList[]
|
97
|
+
@excludes = FileList[]
|
98
|
+
@java_libs = FileList["#{warbler_home}/lib/*.jar"]
|
99
|
+
@java_classes = FileList[]
|
100
|
+
@gems = Warbler::Gems.new
|
101
|
+
@gem_dependencies = true
|
102
|
+
@exclude_logs = true
|
103
|
+
@public_html = FileList["public/**/*"]
|
104
|
+
@pathmaps = default_pathmaps
|
105
|
+
@webxml = default_webxml_config
|
106
|
+
@rails_root = File.expand_path(defined?(RAILS_ROOT) ? RAILS_ROOT : Dir.getwd)
|
107
|
+
@war_name = File.basename(@rails_root)
|
108
|
+
auto_detect_frameworks
|
109
|
+
yield self if block_given?
|
110
|
+
@excludes += warbler_vendor_excludes(warbler_home)
|
111
|
+
@excludes += FileList["**/*.log"] if @exclude_logs
|
112
|
+
@excludes << @staging_dir
|
113
|
+
end
|
114
|
+
|
115
|
+
def gems=(value)
|
116
|
+
@gems = Warbler::Gems.new(value)
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
def warbler_vendor_excludes(warbler_home)
|
121
|
+
warbler = File.expand_path(warbler_home)
|
122
|
+
if warbler =~ %r{^#{@rails_root}/(.*)}
|
123
|
+
FileList["#{$1}"]
|
124
|
+
else
|
125
|
+
[]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def default_pathmaps
|
130
|
+
p = OpenStruct.new
|
131
|
+
p.public_html = ["%{public/,}p"]
|
132
|
+
p.java_libs = ["WEB-INF/lib/%f"]
|
133
|
+
p.java_classes = ["WEB-INF/classes/%p"]
|
134
|
+
p.application = ["WEB-INF/%p"]
|
135
|
+
p.gemspecs = ["WEB-INF/gems/specifications/%f"]
|
136
|
+
p.gems = ["WEB-INF/gems/gems/%n"]
|
137
|
+
p
|
138
|
+
end
|
139
|
+
|
140
|
+
def default_webxml_config
|
141
|
+
c = WebxmlOpenStruct.new
|
142
|
+
c.rails.env = ENV['RAILS_ENV'] || 'production'
|
143
|
+
c.public.root = '/'
|
144
|
+
c.jndi = nil
|
145
|
+
c.ignored = %w(jndi booter)
|
146
|
+
c
|
147
|
+
end
|
148
|
+
|
149
|
+
def auto_detect_frameworks
|
150
|
+
!Warbler.framework_detection || auto_detect_rails || auto_detect_merb || auto_detect_rackup
|
151
|
+
end
|
152
|
+
|
153
|
+
def auto_detect_rails
|
154
|
+
return false unless task = Warbler.project_application.lookup("environment")
|
155
|
+
task.invoke rescue nil
|
156
|
+
return false unless defined?(::Rails)
|
157
|
+
@dirs << "tmp" if File.directory?("tmp")
|
158
|
+
@webxml.booter = :rails
|
159
|
+
unless (defined?(Rails.vendor_rails?) && Rails.vendor_rails?) || File.directory?("vendor/rails")
|
160
|
+
@gems["rails"] = Rails::VERSION::STRING
|
161
|
+
end
|
162
|
+
if defined?(Rails.configuration.gems)
|
163
|
+
Rails.configuration.gems.each {|g| @gems << Gem::Dependency.new(g.name, g.requirement) }
|
164
|
+
end
|
165
|
+
@webxml.jruby.max.runtimes = 1 if defined?(Rails.configuration.threadsafe!)
|
166
|
+
true
|
167
|
+
end
|
168
|
+
|
169
|
+
def auto_detect_merb
|
170
|
+
return false unless task = Warbler.project_application.lookup("merb_env")
|
171
|
+
task.invoke rescue nil
|
172
|
+
return false unless defined?(::Merb)
|
173
|
+
@webxml.booter = :merb
|
174
|
+
if defined?(Merb::BootLoader::Dependencies.dependencies)
|
175
|
+
Merb::BootLoader::Dependencies.dependencies.each {|g| @gems << g }
|
176
|
+
else
|
177
|
+
warn "unable to auto-detect Merb dependencies; upgrade to Merb 1.0 or greater"
|
178
|
+
end
|
179
|
+
true
|
180
|
+
end
|
181
|
+
|
182
|
+
def auto_detect_rackup
|
183
|
+
return false unless File.exist?("config.ru")
|
184
|
+
@webxml.booter = :rack
|
185
|
+
@webxml.rackup = File.read("config.ru")
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class WebxmlOpenStruct < OpenStruct
|
190
|
+
%w(java com org javax).each {|name| undef_method name if Object.methods.include?(name) }
|
191
|
+
|
192
|
+
def initialize(key = 'webxml')
|
193
|
+
@key = key
|
194
|
+
@table = Hash.new {|h,k| h[k] = WebxmlOpenStruct.new(k) }
|
195
|
+
end
|
196
|
+
|
197
|
+
def servlet_context_listener
|
198
|
+
case self.booter
|
199
|
+
when :rack
|
200
|
+
"org.jruby.rack.RackServletContextListener"
|
201
|
+
when :merb
|
202
|
+
"org.jruby.rack.merb.MerbServletContextListener"
|
203
|
+
else # :rails, default
|
204
|
+
"org.jruby.rack.rails.RailsServletContextListener"
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def [](key)
|
209
|
+
new_ostruct_member(key)
|
210
|
+
send(key)
|
211
|
+
end
|
212
|
+
|
213
|
+
def []=(key, value)
|
214
|
+
new_ostruct_member(key)
|
215
|
+
send("#{key}=", value)
|
216
|
+
end
|
217
|
+
|
218
|
+
def context_params
|
219
|
+
require 'cgi'
|
220
|
+
params = {}
|
221
|
+
@table.each do |k,v|
|
222
|
+
case v
|
223
|
+
when WebxmlOpenStruct
|
224
|
+
nested_params = v.context_params
|
225
|
+
nested_params.each do |nk,nv|
|
226
|
+
params["#{CGI::escapeHTML(k.to_s)}.#{nk}"] = nv
|
227
|
+
end
|
228
|
+
else
|
229
|
+
params[CGI::escapeHTML(k.to_s)] = CGI::escapeHTML(v.to_s)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
params.delete_if {|k,v| ['ignored', *ignored].include?(k.to_s) }
|
233
|
+
params
|
234
|
+
end
|
235
|
+
|
236
|
+
def to_s
|
237
|
+
"No value for '#@key' found"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
data/lib/warbler/gems.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
#--
|
2
|
+
# (c) Copyright 2007-2008 Sun Microsystems, Inc.
|
3
|
+
# See the file LICENSES.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
module Warbler
|
8
|
+
# A set of gems. This only exists to allow expected operations
|
9
|
+
# to be used to add gems, and for backwards compatibility.
|
10
|
+
# It would be easier to just use a hash.
|
11
|
+
class Gems < Hash
|
12
|
+
ANY_VERSION = nil
|
13
|
+
|
14
|
+
def initialize(gems = nil)
|
15
|
+
if gems.is_a?(Hash)
|
16
|
+
self.merge!(gems)
|
17
|
+
elsif gems.is_a?(Array)
|
18
|
+
gems.each {|gem| self << gem }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def <<(gem)
|
23
|
+
self[gem] ||= ANY_VERSION
|
24
|
+
end
|
25
|
+
|
26
|
+
def +(other)
|
27
|
+
other.each {|g| self[g] ||= ANY_VERSION }
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def -(other)
|
32
|
+
other.each {|g| self.delete(g)}
|
33
|
+
self
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/warbler/task.rb
ADDED
@@ -0,0 +1,347 @@
|
|
1
|
+
#--
|
2
|
+
# (c) Copyright 2007-2009 Sun Microsystems, Inc.
|
3
|
+
# See the file LICENSES.txt included with the distribution for
|
4
|
+
# software license details.
|
5
|
+
#++
|
6
|
+
|
7
|
+
require 'rake'
|
8
|
+
require 'rake/tasklib'
|
9
|
+
|
10
|
+
module Warbler
|
11
|
+
class << self
|
12
|
+
attr_writer :project_application
|
13
|
+
def project_application
|
14
|
+
@project_application || Rake.application
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :framework_detection
|
18
|
+
end
|
19
|
+
self.framework_detection = true
|
20
|
+
|
21
|
+
# Warbler Rake task. Allows defining multiple configurations inside the same
|
22
|
+
# Rakefile by using different task names.
|
23
|
+
class Task < Rake::TaskLib
|
24
|
+
COPY_PROC = proc {|t| cp t.prerequisites.last, t.name }
|
25
|
+
|
26
|
+
# Task name
|
27
|
+
attr_accessor :name
|
28
|
+
|
29
|
+
# Warbler::Config
|
30
|
+
attr_accessor :config
|
31
|
+
|
32
|
+
# Whether to print a line when a file or directory task is declared; helps
|
33
|
+
# to see what is getting included
|
34
|
+
attr_accessor :verbose
|
35
|
+
|
36
|
+
def initialize(name = :war, config = nil, tasks = :define_tasks)
|
37
|
+
@name = name
|
38
|
+
@config = config
|
39
|
+
if @config.nil? && File.exists?(Config::FILE)
|
40
|
+
@config = eval(File.open(Config::FILE) {|f| f.read})
|
41
|
+
end
|
42
|
+
@config ||= Config.new
|
43
|
+
unless @config.kind_of? Config
|
44
|
+
warn "War::Config not provided by override in initializer or #{Config::FILE}; using defaults"
|
45
|
+
@config = Config.new
|
46
|
+
end
|
47
|
+
yield self if block_given?
|
48
|
+
send tasks
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def define_tasks
|
53
|
+
define_main_task
|
54
|
+
define_clean_task
|
55
|
+
define_public_task
|
56
|
+
define_gems_task
|
57
|
+
define_webxml_task
|
58
|
+
define_app_task
|
59
|
+
define_jar_task
|
60
|
+
define_exploded_task
|
61
|
+
define_debug_task
|
62
|
+
end
|
63
|
+
|
64
|
+
def define_main_task
|
65
|
+
desc "Create #{@config.war_name}.war"
|
66
|
+
task @name => ["#{@name}:app", "#{@name}:public", "#{@name}:webxml", "#{@name}:jar"]
|
67
|
+
end
|
68
|
+
|
69
|
+
def define_clean_task
|
70
|
+
with_namespace_and_config do |name, config|
|
71
|
+
desc "Clean up the .war file and the staging area"
|
72
|
+
task "clean" do
|
73
|
+
rm_rf config.staging_dir
|
74
|
+
rm_f "#{config.war_name}.war"
|
75
|
+
end
|
76
|
+
task "clear" => "#{name}:clean"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def define_public_task
|
81
|
+
public_target_files = define_public_file_tasks
|
82
|
+
with_namespace_and_config do
|
83
|
+
desc "Copy all public HTML files to the root of the .war"
|
84
|
+
task "public" => public_target_files
|
85
|
+
task "debug:public" do
|
86
|
+
puts "", "public files:"
|
87
|
+
puts *public_target_files
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def define_gems_task
|
93
|
+
directory "#{config.staging_dir}/#{apply_pathmaps("sources-0.0.1.gem", :gems).pathmap("%d")}"
|
94
|
+
targets = define_copy_gems_task
|
95
|
+
with_namespace_and_config do
|
96
|
+
desc "Unpack all gems into WEB-INF/gems"
|
97
|
+
task "gems" => targets
|
98
|
+
task "debug:gems" do
|
99
|
+
puts "", "gems files:"
|
100
|
+
puts *targets
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def define_webxml_task
|
106
|
+
with_namespace_and_config do |name, config|
|
107
|
+
desc "Generate a web.xml file for the webapp"
|
108
|
+
task "webxml" do
|
109
|
+
mkdir_p "#{config.staging_dir}/WEB-INF"
|
110
|
+
if File.exist?("config/web.xml")
|
111
|
+
cp "config/web.xml", "#{config.staging_dir}/WEB-INF"
|
112
|
+
else
|
113
|
+
erb = if File.exist?("config/web.xml.erb")
|
114
|
+
"config/web.xml.erb"
|
115
|
+
else
|
116
|
+
"#{WARBLER_HOME}/web.xml.erb"
|
117
|
+
end
|
118
|
+
require 'erb'
|
119
|
+
erb = ERB.new(File.open(erb) {|f| f.read })
|
120
|
+
File.open("#{config.staging_dir}/WEB-INF/web.xml", "w") do |f|
|
121
|
+
f << erb.result(erb_binding(config.webxml))
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def define_java_libs_task
|
129
|
+
target_files = @config.java_libs.map do |lib|
|
130
|
+
define_file_task(lib,
|
131
|
+
"#{@config.staging_dir}/#{apply_pathmaps(lib, :java_libs)}")
|
132
|
+
end
|
133
|
+
with_namespace_and_config do |name, config|
|
134
|
+
desc "Copy all java libraries into the .war"
|
135
|
+
task "java_libs" => target_files
|
136
|
+
task "debug:java_libs" do
|
137
|
+
puts "", "java_libs files:"
|
138
|
+
puts *target_files
|
139
|
+
end
|
140
|
+
end
|
141
|
+
target_files
|
142
|
+
end
|
143
|
+
|
144
|
+
def define_java_classes_task
|
145
|
+
target_files = @config.java_classes.map do |f|
|
146
|
+
define_file_task(f,
|
147
|
+
"#{@config.staging_dir}/#{apply_pathmaps(f, :java_classes)}")
|
148
|
+
end
|
149
|
+
with_namespace_and_config do |name, config|
|
150
|
+
desc "Copy java classes into the .war"
|
151
|
+
task "java_classes" => target_files
|
152
|
+
task "debug:java_classes" do
|
153
|
+
puts "", "java_classes files:"
|
154
|
+
puts *target_files
|
155
|
+
end
|
156
|
+
end
|
157
|
+
target_files
|
158
|
+
end
|
159
|
+
|
160
|
+
def define_app_task
|
161
|
+
webinf_target_files = define_webinf_file_tasks
|
162
|
+
with_namespace_and_config do |name, config|
|
163
|
+
desc "Copy all application files into the .war"
|
164
|
+
task "app" => ["#{name}:gems", *webinf_target_files]
|
165
|
+
task "debug:app" do
|
166
|
+
puts "", "app files:"
|
167
|
+
puts *webinf_target_files
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def define_jar_task
|
173
|
+
with_namespace_and_config do |name, config|
|
174
|
+
desc "Run the jar command to create the .war"
|
175
|
+
task "jar" do
|
176
|
+
war_path = "#{config.war_name}.war"
|
177
|
+
war_path = File.join(config.autodeploy_dir, war_path) if config.autodeploy_dir
|
178
|
+
flags, manifest = config.manifest_file ? ["cfm", config.manifest_file] : ["cf", ""]
|
179
|
+
sh "jar #{flags} #{war_path} #{manifest} -C #{config.staging_dir} ."
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def define_exploded_task
|
185
|
+
with_namespace_and_config do |name,config|
|
186
|
+
libs = define_java_libs_task
|
187
|
+
desc "Create an exploded war in the app's public directory"
|
188
|
+
task "exploded" => ["webxml", "java_classes", "gems", *libs] do
|
189
|
+
cp "#{@config.staging_dir}/WEB-INF/web.xml", "."
|
190
|
+
cp File.join(WARBLER_HOME, "sun-web.xml"), "." unless File.exists?("sun-web.xml")
|
191
|
+
ln_sf "#{@config.staging_dir}/WEB-INF/gems", "."
|
192
|
+
if File.directory?("#{@config.staging_dir}/WEB-INF/classes")
|
193
|
+
ln_sf "#{@config.staging_dir}/WEB-INF/classes", "."
|
194
|
+
end
|
195
|
+
mkdir_p "lib"
|
196
|
+
libs.each {|l| ln_sf l, "lib/#{File.basename(l)}"}
|
197
|
+
ln_sf "..", "public/WEB-INF"
|
198
|
+
end
|
199
|
+
|
200
|
+
task "clean:exploded" do
|
201
|
+
(libs.map {|l| "lib/#{File.basename(l)}" } +
|
202
|
+
["gems", "public/WEB-INF", "classes"]).each do |l|
|
203
|
+
rm_f l if File.exist?(l) && File.symlink?(l)
|
204
|
+
end
|
205
|
+
rm_f "*web.xml"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def define_debug_task
|
211
|
+
with_namespace_and_config do |name, config|
|
212
|
+
task "debug" do
|
213
|
+
require 'yaml'
|
214
|
+
puts YAML::dump(config)
|
215
|
+
end
|
216
|
+
all_debug_tasks = %w(: app java_libs java_classes gems public includes excludes).map do |n|
|
217
|
+
n.sub(/^:?/, "#{name}:debug:").sub(/:$/, '')
|
218
|
+
end
|
219
|
+
task "debug:all" => all_debug_tasks
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def define_public_file_tasks
|
224
|
+
@config.public_html.map do |f|
|
225
|
+
define_file_task(f, "#{@config.staging_dir}/#{apply_pathmaps(f, :public_html)}")
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def define_webinf_file_tasks
|
230
|
+
target_files = @config.dirs.select do |d|
|
231
|
+
exists = File.directory?(d)
|
232
|
+
warn "warning: application directory `#{d}' does not exist or is not a directory; skipping" unless exists
|
233
|
+
exists
|
234
|
+
end.map do |d|
|
235
|
+
define_file_task(d, "#{@config.staging_dir}/#{apply_pathmaps(d, :application)}")
|
236
|
+
end
|
237
|
+
files = FileList[*(@config.dirs.map{|d| "#{d}/**/*"})]
|
238
|
+
files.include *(@config.includes.to_a)
|
239
|
+
files.exclude *(@config.excludes.to_a)
|
240
|
+
target_files += files.map do |f|
|
241
|
+
define_file_task(f,
|
242
|
+
"#{@config.staging_dir}/#{apply_pathmaps(f, :application)}")
|
243
|
+
end
|
244
|
+
target_files += define_java_libs_task
|
245
|
+
target_files += define_java_classes_task
|
246
|
+
task "#@name:debug:includes" do
|
247
|
+
puts "", "included files:"
|
248
|
+
puts *files.include
|
249
|
+
end
|
250
|
+
task "#@name:debug:excludes" do
|
251
|
+
puts "", "excluded files:"
|
252
|
+
puts *files.exclude
|
253
|
+
end
|
254
|
+
target_files
|
255
|
+
end
|
256
|
+
|
257
|
+
def define_file_task(source, target)
|
258
|
+
if File.directory?(source)
|
259
|
+
directory target
|
260
|
+
puts %{directory "#{target}"} if verbose
|
261
|
+
else
|
262
|
+
directory File.dirname(target)
|
263
|
+
file(target => [File.dirname(target), source], ©_PROC)
|
264
|
+
puts %{file "#{target}" => "#{source}"} if verbose
|
265
|
+
end
|
266
|
+
target
|
267
|
+
end
|
268
|
+
|
269
|
+
def with_namespace_and_config
|
270
|
+
name, config = @name, @config
|
271
|
+
namespace name do
|
272
|
+
yield name, config
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
def define_copy_gems_task
|
277
|
+
targets = []
|
278
|
+
@config.gems.each do |gem, version|
|
279
|
+
define_single_gem_tasks(gem, targets, version)
|
280
|
+
end
|
281
|
+
targets
|
282
|
+
end
|
283
|
+
|
284
|
+
def define_single_gem_tasks(gem_pattern, targets, version = nil)
|
285
|
+
gem = case gem_pattern
|
286
|
+
when Gem::Dependency
|
287
|
+
gem_pattern
|
288
|
+
else
|
289
|
+
Gem::Dependency.new(gem_pattern, Gem::Requirement.create(version))
|
290
|
+
end
|
291
|
+
|
292
|
+
# skip development dependencies
|
293
|
+
return if gem.respond_to?(:type) and gem.type != :runtime
|
294
|
+
|
295
|
+
matched = Gem.source_index.search(gem)
|
296
|
+
fail "gem '#{gem}' not installed" if matched.empty?
|
297
|
+
spec = matched.last
|
298
|
+
|
299
|
+
gem_name = "#{spec.name}-#{spec.version}"
|
300
|
+
unless spec.platform.nil? || spec.platform == Gem::Platform::RUBY
|
301
|
+
[spec.platform, spec.original_platform].each do |p|
|
302
|
+
name = "#{gem_name}-#{p}"
|
303
|
+
if File.exist?(File.join(Gem.dir, 'cache', "#{name}.gem"))
|
304
|
+
gem_name = name
|
305
|
+
break
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
gem_unpack_task_name = "gem:#{gem_name}"
|
311
|
+
return if Rake::Task.task_defined?(gem_unpack_task_name)
|
312
|
+
|
313
|
+
targets << define_file_task(spec.loaded_from,
|
314
|
+
"#{@config.staging_dir}/#{apply_pathmaps(spec.loaded_from, :gemspecs)}")
|
315
|
+
|
316
|
+
task targets.last do
|
317
|
+
Rake::Task[gem_unpack_task_name].invoke
|
318
|
+
end
|
319
|
+
|
320
|
+
src = File.join(Gem.dir, 'cache', "#{gem_name}.gem")
|
321
|
+
dest = "#{config.staging_dir}/#{apply_pathmaps(src, :gems)}"
|
322
|
+
|
323
|
+
task gem_unpack_task_name => [dest.pathmap("%d")] do |t|
|
324
|
+
require 'rubygems/installer'
|
325
|
+
Gem::Installer.new(src, :unpack => true).unpack(dest)
|
326
|
+
end
|
327
|
+
|
328
|
+
if @config.gem_dependencies
|
329
|
+
spec.dependencies.each do |dep|
|
330
|
+
define_single_gem_tasks(dep, targets)
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
def erb_binding(webxml)
|
336
|
+
binding
|
337
|
+
end
|
338
|
+
|
339
|
+
def apply_pathmaps(file, pathmaps)
|
340
|
+
pathmaps = @config.pathmaps.send(pathmaps)
|
341
|
+
pathmaps.each do |p|
|
342
|
+
file = file.pathmap(p)
|
343
|
+
end if pathmaps
|
344
|
+
file
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|