jscompiler 0.1.0 → 0.2.1
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/bin/jsc +2 -1
- data/lib/jscompiler/cli.rb +101 -53
- data/lib/jscompiler/commands/base.rb +51 -3
- data/lib/jscompiler/commands/clojure.rb +12 -16
- data/lib/jscompiler/commands/yahoo.rb +48 -0
- data/lib/jscompiler/config.rb +33 -13
- data/lib/jscompiler/version.rb +1 -1
- data/lib/jscompiler.rb +1 -0
- data/lib/templates/jscompiler.yml.erb +2 -3
- data/vendor/yahoo/LICENSE +53 -0
- data/vendor/yahoo/README +229 -0
- data/vendor/yahoo/yuicompressor-2.4.2.jar +0 -0
- metadata +5 -1
data/bin/jsc
CHANGED
@@ -29,7 +29,8 @@ Signal.trap(:INT) { abort "\nAborting jscompiler task." }
|
|
29
29
|
[ 'cli.rb',
|
30
30
|
'config.rb',
|
31
31
|
'commands/base.rb',
|
32
|
-
'commands/clojure.rb'
|
32
|
+
'commands/clojure.rb',
|
33
|
+
'commands/yahoo.rb',
|
33
34
|
].each do |f|
|
34
35
|
require File.expand_path(File.join(File.dirname(__FILE__), "../lib/jscompiler/#{f}"))
|
35
36
|
end
|
data/lib/jscompiler/cli.rb
CHANGED
@@ -39,78 +39,83 @@ module Jscompiler
|
|
39
39
|
def init
|
40
40
|
say("Initializing your project...")
|
41
41
|
|
42
|
-
|
43
|
-
# comps = [
|
44
|
-
# ["1:", "clojure"],
|
45
|
-
# ]
|
46
|
-
# print_table(comps)
|
47
|
-
# num = ask_for_number(1)
|
48
|
-
# @compiler = comps[num-1].last
|
49
|
-
@compiler = 'clojure' # the only one for now
|
42
|
+
ask_for_compiler
|
50
43
|
|
51
44
|
@root = ask("\r\nWhat is your files source folder (a relative path from the current directory)?")
|
52
|
-
@
|
53
|
-
table = []
|
54
|
-
@files.each_with_index do |fl, index|
|
55
|
-
table << ["#{index + 1}: ", fl]
|
56
|
-
end
|
57
|
-
print_table(table)
|
45
|
+
@root = '.' if @root == ''
|
58
46
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
table = []
|
74
|
-
@files.each_with_index do |fl, index|
|
75
|
-
table << ["#{index + 1}: ", fl]
|
76
|
-
end
|
77
|
-
print_table(table)
|
47
|
+
ask_for_file_order
|
48
|
+
ask_for_output_path
|
49
|
+
|
50
|
+
template 'templates/jscompiler.yml.erb', "./#{Jscompiler::Config.path}"
|
51
|
+
|
52
|
+
say("Configuration has been saved in .jscompiler file. You now can run the compile commands.")
|
53
|
+
end
|
54
|
+
|
55
|
+
map 'g' => :group
|
56
|
+
desc 'group', 'Creates a new file group'
|
57
|
+
def group
|
58
|
+
unless Jscompiler::Config.configured?
|
59
|
+
say("This folder has not yet been configured to run jsc commands. Please run 'jsc init'.")
|
60
|
+
return
|
78
61
|
end
|
79
62
|
|
80
|
-
@
|
63
|
+
@group_name = ask("What would you like to name this group?")
|
64
|
+
@root = Jscompiler::Config.source_root
|
65
|
+
ask_for_compiler(:default => true)
|
66
|
+
ask_for_file_order
|
67
|
+
ask_for_output_path
|
81
68
|
|
82
|
-
@
|
69
|
+
Jscompiler::Config.config['groups'][@group_name] = {
|
70
|
+
"files" => @files,
|
71
|
+
"output" => {"path" => @output},
|
72
|
+
}
|
83
73
|
|
84
|
-
@
|
74
|
+
if @compiler != "default"
|
75
|
+
Jscompiler::Config.config['groups'][@group_name]["compiler"] = {"name" => @compiler}
|
76
|
+
end
|
85
77
|
|
86
|
-
|
87
|
-
FileUtils.mkdir_p(@output)
|
78
|
+
Jscompiler::Config.update_config
|
88
79
|
|
89
|
-
say("Configuration has been saved. You now can run the compile
|
80
|
+
say("Configuration has been saved in .jscompiler file. You now can run the compile commands.")
|
90
81
|
end
|
91
82
|
|
92
83
|
map 'c' => :compile
|
93
84
|
desc 'compile', 'Compiles selected file group'
|
85
|
+
method_option :compiler, :type => :string, :aliases => "-c", :required => false, :banner => "Compiler to use for compilation", :default => nil
|
94
86
|
method_option :group, :type => :string, :aliases => "-g", :required => false, :banner => "Group to compile", :default => nil
|
87
|
+
method_option :output, :type => :string, :aliases => "-o", :required => false, :banner => "Path and name of the output file", :default => nil
|
88
|
+
method_option :prefix, :type => :string, :aliases => "-p", :required => false, :banner => "Prepand prefix to all compiled file names", :default => nil
|
89
|
+
method_option :suffix, :type => :string, :aliases => "-s", :required => false, :banner => "Append suffix to all compiled file names", :default => nil
|
95
90
|
def compile
|
91
|
+
unless Jscompiler::Config.configured?
|
92
|
+
say("This folder has not yet been configured to run jsc commands. Please run 'jsc init'.")
|
93
|
+
return
|
94
|
+
end
|
95
|
+
|
96
96
|
if @options[:group]
|
97
97
|
unless Jscompiler::Config.groups.keys.include?(@options[:group])
|
98
98
|
puts("Error: invalid group name")
|
99
99
|
return
|
100
100
|
end
|
101
101
|
|
102
|
-
Jscompiler::
|
102
|
+
Jscompiler::Commands::Base.compile_group(@options[:group], @options)
|
103
103
|
return
|
104
104
|
end
|
105
105
|
|
106
106
|
Jscompiler::Config.groups.keys.each do |group|
|
107
|
-
Jscompiler::
|
107
|
+
Jscompiler::Commands::Base.compile_group(group, @options)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
111
|
map 'w' => :watch
|
112
112
|
desc 'watch', 'Watches source root folder for cahnges and compiles all affected groups'
|
113
113
|
def watch
|
114
|
+
unless Jscompiler::Config.configured?
|
115
|
+
say("This folder has not yet been configured to run jsc commands. Please run 'jsc init'.")
|
116
|
+
return
|
117
|
+
end
|
118
|
+
|
114
119
|
say("Started monitoring #{Jscompiler::Config.source_root} folder. To stop use Ctrl+C.")
|
115
120
|
|
116
121
|
monitor = FSSM::Monitor.new
|
@@ -127,8 +132,9 @@ module Jscompiler
|
|
127
132
|
|
128
133
|
def compile(relative)
|
129
134
|
Jscompiler::Config.groups.keys.each do |group|
|
130
|
-
|
131
|
-
Jscompiler::
|
135
|
+
full_path = Jscompiler::Config.source_root == '.' ? relative : "#{Jscompiler::Config.source_root}/#{relative}"
|
136
|
+
next unless Jscompiler::Config.files(group).include?(full_path)
|
137
|
+
Jscompiler::Commands::Base.compile_group(group)
|
132
138
|
end
|
133
139
|
end
|
134
140
|
end
|
@@ -136,19 +142,61 @@ module Jscompiler
|
|
136
142
|
monitor.run
|
137
143
|
end
|
138
144
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
145
|
+
private
|
146
|
+
|
147
|
+
def ask_for_compiler(opts = {})
|
148
|
+
say("Which compiler would you like to use?")
|
149
|
+
compilers = ["clojure", "yahoo"]
|
150
|
+
if opts[:default]
|
151
|
+
compilers.unshift("default")
|
152
|
+
end
|
153
|
+
options = []
|
154
|
+
compilers.each_with_index do |c, index|
|
155
|
+
options << ["#{index + 1}:", c]
|
156
|
+
end
|
157
|
+
print_table(options)
|
158
|
+
num = ask_for_number(compilers.size)
|
159
|
+
@compiler = compilers[num-1]
|
160
|
+
end
|
147
161
|
|
148
|
-
|
162
|
+
def ask_for_output_path(opts = {})
|
163
|
+
@output = ask("\r\nWhat is the path of the output file (a relative path from the current folder)?")
|
164
|
+
@output = './compiled.js' if @output == ''
|
165
|
+
if @output.index('/')
|
166
|
+
FileUtils.mkdir_p(@output.split('/')[0..-2].join('/'))
|
167
|
+
end
|
149
168
|
end
|
150
169
|
|
151
|
-
|
170
|
+
def ask_for_file_order(opts = {})
|
171
|
+
@files = Dir.glob("#{@root}/**/*.js")
|
172
|
+
|
173
|
+
table = []
|
174
|
+
@files.each_with_index do |fl, index|
|
175
|
+
table << ["#{index + 1}: ", fl]
|
176
|
+
end
|
177
|
+
print_table(table)
|
178
|
+
|
179
|
+
say("\r\nEnter the file numbers in the order you want them to be compiled (separated with commas). For example: 2,4,1,3. If the order doesn't matter, just press enter.")
|
180
|
+
nums = ask("File order: ")
|
181
|
+
if nums.strip != ""
|
182
|
+
files = []
|
183
|
+
nums.split(",").each do |num|
|
184
|
+
index = num.to_i - 1
|
185
|
+
if index < 0 or index >= @files.size
|
186
|
+
puts("Invalid file number: #{num}")
|
187
|
+
next
|
188
|
+
end
|
189
|
+
files << @files[index]
|
190
|
+
end
|
191
|
+
@files = files
|
192
|
+
say("The files will be compiled in the following order. You can change the order manually by modifying the .jscompiler file in this folder.")
|
193
|
+
table = []
|
194
|
+
@files.each_with_index do |fl, index|
|
195
|
+
table << ["#{index + 1}: ", fl]
|
196
|
+
end
|
197
|
+
print_table(table)
|
198
|
+
end
|
199
|
+
end
|
152
200
|
|
153
201
|
def ask_for_number(max, opts = {})
|
154
202
|
opts[:message] ||= "Choose: "
|
@@ -48,8 +48,44 @@ module Jscompiler
|
|
48
48
|
content.gsub(comments_regexp, '')
|
49
49
|
end
|
50
50
|
|
51
|
-
def
|
52
|
-
|
51
|
+
def prepare_arguments(args)
|
52
|
+
args.collect{|arg| arg.join(' ')}.join(' ')
|
53
|
+
end
|
54
|
+
|
55
|
+
def prepare_command(cmd, args)
|
56
|
+
"#{cmd} #{prepare_arguments(args)}"
|
57
|
+
end
|
58
|
+
|
59
|
+
def save_or_delete_temp_file
|
60
|
+
if Jscompiler::Config.debug?(group)
|
61
|
+
FileUtils.mv(temp_file_path, debug_file_path)
|
62
|
+
else
|
63
|
+
FileUtils.rm(temp_file_path)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def temp_file_path
|
68
|
+
Jscompiler::Config.output_destination(group, :suffix => ".tmp")
|
69
|
+
end
|
70
|
+
|
71
|
+
def debug_file_path
|
72
|
+
Jscompiler::Config.output_destination(group, :suffix => ".debug")
|
73
|
+
end
|
74
|
+
|
75
|
+
def generate_temp_file
|
76
|
+
File.open(temp_file_path, 'w') do |file|
|
77
|
+
Jscompiler::Config.files(group).each do |fl|
|
78
|
+
puts("Processing #{fl}...")
|
79
|
+
content = File.read(fl)
|
80
|
+
content = sanitize(content)
|
81
|
+
file.write(content)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def output_file_path
|
87
|
+
return options["output"] if options["output"]
|
88
|
+
Jscompiler::Config.output_destination(group, options)
|
53
89
|
end
|
54
90
|
|
55
91
|
def execute(cmd, opts = {})
|
@@ -65,7 +101,19 @@ module Jscompiler
|
|
65
101
|
puts("Build failed.")
|
66
102
|
exit 1
|
67
103
|
end
|
68
|
-
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.compile_group(group, opts = {})
|
107
|
+
puts("\r\nCompiling #{group} group...")
|
108
|
+
|
109
|
+
t0 = Time.now
|
110
|
+
Jscompiler::Config.compiler_command(group, opts).new(opts.merge({
|
111
|
+
:group => group
|
112
|
+
})).run
|
113
|
+
t1 = Time.now
|
114
|
+
|
115
|
+
puts("Done. Compilation took #{t1-t0} seconds\r\n")
|
116
|
+
end
|
69
117
|
|
70
118
|
end
|
71
119
|
|
@@ -26,26 +26,22 @@ module Jscompiler
|
|
26
26
|
|
27
27
|
class Clojure < Base
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
Jscompiler::Config.files(group).each do |fl|
|
33
|
-
pp "Processing #{fl}..."
|
34
|
-
content = File.read(fl)
|
35
|
-
content = sanitize(content)
|
36
|
-
file.write(content)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
29
|
+
def compiler_path
|
30
|
+
File.expand_path(File.join(File.dirname(__FILE__), "../../../vendor/clojure/compiler.jar"))
|
31
|
+
end
|
40
32
|
|
41
|
-
|
42
|
-
|
43
|
-
["--
|
33
|
+
def args
|
34
|
+
[
|
35
|
+
["--js", temp_file_path],
|
36
|
+
["--js_output_file", output_file_path],
|
44
37
|
["--warning_level", Jscompiler::Config.compiler["warning_level"] || "DEFAULT"]
|
45
38
|
]
|
39
|
+
end
|
46
40
|
|
47
|
-
|
48
|
-
|
41
|
+
def run
|
42
|
+
generate_temp_file
|
43
|
+
execute(prepare_command("java -jar #{compiler_path}", args))
|
44
|
+
save_or_delete_temp_file
|
49
45
|
end
|
50
46
|
|
51
47
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2013 Michael Berkovich
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
#++
|
23
|
+
|
24
|
+
module Jscompiler
|
25
|
+
module Commands
|
26
|
+
|
27
|
+
class Yahoo < Base
|
28
|
+
|
29
|
+
def compiler_path
|
30
|
+
File.expand_path(File.join(File.dirname(__FILE__), "../../../vendor/yahoo/yuicompressor-2.4.2.jar"))
|
31
|
+
end
|
32
|
+
|
33
|
+
def args
|
34
|
+
[
|
35
|
+
["-o", output_file_path],
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
def run
|
40
|
+
generate_temp_file
|
41
|
+
execute("java -jar #{compiler_path} #{prepare_arguments(args)} #{temp_file_path}")
|
42
|
+
save_or_delete_temp_file
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
data/lib/jscompiler/config.rb
CHANGED
@@ -41,6 +41,16 @@ module Jscompiler
|
|
41
41
|
@config ||= YAML::load(File.open(path))
|
42
42
|
end
|
43
43
|
|
44
|
+
def self.update_config
|
45
|
+
File.open(path, 'w') do |file|
|
46
|
+
file.write(config.to_yaml)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.configured?
|
51
|
+
File.exists?(path)
|
52
|
+
end
|
53
|
+
|
44
54
|
def self.groups
|
45
55
|
config["groups"]
|
46
56
|
end
|
@@ -50,9 +60,14 @@ module Jscompiler
|
|
50
60
|
groups[group]["compiler"] || config["compiler"]
|
51
61
|
end
|
52
62
|
|
53
|
-
def self.compiler_command(group =
|
54
|
-
|
63
|
+
def self.compiler_command(group=nil, opts = {})
|
64
|
+
cmplr = opts[:compiler] || compiler(group)["name"]
|
65
|
+
|
66
|
+
case cmplr
|
67
|
+
when 'clojure'
|
55
68
|
Jscompiler::Commands::Clojure
|
69
|
+
when 'yahoo'
|
70
|
+
Jscompiler::Commands::Yahoo
|
56
71
|
else
|
57
72
|
raise("Unsupported compiler")
|
58
73
|
end
|
@@ -62,28 +77,33 @@ module Jscompiler
|
|
62
77
|
config["source_root"]
|
63
78
|
end
|
64
79
|
|
65
|
-
def self.files(group
|
66
|
-
groups[group]["files"]
|
80
|
+
def self.files(group)
|
81
|
+
groups[group]["files"]
|
67
82
|
end
|
68
83
|
|
69
|
-
def self.output(group
|
84
|
+
def self.output(group)
|
70
85
|
groups[group]["output"]
|
71
86
|
end
|
72
87
|
|
73
|
-
def self.output_path(group
|
88
|
+
def self.output_path(group)
|
74
89
|
output(group)["path"]
|
75
90
|
end
|
76
91
|
|
77
|
-
def self.
|
78
|
-
output(group)["name"]
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.debug?(group = "default")
|
92
|
+
def self.debug?(group)
|
82
93
|
output(group)["debug"]
|
83
94
|
end
|
84
95
|
|
85
|
-
def self.output_destination(group
|
86
|
-
|
96
|
+
def self.output_destination(group, opts = {})
|
97
|
+
path = output_path(group)
|
98
|
+
parts = path.split("/")
|
99
|
+
file_name = parts.pop
|
100
|
+
if opts[:suffix]
|
101
|
+
file_name = file_name.index('.js') ? file_name.gsub(".js", "#{opts[:suffix]}.js") : "#{file_name}#{opts[:suffix]}"
|
102
|
+
end
|
103
|
+
if opts[:prefix]
|
104
|
+
file_name = "#{opts[:prefix]}#{file_name}"
|
105
|
+
end
|
106
|
+
"#{parts.join("/")}/#{file_name}"
|
87
107
|
end
|
88
108
|
|
89
109
|
end
|
data/lib/jscompiler/version.rb
CHANGED
data/lib/jscompiler.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
---
|
1
2
|
source_root: <%=@root%> # Relative path from the project root to Where your JavaScript files are located
|
2
3
|
compiler:
|
3
4
|
name: <%=@compiler%> # Name of the compiler to use. By default "clojure" compiler will be used
|
@@ -5,8 +6,6 @@ compiler:
|
|
5
6
|
groups: # Groups of files you wish to compile
|
6
7
|
default:
|
7
8
|
files: # List of the JS files in the order they will be compiled
|
8
|
-
|
9
|
+
- <%= @files.join("\r\n - ") %>
|
9
10
|
output:
|
10
|
-
name: <%=@filename%> # Name of the output file
|
11
|
-
debug: <%=@debug%> # Wether you want to produce an uncompiled version as well
|
12
11
|
path: <%=@output%> # Relative path to where the output files should be created
|
@@ -0,0 +1,53 @@
|
|
1
|
+
All code under this directory and any subdirectories, with the exception
|
2
|
+
of the "lib" directory, is licensed under the BSD license, presented below:
|
3
|
+
|
4
|
+
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
|
5
|
+
|
6
|
+
Code licensed under the BSD License:
|
7
|
+
http://developer.yahoo.net/yui/license.txt
|
8
|
+
|
9
|
+
The "lib" directory contains build support tools, which are packaged
|
10
|
+
along with the YUI component build code, in order to simplify installation.
|
11
|
+
|
12
|
+
The contents of "lib" are covered by the individual licenses below:
|
13
|
+
|
14
|
+
1). lib/ant-contrib/ant-contrib-1.0b3-modified.jar:
|
15
|
+
|
16
|
+
Is issued under the Apache Software License. For more information, see:
|
17
|
+
|
18
|
+
http://ant-contrib.sourceforge.net/
|
19
|
+
http://ant-contrib.sourceforge.net/LICENSE.txt
|
20
|
+
|
21
|
+
The ant-contrib-1.0b3 release has been modified by YUI to add the
|
22
|
+
missing lookup entry for the "for" task to antcontrib.properties:
|
23
|
+
|
24
|
+
for=net.sf.antcontrib.logic.ForTask
|
25
|
+
|
26
|
+
2). lib/rhino/js.jar:
|
27
|
+
|
28
|
+
Rhino is issued under the Mozilla Public License (MPL), and MPL applies
|
29
|
+
to the Rhino source and binaries that are distributed under the
|
30
|
+
"lib/rhino" directory. For more information on Rhino licensing, see:
|
31
|
+
|
32
|
+
https://developer.mozilla.org/en/Rhino_License
|
33
|
+
|
34
|
+
3). lib/jslint/jslint-console.js:
|
35
|
+
|
36
|
+
Is derived from rhino.js available at www.jslint.com/rhino/rhino.js,
|
37
|
+
the contents of which are in the public domain. See the contents of the
|
38
|
+
file for licensing information.
|
39
|
+
|
40
|
+
4). lib/jslint/fulljslint.js:
|
41
|
+
|
42
|
+
Is derived from fulljslint.js, available at
|
43
|
+
http://www.jslint.com/fulljslint.js, the contents of which are in the public
|
44
|
+
domain. See the contents of the file for licensing information.
|
45
|
+
|
46
|
+
5). lib/yuicompressor:
|
47
|
+
|
48
|
+
Is covered by the BSD license, specified on
|
49
|
+
http://developer.yahoo.com/yui/compressor/
|
50
|
+
|
51
|
+
YUI Compressor ships with a modified version of Rhino, which is covered by
|
52
|
+
the Mozilla Public License, further details of which can be found at the above
|
53
|
+
url.
|
data/vendor/yahoo/README
ADDED
@@ -0,0 +1,229 @@
|
|
1
|
+
INTRODUCTION
|
2
|
+
------------
|
3
|
+
|
4
|
+
YUI uses ANT to create component build files from individual source files.
|
5
|
+
|
6
|
+
Each component has its own ANT build file residing in the component's
|
7
|
+
source folder with an associated properties file used to define build
|
8
|
+
parameters specific to the component e.g:
|
9
|
+
|
10
|
+
yui2/src/autocomplete/build.xml
|
11
|
+
yui2/src/autocomplete/build.properties
|
12
|
+
|
13
|
+
The component build will automate the conversion from component source
|
14
|
+
to <component>.js, <component>-min.js, <component>-debug.js by:
|
15
|
+
|
16
|
+
a) Concatenating individual source files
|
17
|
+
b) Stripping logger statements
|
18
|
+
c) Compressing files, using yuicompressor
|
19
|
+
d) Running jslint on all 3 built files
|
20
|
+
e) Adding boiler plate module/version registration code
|
21
|
+
f) Building skin files from <component>-core.css, <component>-skin.css
|
22
|
+
g) Deploying built JS, CSS and assets to <project>/build
|
23
|
+
|
24
|
+
The same component build system is also used for CSS components such as
|
25
|
+
reset, base, fonts and grids.
|
26
|
+
|
27
|
+
The component build does not currently:
|
28
|
+
|
29
|
+
a) Check in any code
|
30
|
+
|
31
|
+
The developer is responsible for checking modified source code
|
32
|
+
into the <project>/src directory, and built code into the
|
33
|
+
<project>/build directory, allowing them to review diffs,
|
34
|
+
before committing changes.
|
35
|
+
|
36
|
+
b) Generate API documentation
|
37
|
+
|
38
|
+
INSTALLATION
|
39
|
+
------------
|
40
|
+
|
41
|
+
Below is a brief summary as well as a detailed step-by-step guide
|
42
|
+
for installing the build system, allowing you to build the "src"
|
43
|
+
component code.
|
44
|
+
|
45
|
+
SUMMARY
|
46
|
+
|
47
|
+
1) Install ANT 1.7 or above, and add ant to your path
|
48
|
+
|
49
|
+
2) Clone the YUI "builder" project from http://github.com/yui/builder/
|
50
|
+
|
51
|
+
3) At the command line, cd to the source directory of the component
|
52
|
+
you wish to build, and execute "ant all" to build, e.g.:
|
53
|
+
|
54
|
+
prompt> cd yui2/src/autocomplete
|
55
|
+
prompt> ant all
|
56
|
+
|
57
|
+
DETAILED INSTRUCTIONS
|
58
|
+
|
59
|
+
To use the build system, you'll need to install ANT and obtain
|
60
|
+
the YUI build infrastructure from github.
|
61
|
+
|
62
|
+
These are both one-time install tasks.
|
63
|
+
|
64
|
+
INSTALLING ANT
|
65
|
+
|
66
|
+
1) Download and install ANT 1.7 (or above)
|
67
|
+
|
68
|
+
http://ant.apache.org/bindownload.cgi
|
69
|
+
|
70
|
+
2) Be sure to define an ANT_HOME environment variable to point to
|
71
|
+
your ANT install root, and add the ANT executable to your
|
72
|
+
environment's PATH variable.
|
73
|
+
|
74
|
+
INSTALLING YUI BUILD INFRASTRUCTURE
|
75
|
+
|
76
|
+
1) Clone the YUI "builder" project from github:
|
77
|
+
|
78
|
+
http://github.com/yui/builder/
|
79
|
+
|
80
|
+
This project contains the files used by the
|
81
|
+
YUI ant build process.
|
82
|
+
|
83
|
+
2) Out of the box, the build system is designed to work
|
84
|
+
when cloned to the default "builder" directory, parallel
|
85
|
+
to the project source directories:
|
86
|
+
|
87
|
+
<gitroot>/yui2 [ cloned yui2 project ]
|
88
|
+
<gitroot>/yui3 [ cloned yui2 project ]
|
89
|
+
<gitroot>/builder [ cloned builder project ]
|
90
|
+
|
91
|
+
Cloning it to the default location will allow you to
|
92
|
+
build any of the components without having to modify any
|
93
|
+
component build scripts.
|
94
|
+
|
95
|
+
NOTE: YUI Builder is also available for download as a zip from
|
96
|
+
http://yuilibrary.com/downloads. If downloading from this location
|
97
|
+
to build yui2 or yui3 source, make sure to unzip the contents into
|
98
|
+
the directory structure mentioned above, to have the build work out
|
99
|
+
of the box.
|
100
|
+
|
101
|
+
BUILDING AN EXISTING COMPONENT
|
102
|
+
------------------------------
|
103
|
+
|
104
|
+
With ANT and the YUI build infrastructure installed, you can now build any
|
105
|
+
of the components from source, using the build.xml file in the component's
|
106
|
+
source directory.
|
107
|
+
|
108
|
+
The build system allows you to build locally, within the component's
|
109
|
+
source directory, and also run a full build to update the top level build
|
110
|
+
directory for a component.
|
111
|
+
|
112
|
+
FULL BUILD
|
113
|
+
|
114
|
+
To perform a full build for a component, run ant with the "all" target:
|
115
|
+
|
116
|
+
e.g:
|
117
|
+
|
118
|
+
prompt> cd yui2/src/autocomplete
|
119
|
+
prompt> ant all
|
120
|
+
|
121
|
+
The "all" build target will build the component from its source files AND
|
122
|
+
deploy the built files, as well as any assets, to the top level build
|
123
|
+
folder:
|
124
|
+
|
125
|
+
<project>/build/<component>
|
126
|
+
|
127
|
+
So, for autocomplete, the built files would be copied to:
|
128
|
+
|
129
|
+
yui2/build/autocomplete
|
130
|
+
|
131
|
+
NOTE: When invoking ant without a file argument, as we do above, it will
|
132
|
+
use build.xml, if present in the current directory - which is what we want.
|
133
|
+
|
134
|
+
LOCAL BUILD
|
135
|
+
|
136
|
+
To perform a local build for a component, run ant without a target:
|
137
|
+
|
138
|
+
e.g:
|
139
|
+
|
140
|
+
prompt> cd yui2/src/autocomplete
|
141
|
+
prompt> ant
|
142
|
+
|
143
|
+
This will run the default target, which is "local".
|
144
|
+
|
145
|
+
The "local" build target will build the autocomplete component from its
|
146
|
+
source files, but will NOT deploy the built files to the top level build
|
147
|
+
folder.
|
148
|
+
|
149
|
+
The locally built files are stored in the temporary directory:
|
150
|
+
|
151
|
+
<project>/src/<component>/build_tmp
|
152
|
+
|
153
|
+
So, for autocomplete, the built files can be found in the directory below:
|
154
|
+
|
155
|
+
yui2/src/autocomplete/build_tmp
|
156
|
+
|
157
|
+
BUILD OUTPUT
|
158
|
+
|
159
|
+
ANT will output build information to the screen, as it runs through the
|
160
|
+
build, which can be redirected to a file if required:
|
161
|
+
|
162
|
+
prompt> ant all
|
163
|
+
|
164
|
+
Buildfile: build.xml
|
165
|
+
[echo] Starting Build For autocomplete
|
166
|
+
...
|
167
|
+
[echo] builddir : ../../../builder/componentbuild
|
168
|
+
...
|
169
|
+
...
|
170
|
+
BUILD SUCCESSFUL
|
171
|
+
Total time: 7 seconds
|
172
|
+
|
173
|
+
prompt>
|
174
|
+
|
175
|
+
NOTE: Most components will have warnings which are output during the
|
176
|
+
"minify" and "lint" steps, which the component developer has evaluated
|
177
|
+
and determined to have no impact on functionality.
|
178
|
+
|
179
|
+
CREATING BUILD FILES FOR A NEW COMPONENT
|
180
|
+
----------------------------------------
|
181
|
+
|
182
|
+
The builder/componentbuild/templates directory has basic build.xml and
|
183
|
+
build.properties templates for the various component types supported.
|
184
|
+
|
185
|
+
For most new components, you should be able to start with the
|
186
|
+
appropriate template files and simply change the values of the basic
|
187
|
+
properties defined to suit your component.
|
188
|
+
|
189
|
+
If you're creating:
|
190
|
+
|
191
|
+
* A YUI 2 Component (either a JS or CSS component), use:
|
192
|
+
|
193
|
+
builder/componentbuild/templates/yui2
|
194
|
+
|
195
|
+
build.xml
|
196
|
+
build.properties
|
197
|
+
|
198
|
+
* A YUI 3 Component (either a JS or CSS component), use:
|
199
|
+
|
200
|
+
builder/componentbuild/templates/yui3
|
201
|
+
|
202
|
+
build.xml
|
203
|
+
build.properties
|
204
|
+
|
205
|
+
* A YUI 3 Rollup Component, use:
|
206
|
+
|
207
|
+
builder/componentbuild/templates/yui3/rollup
|
208
|
+
|
209
|
+
For the rollup component:
|
210
|
+
build.xml
|
211
|
+
build.properties
|
212
|
+
|
213
|
+
For the sub components:
|
214
|
+
subcomponentone.xml
|
215
|
+
subcomponentone.properties
|
216
|
+
subcomponenttwo.xml
|
217
|
+
subcomponenttwo.properties
|
218
|
+
|
219
|
+
FURTHER CUSTOMIZATION
|
220
|
+
|
221
|
+
If required, you can define custom values for any of the properties
|
222
|
+
defined in builder/componentbuild/docs/properties.html to customize the
|
223
|
+
build for your new component, however as mentioned above, for most
|
224
|
+
components the properties defined in the template files should be
|
225
|
+
sufficient.
|
226
|
+
|
227
|
+
You can also override or extend existing targets, to customize the actual
|
228
|
+
build process for a component if required. The list of targets and their
|
229
|
+
role is defined in builder/componentbuild/docs/targets.html.
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jscompiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- lib/jscompiler/cli.rb
|
57
57
|
- lib/jscompiler/commands/base.rb
|
58
58
|
- lib/jscompiler/commands/clojure.rb
|
59
|
+
- lib/jscompiler/commands/yahoo.rb
|
59
60
|
- lib/jscompiler/config.rb
|
60
61
|
- lib/jscompiler/version.rb
|
61
62
|
- lib/jscompiler.rb
|
@@ -63,6 +64,9 @@ files:
|
|
63
64
|
- vendor/clojure/compiler.jar
|
64
65
|
- vendor/clojure/COPYING
|
65
66
|
- vendor/clojure/README
|
67
|
+
- vendor/yahoo/LICENSE
|
68
|
+
- vendor/yahoo/README
|
69
|
+
- vendor/yahoo/yuicompressor-2.4.2.jar
|
66
70
|
- LICENSE
|
67
71
|
- README.rdoc
|
68
72
|
homepage: https://github.com/berk/jscompiler
|