detroit 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.index +59 -0
- data/EXAMPLE.md +66 -64
- data/{HISTORY.rdoc → HISTORY.md} +32 -5
- data/{COPYING.rdoc → LICENSE.txt} +0 -0
- data/README.md +142 -0
- data/bin/detroit +1 -1
- data/lib/detroit.rb +112 -40
- data/lib/detroit.yml +44 -29
- data/lib/detroit/assembly.rb +49 -193
- data/lib/detroit/basic_tool.rb +200 -0
- data/lib/detroit/basic_utils.rb +66 -0
- data/lib/detroit/core_ext.rb +2 -136
- data/lib/detroit/{tool/core_ext → core_ext}/facets.rb +3 -0
- data/lib/detroit/{tool/core_ext → core_ext}/filetest.rb +0 -0
- data/lib/detroit/{tool/core_ext → core_ext}/shell_extensions.rb +0 -0
- data/lib/detroit/{tool/core_ext → core_ext}/to_actual_filename.rb +0 -0
- data/lib/detroit/{tool/core_ext → core_ext}/to_console.rb +1 -0
- data/lib/detroit/{tool/core_ext → core_ext}/to_list.rb +0 -0
- data/lib/detroit/{tool/core_ext → core_ext}/to_yamlfrag.rb +0 -0
- data/lib/detroit/{tool/core_ext → core_ext}/unfold_paragraphs.rb +0 -0
- data/lib/detroit/{tool/email_utils.rb → email_utils.rb} +3 -1
- data/lib/detroit/exec.rb +55 -0
- data/lib/detroit/project.rb +134 -0
- data/lib/detroit/ruby_utils.rb +29 -0
- data/lib/detroit/{tool/shell_utils.rb → shell_utils.rb} +10 -5
- data/lib/detroit/toolchain.rb +6 -0
- data/lib/detroit/toolchain/cli.rb +320 -0
- data/lib/detroit/toolchain/config.rb +223 -0
- data/lib/detroit/toolchain/runner.rb +678 -0
- data/lib/detroit/toolchain/script.rb +248 -0
- data/lib/detroit/toolchain/worker.rb +84 -0
- data/man/detroit.1 +116 -0
- data/man/detroit.1.html +171 -0
- data/man/detroit.1.ronn +99 -0
- metadata +90 -51
- data/.ruby +0 -44
- data/README.rdoc +0 -132
- data/lib/detroit/application.rb +0 -463
- data/lib/detroit/assembly_system.rb +0 -80
- data/lib/detroit/config.rb +0 -203
- data/lib/detroit/control.rb +0 -129
- data/lib/detroit/custom.rb +0 -102
- data/lib/detroit/dsl.rb +0 -55
- data/lib/detroit/service.rb +0 -78
- data/lib/detroit/standard_assembly.rb +0 -51
- data/lib/detroit/tool.rb +0 -295
- data/lib/detroit/tool/core_ext.rb +0 -3
- data/lib/detroit/tool/project_utils.rb +0 -41
@@ -0,0 +1,248 @@
|
|
1
|
+
module Detroit
|
2
|
+
|
3
|
+
module Toolchain
|
4
|
+
|
5
|
+
# Assembly::Script models an *Assembly file* with it's collection of
|
6
|
+
# tool configurations.
|
7
|
+
#
|
8
|
+
class Script
|
9
|
+
|
10
|
+
# Load Assembly file.
|
11
|
+
def self.load(input, project=nil)
|
12
|
+
new(:file=>input,:project=>project)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Project instance.
|
16
|
+
attr :project
|
17
|
+
|
18
|
+
# Hash table of tool configuration.
|
19
|
+
attr :tools
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
#
|
24
|
+
def initialize(options={}, &block)
|
25
|
+
@project = options[:project]
|
26
|
+
|
27
|
+
@tools = {}
|
28
|
+
|
29
|
+
if options[:file]
|
30
|
+
initialize_file(options[:file])
|
31
|
+
end
|
32
|
+
|
33
|
+
if block
|
34
|
+
instance_eval(&block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Inititalize from assembly file.
|
39
|
+
#
|
40
|
+
def initialize_file(file)
|
41
|
+
@file = (String === file ? File.new(file) : file)
|
42
|
+
|
43
|
+
case File.extname(@file.path)
|
44
|
+
when '.rb'
|
45
|
+
instance_eval(@file.read, @file.path)
|
46
|
+
when '.yml', '.yaml'
|
47
|
+
@tools = YAML.load(erb(@file.read))
|
48
|
+
else
|
49
|
+
text = @file.read
|
50
|
+
if /^---/ =~ text
|
51
|
+
@tools = YAML.load(erb(text))
|
52
|
+
else
|
53
|
+
instance_eval(text, @file.path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
public
|
59
|
+
|
60
|
+
# Ecapsulate a set of tools within a specific track.
|
61
|
+
#
|
62
|
+
def track(name, &block)
|
63
|
+
@_track = name
|
64
|
+
instance_eval(&block)
|
65
|
+
@_track = nil
|
66
|
+
end
|
67
|
+
|
68
|
+
# Configure a tool.
|
69
|
+
#
|
70
|
+
def tool(name, settings={}, &block)
|
71
|
+
settings[:track] = @_track if @_track
|
72
|
+
if block
|
73
|
+
block_context = BlockContext.new(&block)
|
74
|
+
settings.update(block_context.settings)
|
75
|
+
end
|
76
|
+
@tools[name.to_s] = settings.rekey(&:to_s)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Define a custom tool. A custom tool has no tool class.
|
80
|
+
# Instead, the configuration itself defines the procedure.
|
81
|
+
#
|
82
|
+
def custom(name, &block)
|
83
|
+
context = CustomContext.new(&block)
|
84
|
+
settings = context.settings
|
85
|
+
@tools[name.to_s] = settings.rekey(&:to_s)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Access to project metadata.
|
89
|
+
#
|
90
|
+
# FIXME: Use factory method
|
91
|
+
def project
|
92
|
+
@project ||= Project.new
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
# Capitalized tool names called as methods
|
98
|
+
# can also define a tool.
|
99
|
+
def method_missing(sym, *args, &block)
|
100
|
+
tool_class = sym.to_s
|
101
|
+
case tool_class
|
102
|
+
when /^[A-Z]/
|
103
|
+
if Hash === args.last
|
104
|
+
args.last[:tool] = tool_class
|
105
|
+
else
|
106
|
+
args << {:tool=>tool_class}
|
107
|
+
end
|
108
|
+
case args.first
|
109
|
+
when String, Symbol
|
110
|
+
name = args.first
|
111
|
+
else
|
112
|
+
name = tool_class.to_s.downcase
|
113
|
+
end
|
114
|
+
tool(name, *args, &block)
|
115
|
+
else
|
116
|
+
super(sym, *args, &block)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# Process Routine document via ERB.
|
121
|
+
def erb(text)
|
122
|
+
context = ERBContext.new(project)
|
123
|
+
ERB.new(text).result(context.__binding__)
|
124
|
+
end
|
125
|
+
|
126
|
+
# ERBContext provides the clean context to process a Routine
|
127
|
+
# as an ERB template.
|
128
|
+
class ERBContext
|
129
|
+
#
|
130
|
+
def initialize(project)
|
131
|
+
@project = project
|
132
|
+
end
|
133
|
+
|
134
|
+
# Access to a clean binding.
|
135
|
+
def __binding__
|
136
|
+
binding
|
137
|
+
end
|
138
|
+
|
139
|
+
# Provide access to project data.
|
140
|
+
def project
|
141
|
+
@project
|
142
|
+
end
|
143
|
+
|
144
|
+
#
|
145
|
+
def method_missing(name, *args)
|
146
|
+
if project.respond_to?(name)
|
147
|
+
project.__send__(name, *args)
|
148
|
+
elsif project.metadata.respond_to?(name)
|
149
|
+
project.metadata.__send__(name, *args)
|
150
|
+
else
|
151
|
+
super(name, *args)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
#
|
157
|
+
class BlockContext
|
158
|
+
#
|
159
|
+
attr :settings
|
160
|
+
|
161
|
+
#
|
162
|
+
def initialize(&b)
|
163
|
+
@settings = {}
|
164
|
+
b.arity == 1 ? b.call(self) : instance_eval(&b)
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
def set(name, value=nil, &block)
|
169
|
+
if block
|
170
|
+
block_context = BlockContext.new
|
171
|
+
block.call(block_context)
|
172
|
+
@settings[name.to_s] = block_context.settings
|
173
|
+
else
|
174
|
+
@settings[name.to_s] = value
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
#
|
179
|
+
def method_missing(symbol, value=nil, *args)
|
180
|
+
case name = symbol.to_s
|
181
|
+
when /=$/
|
182
|
+
@settings[name.chomp('=')] = value
|
183
|
+
else
|
184
|
+
return super(symbol, value, *args) unless args.empty?
|
185
|
+
if value
|
186
|
+
@settings[name.to_s] = value
|
187
|
+
else
|
188
|
+
@settings[name.to_s]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
#
|
195
|
+
class CustomContext
|
196
|
+
#
|
197
|
+
attr :settings
|
198
|
+
#
|
199
|
+
def initialize(&b)
|
200
|
+
@settings = {}
|
201
|
+
b.arity == 0 ? instance_eval(&b) : b.call(self)
|
202
|
+
end
|
203
|
+
#
|
204
|
+
def method_missing(s,a=nil,*x,&b)
|
205
|
+
case s.to_s
|
206
|
+
when /=$/
|
207
|
+
@settings[s.to_s.chomp('=').to_sym] = b ? b : a
|
208
|
+
else
|
209
|
+
return @settings[s] unless a
|
210
|
+
@settings[s] = b ? b : a
|
211
|
+
end
|
212
|
+
end
|
213
|
+
def respond_to?(s)
|
214
|
+
@settings.key?(s.to_sym)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
# NOTE: This is problematic, because an Assembly file should know from
|
221
|
+
# what file it was derived.
|
222
|
+
|
223
|
+
#
|
224
|
+
DOMAIN = "rubyworks.github.com/detroit,2011-05-27"
|
225
|
+
|
226
|
+
# TODO: If using Psych rather than Syck, then define a domain type.
|
227
|
+
|
228
|
+
#if defined?(Psych) #RUBY_VERSION >= '1.9'
|
229
|
+
# YAML::add_domain_type(DOMAIN, "assembly") do |type, hash|
|
230
|
+
# Assembly.load(hash)
|
231
|
+
# end
|
232
|
+
#else
|
233
|
+
YAML::add_builtin_type("assembly") do |type, value|
|
234
|
+
value
|
235
|
+
#case value
|
236
|
+
#when String
|
237
|
+
# Assembly.eval(value)
|
238
|
+
#when Hash
|
239
|
+
# Assembly.new(value)
|
240
|
+
#else
|
241
|
+
# raise "ERROR: Invalid Assembly"
|
242
|
+
#end
|
243
|
+
end
|
244
|
+
#end
|
245
|
+
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Detroit
|
2
|
+
|
3
|
+
module Toolchain
|
4
|
+
|
5
|
+
# TODO: Need to work on how to limit a service's groups per-assembly.
|
6
|
+
|
7
|
+
##
|
8
|
+
# Service class wraps a Tool instance when it is made part of an assembly.
|
9
|
+
#
|
10
|
+
# TODO: Perhpas a better name would be `Link`, as in "chain link"?
|
11
|
+
#
|
12
|
+
class Worker
|
13
|
+
|
14
|
+
attr :key
|
15
|
+
attr :track
|
16
|
+
attr :priority
|
17
|
+
attr :active
|
18
|
+
attr :tool
|
19
|
+
#attr :options
|
20
|
+
|
21
|
+
# Set the priority. Priority determines the order which
|
22
|
+
# services on the same stop are run.
|
23
|
+
#
|
24
|
+
def priority=(integer)
|
25
|
+
@priority = integer.to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
# Set the tracks a service will be available on.
|
29
|
+
#
|
30
|
+
def track=(list)
|
31
|
+
@track = list.to_list
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
def active=(boolean)
|
36
|
+
@active = !!boolean
|
37
|
+
end
|
38
|
+
|
39
|
+
# Create new wrapper.
|
40
|
+
#
|
41
|
+
def initialize(key, tool_class, options)
|
42
|
+
@key = key
|
43
|
+
|
44
|
+
## set defaults
|
45
|
+
@track = nil
|
46
|
+
@priority = 0
|
47
|
+
@active = true
|
48
|
+
|
49
|
+
self.active = options.delete('active') if !options['active'].nil?
|
50
|
+
self.track = options.delete('track') if options.key?('track')
|
51
|
+
self.priority = options.delete('priority') if options.key?('priority')
|
52
|
+
|
53
|
+
@tool = tool_class.new(options)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Does the tool handle the given assembly station?
|
57
|
+
#
|
58
|
+
# If `true` is returned than the station is handled by a method
|
59
|
+
# in the tool with the same name.
|
60
|
+
#
|
61
|
+
# If a symbol is returned then the station is handled, but via
|
62
|
+
# the method named by the returned symbol.
|
63
|
+
#
|
64
|
+
# @return [Boolean,Symbol]
|
65
|
+
def stop?(station, stop=nil)
|
66
|
+
@tool.assemble?(station.to_sym, :destination=>stop.to_sym)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Run the service assembly station procedure.
|
70
|
+
#
|
71
|
+
def invoke(station, stop=nil)
|
72
|
+
@tool.assemble(station.to_sym, :destination=>stop.to_sym)
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
def inspect
|
77
|
+
"<#{self.class}:#{object_id} @key='#{key}'>"
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/man/detroit.1
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
.\" generated with Ronn/v0.7.3
|
2
|
+
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
3
|
+
.
|
4
|
+
.TH "DETROIT" "1" "January 2014" "" "Detroit"
|
5
|
+
.
|
6
|
+
.SH "NAME"
|
7
|
+
\fBdetroit\fR \- a life\-cycle build tool
|
8
|
+
.
|
9
|
+
.SH "DESCRIPTION"
|
10
|
+
Detroit is a software production management aid\. Detroit utilizes a life\-cycle methodology to help developers prepare and release software in a clear, repeatable, linear fashion\. While programmed in and well suited to Ruby projects, Detroit can utilized for any build requirements\.
|
11
|
+
.
|
12
|
+
.SH "USAGE"
|
13
|
+
To utilize Detroit add a \fBToolchain\fR file to your project\'s root directory\. In this file add instantiation of tools, configured to your projects build requirements\. Toolchain files can be written in YAML or Ruby\.
|
14
|
+
.
|
15
|
+
.P
|
16
|
+
For example to generate RDoc\'s for a project, a tool might be defined:
|
17
|
+
.
|
18
|
+
.IP "" 4
|
19
|
+
.
|
20
|
+
.nf
|
21
|
+
|
22
|
+
rdoc:
|
23
|
+
tool: rdoc
|
24
|
+
files:
|
25
|
+
\- lib
|
26
|
+
\- \'[A\-Z]*\.*\'
|
27
|
+
main: README\.md
|
28
|
+
.
|
29
|
+
.fi
|
30
|
+
.
|
31
|
+
.IP "" 0
|
32
|
+
.
|
33
|
+
.P
|
34
|
+
See the online User Guide \fIhttp://wiki\.rubyworks\.github\.com/detroit\fR for more details on creating toolchain files\.
|
35
|
+
.
|
36
|
+
.P
|
37
|
+
Once a toolchain file is in place, the \fBdetroit\fR command line tool can be used to invoke the tools\. For example, to generate documentation:
|
38
|
+
.
|
39
|
+
.IP "" 4
|
40
|
+
.
|
41
|
+
.nf
|
42
|
+
|
43
|
+
$ detroit document
|
44
|
+
.
|
45
|
+
.fi
|
46
|
+
.
|
47
|
+
.IP "" 0
|
48
|
+
.
|
49
|
+
.P
|
50
|
+
This will run through all standard stations up to and including \fBdocument\fR\. Since the RDoc tool we configured above defines a document job, it would be run in due course\.
|
51
|
+
.
|
52
|
+
.SH "OPTIONS"
|
53
|
+
These are the available options for the \fBdetroit\fR command line tool\.
|
54
|
+
.
|
55
|
+
.IP "\(bu" 4
|
56
|
+
\fB\-m\fR, \fB\-\-multitask\fR Run work elements in parallel\.
|
57
|
+
.
|
58
|
+
.IP "\(bu" 4
|
59
|
+
\fB\-S\fR, \fB\-\-skip=SERVICE\fR Skip a service\.
|
60
|
+
.
|
61
|
+
.IP "\(bu" 4
|
62
|
+
\fB\-s\fR, \fB\-\-system=NAME\fR Select assembly system\. Default is \'standard\'\.
|
63
|
+
.
|
64
|
+
.IP "\(bu" 4
|
65
|
+
\fB\-t\fR, \fB\-\-toolchain=FILE\fR Use specific toolchain file(s)\.
|
66
|
+
.
|
67
|
+
.IP "\(bu" 4
|
68
|
+
\fB\-F\fR, \fB\-\-force\fR Force operations\.
|
69
|
+
.
|
70
|
+
.IP "\(bu" 4
|
71
|
+
\fB\-\-trace\fR Run in TRACE mode\.
|
72
|
+
.
|
73
|
+
.IP "\(bu" 4
|
74
|
+
\fB\-\-trial\fR Run in TRIAL mode (no disk writes)\.
|
75
|
+
.
|
76
|
+
.IP "\(bu" 4
|
77
|
+
\fB\-\-verbose\fR Provide extra output\.
|
78
|
+
.
|
79
|
+
.IP "\(bu" 4
|
80
|
+
\fB\-q\fR, \fB\-\-quiet\fR Run silently\.
|
81
|
+
.
|
82
|
+
.IP "\(bu" 4
|
83
|
+
\fB\-I=PATH\fR Add directory to $LOAD_PATH
|
84
|
+
.
|
85
|
+
.IP "\(bu" 4
|
86
|
+
\fB\-\-debug\fR Run with $DEBUG set to true\.
|
87
|
+
.
|
88
|
+
.IP "\(bu" 4
|
89
|
+
\fB\-\-warn\fR Run with $VERBOSE set to true\.
|
90
|
+
.
|
91
|
+
.IP "\(bu" 4
|
92
|
+
\fB\-\-help [TOOL]\fR Display this help message\.
|
93
|
+
.
|
94
|
+
.IP "\(bu" 4
|
95
|
+
\fB\-c\fR, \fB\-\-config=TOOL\fR Produce a configuration template\.
|
96
|
+
.
|
97
|
+
.IP "" 0
|
98
|
+
.
|
99
|
+
.SH "RESOURCES"
|
100
|
+
.
|
101
|
+
.IP "\(bu" 4
|
102
|
+
Homepage \fIhttp://rubyworks\.github\.com/detroit\fR
|
103
|
+
.
|
104
|
+
.IP "\(bu" 4
|
105
|
+
Development \fIhttp://github\.com/rubyworks/detroit\fR
|
106
|
+
.
|
107
|
+
.IP "\(bu" 4
|
108
|
+
Mailing List \fIhttp://googlegroups\.com/group/rubyworks\-mailinglist\fR
|
109
|
+
.
|
110
|
+
.IP "" 0
|
111
|
+
.
|
112
|
+
.SH "COPYRIGHT"
|
113
|
+
Copyright (c) 2011 Rubyworks
|
114
|
+
.
|
115
|
+
.P
|
116
|
+
Detroit is distributable in accordance with the terms of the GPL v3 license\.
|
data/man/detroit.1.html
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
5
|
+
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
|
6
|
+
<title>detroit(1) - a life-cycle build tool</title>
|
7
|
+
<style type='text/css' media='all'>
|
8
|
+
/* style: man */
|
9
|
+
body#manpage {margin:0}
|
10
|
+
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
11
|
+
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
|
12
|
+
.mp h2 {margin:10px 0 0 0}
|
13
|
+
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
|
14
|
+
.mp h3 {margin:0 0 0 4ex}
|
15
|
+
.mp dt {margin:0;clear:left}
|
16
|
+
.mp dt.flush {float:left;width:8ex}
|
17
|
+
.mp dd {margin:0 0 0 9ex}
|
18
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
|
19
|
+
.mp pre {margin-bottom:20px}
|
20
|
+
.mp pre+h2,.mp pre+h3 {margin-top:22px}
|
21
|
+
.mp h2+pre,.mp h3+pre {margin-top:5px}
|
22
|
+
.mp img {display:block;margin:auto}
|
23
|
+
.mp h1.man-title {display:none}
|
24
|
+
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
|
25
|
+
.mp h2 {font-size:16px;line-height:1.25}
|
26
|
+
.mp h1 {font-size:20px;line-height:2}
|
27
|
+
.mp {text-align:justify;background:#fff}
|
28
|
+
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
|
29
|
+
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
|
30
|
+
.mp u {text-decoration:underline}
|
31
|
+
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
|
32
|
+
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
|
33
|
+
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
|
34
|
+
.mp b.man-ref {font-weight:normal;color:#434241}
|
35
|
+
.mp pre {padding:0 4ex}
|
36
|
+
.mp pre code {font-weight:normal;color:#434241}
|
37
|
+
.mp h2+pre,h3+pre {padding-left:0}
|
38
|
+
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
|
39
|
+
ol.man-decor {width:100%}
|
40
|
+
ol.man-decor li.tl {text-align:left}
|
41
|
+
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
|
42
|
+
ol.man-decor li.tr {text-align:right;float:right}
|
43
|
+
</style>
|
44
|
+
</head>
|
45
|
+
<!--
|
46
|
+
The following styles are deprecated and will be removed at some point:
|
47
|
+
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
|
48
|
+
|
49
|
+
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
|
50
|
+
.man-navigation should be used instead.
|
51
|
+
-->
|
52
|
+
<body id='manpage'>
|
53
|
+
<div class='mp' id='man'>
|
54
|
+
|
55
|
+
<div class='man-navigation' style='display:none'>
|
56
|
+
<a href="#NAME">NAME</a>
|
57
|
+
<a href="#DESCRIPTION">DESCRIPTION</a>
|
58
|
+
<a href="#USAGE">USAGE</a>
|
59
|
+
<a href="#OPTIONS">OPTIONS</a>
|
60
|
+
<a href="#RESOURCES">RESOURCES</a>
|
61
|
+
<a href="#COPYRIGHT">COPYRIGHT</a>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<ol class='man-decor man-head man head'>
|
65
|
+
<li class='tl'>detroit(1)</li>
|
66
|
+
<li class='tc'>Detroit</li>
|
67
|
+
<li class='tr'>detroit(1)</li>
|
68
|
+
</ol>
|
69
|
+
|
70
|
+
<h2 id="NAME">NAME</h2>
|
71
|
+
<p class="man-name">
|
72
|
+
<code>detroit</code> - <span class="man-whatis">a life-cycle build tool</span>
|
73
|
+
</p>
|
74
|
+
|
75
|
+
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
76
|
+
|
77
|
+
<p>Detroit is a software production management aid. Detroit utilizes a
|
78
|
+
life-cycle methodology to help developers prepare and release software
|
79
|
+
in a clear, repeatable, linear fashion. While programmed in and well
|
80
|
+
suited to Ruby projects, Detroit can utilized for any build requirements.</p>
|
81
|
+
|
82
|
+
<h2 id="USAGE">USAGE</h2>
|
83
|
+
|
84
|
+
<p>To utilize Detroit add a <code>Toolchain</code> file to your project's root directory.
|
85
|
+
In this file add instantiation of tools, configured to your projects build
|
86
|
+
requirements. Toolchain files can be written in YAML or Ruby.</p>
|
87
|
+
|
88
|
+
<p>For example to generate RDoc's for a project, a tool might be defined:</p>
|
89
|
+
|
90
|
+
<pre><code>rdoc:
|
91
|
+
tool: rdoc
|
92
|
+
files:
|
93
|
+
- lib
|
94
|
+
- '[A-Z]*.*'
|
95
|
+
main: README.md
|
96
|
+
</code></pre>
|
97
|
+
|
98
|
+
<p>See the online <a href="http://wiki.rubyworks.github.com/detroit">User Guide</a> for
|
99
|
+
more details on creating toolchain files.</p>
|
100
|
+
|
101
|
+
<p>Once a toolchain file is in place, the <code>detroit</code> command line tool can be used
|
102
|
+
to invoke the tools. For example, to generate documentation:</p>
|
103
|
+
|
104
|
+
<pre><code>$ detroit document
|
105
|
+
</code></pre>
|
106
|
+
|
107
|
+
<p>This will run through all standard stations up to and including <code>document</code>.
|
108
|
+
Since the RDoc tool we configured above defines a document job, it would be
|
109
|
+
run in due course.</p>
|
110
|
+
|
111
|
+
<h2 id="OPTIONS">OPTIONS</h2>
|
112
|
+
|
113
|
+
<p>These are the available options for the <code>detroit</code> command line tool.</p>
|
114
|
+
|
115
|
+
<ul>
|
116
|
+
<li><p><code>-m</code>, <code>--multitask</code>
|
117
|
+
Run work elements in parallel.</p></li>
|
118
|
+
<li><p><code>-S</code>, <code>--skip=SERVICE</code>
|
119
|
+
Skip a service.</p></li>
|
120
|
+
<li><p><code>-s</code>, <code>--system=NAME</code>
|
121
|
+
Select assembly system. Default is 'standard'.</p></li>
|
122
|
+
<li><p><code>-t</code>, <code>--toolchain=FILE</code>
|
123
|
+
Use specific toolchain file(s).</p></li>
|
124
|
+
<li><p><code>-F</code>, <code>--force</code>
|
125
|
+
Force operations.</p></li>
|
126
|
+
<li><p><code>--trace</code>
|
127
|
+
Run in TRACE mode.</p></li>
|
128
|
+
<li><p><code>--trial</code>
|
129
|
+
Run in TRIAL mode (no disk writes).</p></li>
|
130
|
+
<li><p><code>--verbose</code>
|
131
|
+
Provide extra output.</p></li>
|
132
|
+
<li><p><code>-q</code>, <code>--quiet</code>
|
133
|
+
Run silently.</p></li>
|
134
|
+
<li><p><code>-I=PATH</code>
|
135
|
+
Add directory to $LOAD_PATH</p></li>
|
136
|
+
<li><p><code>--debug</code>
|
137
|
+
Run with $DEBUG set to true.</p></li>
|
138
|
+
<li><p><code>--warn</code>
|
139
|
+
Run with $VERBOSE set to true.</p></li>
|
140
|
+
<li><p><code>--help [TOOL]</code>
|
141
|
+
Display this help message.</p></li>
|
142
|
+
<li><p><code>-c</code>, <code>--config=TOOL</code>
|
143
|
+
Produce a configuration template.</p></li>
|
144
|
+
</ul>
|
145
|
+
|
146
|
+
|
147
|
+
<h2 id="RESOURCES">RESOURCES</h2>
|
148
|
+
|
149
|
+
<ul>
|
150
|
+
<li><a href="http://rubyworks.github.com/detroit">Homepage</a></li>
|
151
|
+
<li><a href="http://github.com/rubyworks/detroit">Development</a></li>
|
152
|
+
<li><a href="http://googlegroups.com/group/rubyworks-mailinglist">Mailing List</a></li>
|
153
|
+
</ul>
|
154
|
+
|
155
|
+
|
156
|
+
<h2 id="COPYRIGHT">COPYRIGHT</h2>
|
157
|
+
|
158
|
+
<p>Copyright (c) 2011 Rubyworks</p>
|
159
|
+
|
160
|
+
<p>Detroit is distributable in accordance with the terms of the GPL v3 license.</p>
|
161
|
+
|
162
|
+
|
163
|
+
<ol class='man-decor man-foot man foot'>
|
164
|
+
<li class='tl'></li>
|
165
|
+
<li class='tc'>January 2014</li>
|
166
|
+
<li class='tr'>detroit(1)</li>
|
167
|
+
</ol>
|
168
|
+
|
169
|
+
</div>
|
170
|
+
</body>
|
171
|
+
</html>
|