gulpfile.vscode.js 15.4 KB
Newer Older
I
isidor 已提交
1 2 3 4 5
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

J
Joao Moreno 已提交
6
/*global process,__dirname,Buffer,require*/
I
isidor 已提交
7 8 9 10 11 12 13 14 15

var gulp = require('gulp');
var fs = require('fs');
var path = require('path');
var es = require('event-stream');
var azure = require('gulp-azure-storage');
var electron = require('gulp-atom-electron');
var symdest = require('gulp-symdest');
var rename = require('gulp-rename');
16
var replace = require('gulp-replace');
I
isidor 已提交
17 18 19
var filter = require('gulp-filter');
var json = require('gulp-json-editor');
var remote = require('gulp-remote-src');
20
var shell = require("gulp-shell");
I
isidor 已提交
21
var _ = require('underscore');
J
Joao Moreno 已提交
22
var packageJson = require('../package.json');
I
isidor 已提交
23 24 25 26
var util = require('./lib/util');
var buildfile = require('../src/buildfile');
var common = require('./gulpfile.common');
var root = path.dirname(__dirname);
J
Joao Moreno 已提交
27
var build = path.join(root, '.build');
J
Joao Moreno 已提交
28
var commit = util.getVersion(root);
I
isidor 已提交
29 30

var baseModules = [
B
Benjamin Pasero 已提交
31
	'applicationinsights', 'assert', 'child_process', 'chokidar', 'crypto', 'emmet',
I
isidor 已提交
32
	'events', 'fs', 'getmac', 'glob', 'graceful-fs', 'http', 'http-proxy-agent',
B
Benjamin Pasero 已提交
33
	'https', 'https-proxy-agent', 'iconv-lite', 'electron', 'net',
B
Benjamin Pasero 已提交
34
	'os', 'path', 'readline', 'sax', 'semver', 'stream', 'string_decoder', 'url',
J
Joao Moreno 已提交
35
	'vscode-textmate', 'winreg', 'yauzl', 'native-keymap', 'weak', 'zlib'
I
isidor 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48
];

// Build

var vscodeEntryPoints = _.flatten([
	buildfile.entrypoint('vs/workbench/workbench.main'),
	buildfile.base,
	buildfile.editor,
	buildfile.languages,
	buildfile.vscode
]);

var vscodeResources = [
J
Joao Moreno 已提交
49
	'out-build/main.js',
J
Joao Moreno 已提交
50
	'out-build/cli.js',
I
isidor 已提交
51
	'out-build/bootstrap.js',
J
Joao Moreno 已提交
52
	'out-build/bootstrap-amd.js',
I
isidor 已提交
53 54 55 56
	'out-build/vs/**/*.{svg,png,cur}',
	'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh}',
	'out-build/vs/base/worker/workerMainCompatibility.html',
	'out-build/vs/base/worker/workerMain.{js,js.map}',
57
	'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
I
isidor 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	'out-build/vs/editor/css/*.css',
	'out-build/vs/languages/markdown/common/*.css',
	'out-build/vs/workbench/browser/media/*-theme.css',
	'out-build/vs/workbench/electron-browser/index.html',
	'out-build/vs/workbench/parts/debug/**/*.json',
	'out-build/vs/workbench/parts/execution/**/*.scpt',
	'out-build/vs/workbench/parts/git/**/*.html',
	'out-build/vs/workbench/parts/git/**/*.sh',
	'out-build/vs/workbench/parts/markdown/**/*.md',
	'out-build/vs/workbench/parts/tasks/**/*.json',
	'out-build/vs/workbench/services/files/**/*.exe',
	'out-build/vs/workbench/services/files/**/*.md',
	'!**/test/**'
];

var BUNDLED_FILE_HEADER = [
	'/*!--------------------------------------------------------',
	' * Copyright (C) Microsoft Corporation. All rights reserved.',
	' *--------------------------------------------------------*/'
].join('\n');

gulp.task('clean-optimized-vscode', util.rimraf('out-vscode'));
A
Alex Dima 已提交
80
gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions'], common.optimizeTask({
I
isidor 已提交
81 82 83 84 85 86 87 88 89
	entryPoints: vscodeEntryPoints,
	otherSources: [],
	resources: vscodeResources,
	loaderConfig: common.loaderConfig(baseModules),
	header: BUNDLED_FILE_HEADER,
	out: 'out-vscode'
}));

gulp.task('clean-minified-vscode', util.rimraf('out-vscode-min'));
J
Joao Moreno 已提交
90
gulp.task('minify-vscode', ['clean-minified-vscode', 'optimize-vscode'], common.minifyTask('out-vscode', true));
I
isidor 已提交
91 92

// Package
J
Joao Moreno 已提交
93
var product = require('../product.json');
I
isidor 已提交
94 95 96
var darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8'));

var config = {
J
Joao Moreno 已提交
97
	version: packageJson.electronVersion,
I
isidor 已提交
98
	productAppName: product.nameLong,
J
Joao Moreno 已提交
99 100 101
	companyName: 'Microsoft Corporation',
	copyright: 'Copyright (C) 2015 Microsoft. All rights reserved',
	darwinIcon: 'resources/darwin/code.icns',
I
isidor 已提交
102
	darwinBundleIdentifier: product.darwinBundleIdentifier,
J
Joao Moreno 已提交
103 104 105 106 107 108 109 110
	darwinApplicationCategoryType: 'public.app-category.developer-tools',
	darwinBundleDocumentTypes: [{
		name: product.nameLong + ' document',
		role: 'Editor',
		ostypes: ["TEXT", "utxt", "TUTX", "****"],
		extensions: ["ascx", "asp", "aspx", "bash", "bash_login", "bash_logout", "bash_profile", "bashrc", "bat", "bowerrc", "c", "cc", "clj", "cljs", "cljx", "clojure", "cmd", "coffee", "config", "cpp", "cs", "cshtml", "csproj", "css", "csx", "ctp", "cxx", "dockerfile", "dot", "dtd", "editorconfig", "edn", "eyaml", "eyml", "fs", "fsi", "fsscript", "fsx", "gemspec", "gitattributes", "gitconfig", "gitignore", "go", "h", "handlebars", "hbs", "hh", "hpp", "htm", "html", "hxx", "ini", "jade", "jav", "java", "js", "jscsrc", "jshintrc", "jshtm", "json", "jsp", "less", "lua", "m", "makefile", "markdown", "md", "mdoc", "mdown", "mdtext", "mdtxt", "mdwn", "mkd", "mkdn", "ml", "mli", "nqp", "p6", "php", "phtml", "pl", "pl6", "pm", "pm6", "pod", "pp", "profile", "properties", "ps1", "psd1", "psgi", "psm1", "py", "r", "rb", "rhistory", "rprofile", "rs", "rt", "scss", "sh", "shtml", "sql", "svg", "svgz", "t", "ts", "txt", "vb", "wxi", "wxl", "wxs", "xaml", "xml", "yaml", "yml", "zsh"],
		iconFile: 'resources/darwin/code_file.icns'
	}],
I
isidor 已提交
111
	darwinCredits: darwinCreditsTemplate ? new Buffer(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : void 0,
112
	linuxExecutableName: product.applicationName,
J
Joao Moreno 已提交
113
	winIcon: 'resources/win32/code.ico',
I
isidor 已提交
114 115 116 117 118
	token: process.env['GITHUB_TOKEN'] || void 0
};

gulp.task('electron', function () {
	// Force windows to use ia32
J
Joao Moreno 已提交
119
	var arch = process.env.VSCODE_ELECTRON_PLATFORM || (process.platform === 'win32' ? 'ia32' : process.arch);
J
Joao Moreno 已提交
120
	return electron.dest(path.join(build, 'electron'), _.extend({}, config, { arch: arch }));
I
isidor 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
});

function mixinProduct() {
	var product;
	var url = process.env['PRODUCT_JSON_URL'];

	if (url) {
		var opts = { base: '' };
		var username = process.env['PRODUCT_JSON_USERNAME'];
		var password = process.env['PRODUCT_JSON_PASSWORD'];

		if (username || password) {
			opts.auth = { username: username || '', password: password || '' };
		}

		product = remote(url, opts);
	} else {
		product = gulp.src(['product.json'], { base: '.' });
	}

	return product.pipe(json({
		commit: commit,
		date: new Date().toISOString()
	}));
}

function packageTask(platform, arch, opts) {
	opts = opts || {};

	var destination = path.join(path.dirname(root), 'VSCode') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
	platform = platform || process.platform;
	arch = platform === 'win32' ? 'ia32' : arch;

	return function () {
		var out = opts.minified ? 'out-vscode-min' : 'out-vscode';

		var src = gulp.src(out + '/**', { base: '.' })
			.pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + out), 'out'); }))
			.pipe(util.setExecutableBit(['**/*.sh']));

		var extensions = gulp.src([
			'extensions/**',
			'!extensions/*/src/**',
			'!extensions/*/out/**/test/**',
165
			'!extensions/typescript/bin/**',
166 167 168 169 170 171
			'!extensions/vscode-api-tests/**',
			'!extensions/json/server/.vscode/**',
			'!extensions/json/server/src/**',
			'!extensions/json/server/out/**/test/**',
			'!extensions/json/server/test/**',
			'!extensions/json/server/typings/**',
172 173
			'!extensions/json/server/node_modules/typescript/**',
			'!extensions/json/server/node_modules/mocha/**'
I
isidor 已提交
174 175
		], { base: '.' });

J
Joao Moreno 已提交
176 177 178
		var sources = es.merge(src, extensions)
			.pipe(filter(['**', '!**/*.js.map']))
			.pipe(util.handleAzureJson({ platform: platform }));
I
isidor 已提交
179

J
Joao Moreno 已提交
180 181 182 183 184 185 186 187 188 189 190
		var version = packageJson.version;
		var quality = product.quality;

		if (quality && quality !== 'stable') {
			version += '-' + quality;
		}

		var packageJsonStream = gulp.src(['package.json'], { base: '.' }).pipe(json({
			name: product.nameShort,
			version: version
		}));
I
isidor 已提交
191 192 193 194

		var license = gulp.src(['Credits_*', 'LICENSE.txt', 'ThirdPartyNotices.txt'], { base: '.' });
		var api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts'));

J
Joao Moreno 已提交
195
		var depsSrc = _.flatten(Object.keys(packageJson.dependencies).concat(Object.keys(packageJson.optionalDependencies))
J
Joao Moreno 已提交
196 197
			.map(function (d) { return ['node_modules/' + d + '/**', '!node_modules/' + d + '/**/{test,tests}/**']; })
		);
I
isidor 已提交
198 199 200

		var deps = gulp.src(depsSrc, { base: '.', dot: true })
			.pipe(util.cleanNodeModule('fsevents', ['binding.gyp', 'fsevents.cc', 'build/**', 'src/**', 'test/**'], true))
201
			.pipe(util.cleanNodeModule('oniguruma', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], true))
202
			.pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], true))
J
Joao Moreno 已提交
203 204
			.pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], true))
			.pipe(util.cleanNodeModule('weak', ['binding.gyp', 'build/**', 'src/**'], true));
I
isidor 已提交
205 206 207

		var all = es.merge(
			api,
J
Joao Moreno 已提交
208
			packageJsonStream,
I
isidor 已提交
209 210 211
			mixinProduct(),
			license,
			sources,
J
Joao Moreno 已提交
212
			deps
J
Joao Moreno 已提交
213 214 215 216 217 218
		);

		if (platform === 'win32') {
			all = es.merge(all, gulp.src('resources/win32/code_file.ico', { base: '.' }));
		} else if (platform === 'linux') {
			all = es.merge(all, gulp.src('resources/linux/code.png', { base: '.' }));
J
Joao Moreno 已提交
219 220 221 222 223
		} else if (platform === 'darwin') {
			var shortcut = gulp.src('resources/darwin/bin/code.sh')
				.pipe(rename('bin/code'));

			all = es.merge(all, shortcut);
J
Joao Moreno 已提交
224
		}
I
isidor 已提交
225 226

		var result = all
J
Joao Moreno 已提交
227
			.pipe(util.skipDirectories())
I
isidor 已提交
228 229
			.pipe(util.fixWin32DirectoryPermissions())
			.pipe(electron(_.extend({}, config, { platform: platform, arch: arch })))
230
			.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
I
isidor 已提交
231 232

		if (platform === 'win32') {
J
typo  
João Moreno 已提交
233
			result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32' }));
J
Joao Moreno 已提交
234

J
typo  
João Moreno 已提交
235
			result = es.merge(result, gulp.src('resources/win32/bin/code.cmd', { base: 'resources/win32' })
J
Joao Moreno 已提交
236
				.pipe(replace('@@NAME@@', product.nameShort))
J
Joao Moreno 已提交
237 238
				.pipe(rename(function (f) { f.basename = product.applicationName; })));

J
typo  
João Moreno 已提交
239
			result = es.merge(result, gulp.src('resources/win32/bin/code.sh', { base: 'resources/win32' })
J
Joao Moreno 已提交
240 241
				.pipe(replace('@@NAME@@', product.nameShort))
				.pipe(rename(function (f) { f.basename = product.applicationName; f.extname = ''; })));
I
isidor 已提交
242 243
		}

J
Joao Moreno 已提交
244
		return result.pipe(symdest(destination));
I
isidor 已提交
245 246 247
	};
}

248
function getDebPackageArch(arch) {
J
Joao Moreno 已提交
249
	return { x64: 'amd64', ia32: 'i386' }[arch];
250 251
}

252 253 254 255
function getEpochTime() {
	return Math.floor(new Date().getTime() / 1000);
}

256 257 258
function prepareDebPackage(arch) {
	var binaryDir = '../VSCode-linux-' + arch;
	var debArch = getDebPackageArch(arch);
259
	var destination = '.build/linux/' + debArch + '/vscode-' + debArch;
260
	var packageRevision = getEpochTime();
261 262

	return function () {
J
Joao Moreno 已提交
263
		var shortcut = gulp.src('resources/linux/bin/code.sh')
264
			.pipe(replace('@@NAME@@', product.applicationName))
J
Joao Moreno 已提交
265
			.pipe(rename('usr/bin/' + product.applicationName));
266

J
Joao Moreno 已提交
267
		var desktop = gulp.src('resources/linux/debian/code.desktop')
J
Joao Moreno 已提交
268 269
			.pipe(replace('@@NAME_LONG@@', product.nameLong))
			.pipe(replace('@@NAME@@', product.applicationName))
D
Daniel Imms 已提交
270
			.pipe(rename('usr/share/applications/' + product.applicationName + '.desktop'));
271

J
Joao Moreno 已提交
272
		var icon = gulp.src('resources/linux/code.png')
J
Joao Moreno 已提交
273
			.pipe(rename('usr/share/pixmaps/' + product.applicationName + '.png'));
274

J
Joao Moreno 已提交
275
		var code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
276
			.pipe(rename(function (p) { p.dirname = 'usr/share/' + product.applicationName + '/' + p.dirname; }));
J
Joao Moreno 已提交
277 278 279 280 281 282 283

		var size = 0;
		var control = code.pipe(es.through(
			function (f) { size += f.isDirectory() ? 4096 : f.contents.length; },
			function () {
				var that = this;
				gulp.src('resources/linux/debian/control.template', { base: '.' })
J
Joao Moreno 已提交
284
					.pipe(replace('@@NAME@@', product.applicationName))
J
Joao Moreno 已提交
285 286 287
					.pipe(replace('@@VERSION@@', packageJson.version + '-' + packageRevision))
					.pipe(replace('@@ARCHITECTURE@@', debArch))
					.pipe(replace('@@INSTALLEDSIZE@@', Math.ceil(size / 1024)))
J
Joao Moreno 已提交
288
					.pipe(rename('DEBIAN/control'))
J
Joao Moreno 已提交
289
					.pipe(es.through(function (f) { that.emit('data', f); }, function () { that.emit('end'); }));
290 291
			}));

292 293 294 295 296
		var prerm = gulp.src('resources/linux/debian/prerm.template', { base: '.' })
			.pipe(replace('@@NAME@@', product.applicationName))
			.pipe(rename('DEBIAN/prerm'))

		var all = es.merge(control, prerm, desktop, icon, shortcut, code);
297 298 299 300 301 302 303 304 305 306

		// Register an apt repository if this is an official build
		if (product.updateUrl && product.quality) {
			var postinst = gulp.src('resources/linux/debian/postinst.template', { base: '.' })
				.pipe(replace('@@NAME@@', product.applicationName))
				.pipe(replace('@@UPDATEURL@@', product.updateUrl))
				.pipe(replace('@@QUALITY@@', product.quality))
				.pipe(replace('@@ARCHITECTURE@@', debArch))
				.pipe(rename('DEBIAN/postinst'))
			all = es.merge(all, postinst);
307 308 309 310 311
		} else {
			var postinst = gulp.src('resources/linux/debian/postinst.oss.template', { base: '.' })
				.pipe(replace('@@NAME@@', product.applicationName))
				.pipe(rename('DEBIAN/postinst'))
			all = es.merge(all, postinst);
312 313 314
		}

		return all
J
Joao Moreno 已提交
315
			.pipe(symdest(destination));
316 317 318 319
	};
}

function buildDebPackage(arch) {
320 321
	var debArch = getDebPackageArch(arch);
	return shell.task([
322 323 324 325
		'mkdir -p deb',
		'fakeroot dpkg-deb -b vscode-' + debArch + ' deb/vscode-amd64.deb',
		'dpkg-scanpackages deb /dev/null > Packages'
	], { cwd: '.build/linux/' + debArch});
326 327
}

I
isidor 已提交
328 329 330 331
gulp.task('clean-vscode-win32', util.rimraf(path.join(path.dirname(root), 'VSCode-win32')));
gulp.task('clean-vscode-darwin', util.rimraf(path.join(path.dirname(root), 'VSCode-darwin')));
gulp.task('clean-vscode-linux-ia32', util.rimraf(path.join(path.dirname(root), 'VSCode-linux-ia32')));
gulp.task('clean-vscode-linux-x64', util.rimraf(path.join(path.dirname(root), 'VSCode-linux-x64')));
332
gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(path.dirname(root), 'VSCode-linux-arm')));
D
Daniel Imms 已提交
333 334
gulp.task('clean-vscode-linux-ia32-deb', util.rimraf('.build/linux/i386'));
gulp.task('clean-vscode-linux-x64-deb', util.rimraf('.build/linux/amd64'));
I
isidor 已提交
335

J
typo  
João Moreno 已提交
336
gulp.task('vscode-win32', [/*'optimize-vscode', */'clean-vscode-win32'], packageTask('win32'));
J
oops  
Joao Moreno 已提交
337
gulp.task('vscode-darwin', ['optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin'));
I
isidor 已提交
338 339
gulp.task('vscode-linux-ia32', ['optimize-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32'));
gulp.task('vscode-linux-x64', ['optimize-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64'));
340
gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm'));
I
isidor 已提交
341 342 343 344 345

gulp.task('vscode-win32-min', ['minify-vscode', 'clean-vscode-win32'], packageTask('win32', null, { minified: true }));
gulp.task('vscode-darwin-min', ['minify-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { minified: true }));
gulp.task('vscode-linux-ia32-min', ['minify-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32', { minified: true }));
gulp.task('vscode-linux-x64-min', ['minify-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64', { minified: true }));
346
gulp.task('vscode-linux-arm-min', ['minify-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm', { minified: true }));
I
isidor 已提交
347

J
Joao Moreno 已提交
348 349
gulp.task('vscode-linux-ia32-prepare-deb', ['clean-vscode-linux-ia32-deb', 'vscode-linux-ia32-min'], prepareDebPackage('ia32'));
gulp.task('vscode-linux-x64-prepare-deb', ['clean-vscode-linux-x64-deb', 'vscode-linux-x64-min'], prepareDebPackage('x64'));
350 351 352
gulp.task('vscode-linux-ia32-build-deb', ['vscode-linux-ia32-prepare-deb'], buildDebPackage('ia32'));
gulp.task('vscode-linux-x64-build-deb', ['vscode-linux-x64-prepare-deb'], buildDebPackage('x64'));

I
isidor 已提交
353 354
// Sourcemaps

J
Joao Moreno 已提交
355
gulp.task('upload-vscode-sourcemaps', ['minify-vscode'], function () {
I
isidor 已提交
356 357 358 359 360 361 362
	return gulp.src('out-vscode-min/**/*.map')
		.pipe(azure.upload({
			account: process.env.AZURE_STORAGE_ACCOUNT,
			key: process.env.AZURE_STORAGE_ACCESS_KEY,
			container: 'sourcemaps',
			prefix: commit + '/'
		}));
363
});