Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Side by Side Diff: third_party/WebKit/Source/devtools/scripts/build_release_applications.py

Issue 2336943002: DevTools: Simplify debug and release mode builds (Closed)
Patch Set: fix copyright year Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # -*- coding: UTF-8 -*-
2 # 3 #
3 # Copyright 2014 The Chromium Authors. All rights reserved. 4 # Copyright 2016 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be 5 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file. 6 # found in the LICENSE file.
6 7
7 """ 8 """
8 Release: 9 Builds applications in release mode:
9 - Concatenates autostart modules, application modules' module.json descriptors , 10 - Concatenates autostart modules, application modules' module.json descriptors,
10 and the application loader into a single script. 11 and the application loader into a single script.
11 - Builds app.html referencing the application script. 12 - Builds app.html referencing the application script.
12 Debug:
13 - Copies the module directories into their destinations.
14 - Copies app.html as-is.
15 """ 13 """
16 14
17 from cStringIO import StringIO 15 from cStringIO import StringIO
18 from os import path 16 from os import path
19 from os.path import join 17 from os.path import join
20 from modular_build import read_file, write_file, bail_error 18 from modular_build import read_file, write_file, bail_error
21 import copy 19 import copy
22 import modular_build 20 import modular_build
23 import os 21 import os
24 import re 22 import re
25 import shutil 23 import shutil
26 import sys 24 import sys
27 25
28 try: 26 try:
29 import simplejson as json 27 import simplejson as json
30 except ImportError: 28 except ImportError:
31 import json 29 import json
32 30
33 import rjsmin 31 import rjsmin
34 32
35 33
34 def main(argv):
35 try:
36 input_path_flag_index = argv.index('--input_path')
37 input_path = argv[input_path_flag_index + 1]
38 output_path_flag_index = argv.index('--output_path')
39 output_path = argv[output_path_flag_index + 1]
40 application_names = argv[1:input_path_flag_index]
41 except:
42 print('Usage: %s app_1 app_2 ... app_N --input_path <input_path> --outpu t_path <output_path>' % argv[0])
43 raise
44
45 loader = modular_build.DescriptorLoader(input_path)
46 for app in application_names:
47 descriptors = loader.load_application(app + '.json')
48 builder = ReleaseBuilder(app, descriptors, input_path, output_path)
49 builder.build_app()
50
51
36 def resource_source_url(url): 52 def resource_source_url(url):
37 return '\n/*# sourceURL=' + url + ' */' 53 return '\n/*# sourceURL=' + url + ' */'
38 54
39 55
40 def minify_js(javascript): 56 def minify_js(javascript):
41 return rjsmin.jsmin(javascript) 57 return rjsmin.jsmin(javascript)
42 58
43 59
44 def concatenated_module_filename(module_name, output_dir): 60 def concatenated_module_filename(module_name, output_dir):
45 return join(output_dir, module_name + '/' + module_name + '_module.js') 61 return join(output_dir, module_name + '/' + module_name + '_module.js')
(...skipping 14 matching lines...) Expand all
60 for src_dir, dirs, files in os.walk(src): 76 for src_dir, dirs, files in os.walk(src):
61 subpath = path.relpath(src_dir, src) 77 subpath = path.relpath(src_dir, src)
62 dest_dir = path.normpath(join(dest, subpath)) 78 dest_dir = path.normpath(join(dest, subpath))
63 os.mkdir(dest_dir) 79 os.mkdir(dest_dir)
64 for name in files: 80 for name in files:
65 src_name = join(os.getcwd(), src_dir, name) 81 src_name = join(os.getcwd(), src_dir, name)
66 dest_name = join(dest_dir, name) 82 dest_name = join(dest_dir, name)
67 symlink_or_copy_file(src_name, dest_name) 83 symlink_or_copy_file(src_name, dest_name)
68 84
69 85
70 class AppBuilder: 86 # Outputs:
87 # <app_name>.html
88 # <app_name>.js
89 # <module_name>_module.js
90 class ReleaseBuilder(object):
71 def __init__(self, application_name, descriptors, application_dir, output_di r): 91 def __init__(self, application_name, descriptors, application_dir, output_di r):
72 self.application_name = application_name 92 self.application_name = application_name
73 self.descriptors = descriptors 93 self.descriptors = descriptors
74 self.application_dir = application_dir 94 self.application_dir = application_dir
75 self.output_dir = output_dir 95 self.output_dir = output_dir
76 96
77 def app_file(self, extension): 97 def app_file(self, extension):
78 return self.application_name + '.' + extension 98 return self.application_name + '.' + extension
79 99
80 def core_resource_names(self): 100 def core_resource_names(self):
81 result = [] 101 result = []
82 for module in self.descriptors.sorted_modules(): 102 for module in self.descriptors.sorted_modules():
83 if self.descriptors.application[module].get('type') != 'autostart': 103 if self.descriptors.application[module].get('type') != 'autostart':
84 continue 104 continue
85 105
86 resources = self.descriptors.modules[module].get('resources') 106 resources = self.descriptors.modules[module].get('resources')
87 if not resources: 107 if not resources:
88 continue 108 continue
89 for resource_name in resources: 109 for resource_name in resources:
90 result.append(path.join(module, resource_name)) 110 result.append(path.join(module, resource_name))
91 return result 111 return result
92 112
93
94 # Outputs:
95 # <app_name>.html
96 # <app_name>.js
97 # <module_name>_module.js
98 class ReleaseBuilder(AppBuilder):
99 def __init__(self, application_name, descriptors, application_dir, output_di r):
100 AppBuilder.__init__(self, application_name, descriptors, application_dir , output_dir)
101
102 def build_app(self): 113 def build_app(self):
103 if self.descriptors.has_html: 114 if self.descriptors.has_html:
104 self._build_html() 115 self._build_html()
105 self._build_app_script() 116 self._build_app_script()
106 for module in filter(lambda desc: (not desc.get('type') or desc.get('typ e') == 'remote'), self.descriptors.application.values()): 117 for module in filter(lambda desc: (not desc.get('type') or desc.get('typ e') == 'remote'), self.descriptors.application.values()):
107 self._concatenate_dynamic_module(module['name']) 118 self._concatenate_dynamic_module(module['name'])
108 119
109 def _build_html(self): 120 def _build_html(self):
110 html_name = self.app_file('html') 121 html_name = self.app_file('html')
111 output = StringIO() 122 output = StringIO()
112 with open(join(self.application_dir, html_name), 'r') as app_input_html: 123 with open(join(self.application_dir, html_name), 'r') as app_input_html:
113 for line in app_input_html: 124 for line in app_input_html:
114 if '<script ' in line or '<link ' in line: 125 if '<script ' in line or '<link ' in line:
115 continue 126 continue
116 if '</head>' in line: 127 if '</head>' in line:
117 output.write(self._generate_include_tag(self.app_file('js')) ) 128 output.write(self._generate_include_tag(self.app_file('js')) )
118 output.write(line) 129 output.write(line)
119 130
120 write_file(join(self.output_dir, html_name), output.getvalue()) 131 write_file(join(self.output_dir, html_name), output.getvalue())
121 output.close() 132 output.close()
122 133
123 def _build_app_script(self): 134 def _build_app_script(self):
124 script_name = self.app_file('js') 135 script_name = self.app_file('js')
125 output = StringIO() 136 output = StringIO()
126 self._concatenate_application_script(output) 137 self._concatenate_application_script(output)
127 write_file(join(self.output_dir, script_name), minify_js(output.getvalue ())) 138 write_file(join(self.output_dir, script_name), minify_js(output.getvalue ()))
128 output.close() 139 output.close()
129 140
130 def _generate_include_tag(self, resource_path): 141 def _generate_include_tag(self, resource_path):
131 if (resource_path.endswith('.js')): 142 if resource_path.endswith('.js'):
132 return ' <script type="text/javascript" src="%s"></script>\n' % r esource_path 143 return ' <script type="text/javascript" src="%s"></script>\n' % r esource_path
133 else: 144 else:
134 assert resource_path 145 assert resource_path
135 146
136 def _release_module_descriptors(self): 147 def _release_module_descriptors(self):
137 module_descriptors = self.descriptors.modules 148 module_descriptors = self.descriptors.modules
138 result = [] 149 result = []
139 for name in module_descriptors: 150 for name in module_descriptors:
140 module = copy.copy(module_descriptors[name]) 151 module = copy.copy(module_descriptors[name])
141 module_type = self.descriptors.application[name].get('type') 152 module_type = self.descriptors.application[name].get('type')
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 output = StringIO() 217 output = StringIO()
207 if scripts: 218 if scripts:
208 modular_build.concatenate_scripts(scripts, module_dir, self.output_d ir, output) 219 modular_build.concatenate_scripts(scripts, module_dir, self.output_d ir, output)
209 if resources: 220 if resources:
210 self._write_module_resources(resources, output) 221 self._write_module_resources(resources, output)
211 output_file_path = concatenated_module_filename(module_name, self.output _dir) 222 output_file_path = concatenated_module_filename(module_name, self.output _dir)
212 write_file(output_file_path, minify_js(output.getvalue())) 223 write_file(output_file_path, minify_js(output.getvalue()))
213 output.close() 224 output.close()
214 225
215 226
216 # Outputs: 227 if __name__ == '__main__':
217 # <app_name>.html as-is 228 sys.exit(main(sys.argv))
218 # <app_name>.js as-is
219 # <module_name>/<all_files>
220 class DebugBuilder(AppBuilder):
221 def __init__(self, application_name, descriptors, application_dir, output_di r):
222 AppBuilder.__init__(self, application_name, descriptors, application_dir , output_dir)
223
224 def build_app(self):
225 if self.descriptors.has_html:
226 self._build_html()
227 js_name = self.app_file('js')
228 src_name = join(os.getcwd(), self.application_dir, js_name)
229 symlink_or_copy_file(src_name, join(self.output_dir, js_name), True)
230 for module_name in self.descriptors.modules:
231 module = self.descriptors.modules[module_name]
232 input_module_dir = join(self.application_dir, module_name)
233 output_module_dir = join(self.output_dir, module_name)
234 symlink_or_copy_dir(input_module_dir, output_module_dir)
235
236 def _build_html(self):
237 html_name = self.app_file('html')
238 symlink_or_copy_file(join(os.getcwd(), self.application_dir, html_name), join(self.output_dir, html_name), True)
239
240
241 def build_application(application_name, loader, application_dir, output_dir, rel ease_mode):
242 descriptors = loader.load_application(application_name + '.json')
243 if release_mode:
244 builder = ReleaseBuilder(application_name, descriptors, application_dir, output_dir)
245 else:
246 builder = DebugBuilder(application_name, descriptors, application_dir, o utput_dir)
247 builder.build_app()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698