gulpfile.vscode.js 15.0 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 80 81 82 83 84 85 86 87 88 89
	'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'));
gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-plugins'], common.optimizeTask({
	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 297 298 299 300 301 302 303 304 305
		var all = es.merge(control, desktop, icon, shortcut, code);

		// 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);
		}

		return all
J
Joao Moreno 已提交
306
			.pipe(symdest(destination));
307 308 309 310
	};
}

function buildDebPackage(arch) {
311 312
	var debArch = getDebPackageArch(arch);
	return shell.task([
D
Daniel Imms 已提交
313 314 315
		'fakeroot dpkg-deb -b ' + debArch + '/vscode-' + debArch,
		'dpkg-scanpackages ' + debArch + ' /dev/null > ' + debArch + '/Packages'
	], { cwd: '.build/linux'});
316 317
}

I
isidor 已提交
318 319 320 321
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')));
322
gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(path.dirname(root), 'VSCode-linux-arm')));
D
Daniel Imms 已提交
323 324
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 已提交
325

J
typo  
João Moreno 已提交
326
gulp.task('vscode-win32', [/*'optimize-vscode', */'clean-vscode-win32'], packageTask('win32'));
J
oops  
Joao Moreno 已提交
327
gulp.task('vscode-darwin', ['optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin'));
I
isidor 已提交
328 329
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'));
330
gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm'));
I
isidor 已提交
331 332 333 334 335

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 }));
336
gulp.task('vscode-linux-arm-min', ['minify-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm', { minified: true }));
I
isidor 已提交
337

J
Joao Moreno 已提交
338 339
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'));
340 341 342
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 已提交
343 344
// Sourcemaps

J
Joao Moreno 已提交
345
gulp.task('upload-vscode-sourcemaps', ['minify-vscode'], function () {
I
isidor 已提交
346 347 348 349 350 351 352
	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 + '/'
		}));
353
});