Fixes #27738: Defer switching to Tasks 2.0.0 as the default

This commit is contained in:
Dirk Baeumer 2017-05-31 16:18:42 +02:00
parent 6ba48011f5
commit e98c09c842
12 changed files with 626 additions and 342 deletions

View file

@ -7,6 +7,7 @@
"engines": {
"vscode": "*"
},
"enableProposedApi": true,
"categories": [
"Other"
],

View file

@ -7,6 +7,7 @@
"engines": {
"vscode": "*"
},
"enableProposedApi": true,
"categories": [
"Other"
],

View file

@ -7,6 +7,7 @@
"engines": {
"vscode": "*"
},
"enableProposedApi": true,
"categories": [
"Other"
],

View file

@ -10,6 +10,7 @@
"engines": {
"vscode": "*"
},
"enableProposedApi": true,
"dependencies": {
"semver": "4.3.6",
"vscode-extension-telemetry": "^0.0.7",

View file

@ -4,4 +4,5 @@
*--------------------------------------------------------------------------------------------*/
/// <reference path='../../../../src/vs/vscode.d.ts'/>
/// <reference path='../../../../src/vs/vscode.proposed.d.ts'/>
/// <reference types='@types/node'/>

329
src/vs/vscode.d.ts vendored
View file

@ -3537,335 +3537,6 @@ declare module 'vscode' {
update(key: string, value: any): Thenable<void>;
}
/**
* Controls the behaviour of the terminal's visibility.
*/
export enum TaskRevealKind {
/**
* Always brings the terminal to front if the task is executed.
*/
Always = 1,
/**
* Only brings the terminal to front if a problem is detected executing the task
* (e.g. the task couldn't be started because).
*/
Silent = 2,
/**
* The terminal never comes to front when the task is executed.
*/
Never = 3
}
/**
* Controls terminal specific behavior.
*/
export interface TaskTerminalBehavior {
/**
* Controls whether the terminal executing a task is brought to front or not.
* Defaults to `RevealKind.Always`.
*/
reveal?: TaskRevealKind;
/**
* Controls whether the command is echoed in the terminal or not.
*/
echo?: boolean;
}
export interface ProcessTaskOptions {
/**
* The current working directory of the executed program or shell.
* If omitted the tools current workspace root is used.
*/
cwd?: string;
/**
* The additional environment of the executed program or shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env?: { [key: string]: string };
}
export namespace TaskGroup {
/**
* The clean task group
*/
export const Clean: 'clean';
/**
* The build task group. If a task is part of the build task group
* it can be executed via the run build short cut.
*/
export const Build: 'build';
/**
* The rebuild all task group
*/
export const RebuildAll: 'rebuildAll';
/**
* The test task group. If a task is part of the test task group
* it can be executed via the run test short cut.
*/
export const Test: 'test';
}
/**
* A task that starts an external process.
*/
export class ProcessTask {
/**
* Creates a process task.
*
* @param name the task's name. Is presented in the user interface.
* @param process the process to start.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, process: string, problemMatchers?: string | string[]);
/**
* Creates a process task.
*
* @param name the task's name. Is presented in the user interface.
* @param process the process to start.
* @param args arguments to be passed to the process.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, process: string, args: string[], problemMatchers?: string | string[]);
/**
* Creates a process task.
*
* @param name the task's name. Is presented in the user interface.
* @param process the process to start.
* @param args arguments to be passed to the process.
* @param options additional options for the started process.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, process: string, args: string[], options: ProcessTaskOptions, problemMatchers?: string | string[]);
/**
* The task's name
*/
readonly name: string;
/**
* The task's identifier. If omitted the internal identifier will
* be `${extensionName}:${name}`
*/
identifier: string | undefined;
/**
* Whether the task is a background task or not.
*/
isBackground: boolean;
/**
* The process to be executed.
*/
readonly process: string;
/**
* The arguments passed to the process. Defaults to an empty array.
*/
args: string[];
/**
* A human-readable string describing the source of this
* shell task, e.g. 'gulp' or 'npm'.
*/
source: string | undefined;
/**
* The task group this tasks belongs to. See TaskGroup
* for a predefined set of available groups.
* Defaults to undefined meaning that the task doesn't
* belong to any special group.
*/
group: string | undefined;
/**
* The process options used when the process is executed.
* Defaults to an empty object literal.
*/
options: ProcessTaskOptions;
/**
* The terminal behavior. Defaults to an empty object literal.
*/
terminalBehavior: TaskTerminalBehavior;
/**
* The problem matchers attached to the task. Defaults to an empty
* array.
*/
problemMatchers: string[];
}
export type ShellTaskOptions = {
/**
* The shell executable.
*/
executable: string;
/**
* The arguments to be passed to the shell executable used to run the task.
*/
shellArgs?: string[];
/**
* The current working directory of the executed shell.
* If omitted the tools current workspace root is used.
*/
cwd?: string;
/**
* The additional environment of the executed shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env?: { [key: string]: string };
} | {
/**
* The current working directory of the executed shell.
* If omitted the tools current workspace root is used.
*/
cwd: string;
/**
* The additional environment of the executed shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env?: { [key: string]: string };
} | {
/**
* The current working directory of the executed shell.
* If omitted the tools current workspace root is used.
*/
cwd?: string;
/**
* The additional environment of the executed shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env: { [key: string]: string };
};
/**
* A task that executes a shell command.
*/
export class ShellTask {
/**
* Creates a shell task.
*
* @param name the task's name. Is presented in the user interface.
* @param commandLine the command line to execute.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, commandLine: string, problemMatchers?: string | string[]);
/**
* Creates a shell task.
*
* @param name the task's name. Is presented in the user interface.
* @param commandLine the command line to execute.
* @param options additional options used when creating the shell.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, commandLine: string, options: ShellTaskOptions, problemMatchers?: string | string[]);
/**
* The task's name
*/
readonly name: string;
/**
* The task's identifier. If omitted the internal identifier will
* be `${extensionName}:${name}`
*/
identifier: string | undefined;
/**
* Whether the task is a background task or not.
*/
isBackground: boolean;
/**
* The command line to execute.
*/
readonly commandLine: string;
/**
* A human-readable string describing the source of this
* shell task, e.g. 'gulp' or 'npm'.
*/
source: string | undefined;
/**
* The task group this tasks belongs to. See TaskGroup
* for a predefined set of available groups.
* Defaults to undefined meaning that the task doesn't
* belong to any special group.
*/
group: string | undefined;
/**
* The shell options used when the shell is executed. Defaults to an
* empty object literal.
*/
options: ShellTaskOptions;
/**
* The terminal behavior. Defaults to an empty object literal.
*/
terminalBehavior: TaskTerminalBehavior;
/**
* The problem matchers attached to the task. Defaults to an empty
* array.
*/
problemMatchers: string[];
}
export type Task = ProcessTask | ShellTask;
/**
* A task provider allows to add tasks to the task service.
* A task provider is registerd via #workspace.registerTaskProvider.
*/
export interface TaskProvider {
/**
* Provides additional tasks.
* @param token A cancellation token.
* @return a #TaskSet
*/
provideTasks(token: CancellationToken): ProviderResult<Task[]>;
}
export namespace workspace {
/**
* Register a task provider.
*
* @param provider A task provider.
* @return A [disposable](#Disposable) that unregisters this provider when being disposed.
*/
export function registerTaskProvider(provider: TaskProvider): Disposable;
}
/**
* Namespace describing the environment the editor runs in.
*/

View file

@ -7,6 +7,335 @@
declare module 'vscode' {
/**
* Controls the behaviour of the terminal's visibility.
*/
export enum TaskRevealKind {
/**
* Always brings the terminal to front if the task is executed.
*/
Always = 1,
/**
* Only brings the terminal to front if a problem is detected executing the task
* (e.g. the task couldn't be started because).
*/
Silent = 2,
/**
* The terminal never comes to front when the task is executed.
*/
Never = 3
}
/**
* Controls terminal specific behavior.
*/
export interface TaskTerminalBehavior {
/**
* Controls whether the terminal executing a task is brought to front or not.
* Defaults to `RevealKind.Always`.
*/
reveal?: TaskRevealKind;
/**
* Controls whether the command is echoed in the terminal or not.
*/
echo?: boolean;
}
export interface ProcessTaskOptions {
/**
* The current working directory of the executed program or shell.
* If omitted the tools current workspace root is used.
*/
cwd?: string;
/**
* The additional environment of the executed program or shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env?: { [key: string]: string };
}
export namespace TaskGroup {
/**
* The clean task group
*/
export const Clean: 'clean';
/**
* The build task group. If a task is part of the build task group
* it can be executed via the run build short cut.
*/
export const Build: 'build';
/**
* The rebuild all task group
*/
export const RebuildAll: 'rebuildAll';
/**
* The test task group. If a task is part of the test task group
* it can be executed via the run test short cut.
*/
export const Test: 'test';
}
/**
* A task that starts an external process.
*/
export class ProcessTask {
/**
* Creates a process task.
*
* @param name the task's name. Is presented in the user interface.
* @param process the process to start.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, process: string, problemMatchers?: string | string[]);
/**
* Creates a process task.
*
* @param name the task's name. Is presented in the user interface.
* @param process the process to start.
* @param args arguments to be passed to the process.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, process: string, args: string[], problemMatchers?: string | string[]);
/**
* Creates a process task.
*
* @param name the task's name. Is presented in the user interface.
* @param process the process to start.
* @param args arguments to be passed to the process.
* @param options additional options for the started process.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, process: string, args: string[], options: ProcessTaskOptions, problemMatchers?: string | string[]);
/**
* The task's name
*/
readonly name: string;
/**
* The task's identifier. If omitted the internal identifier will
* be `${extensionName}:${name}`
*/
identifier: string | undefined;
/**
* Whether the task is a background task or not.
*/
isBackground: boolean;
/**
* The process to be executed.
*/
readonly process: string;
/**
* The arguments passed to the process. Defaults to an empty array.
*/
args: string[];
/**
* A human-readable string describing the source of this
* shell task, e.g. 'gulp' or 'npm'.
*/
source: string | undefined;
/**
* The task group this tasks belongs to. See TaskGroup
* for a predefined set of available groups.
* Defaults to undefined meaning that the task doesn't
* belong to any special group.
*/
group: string | undefined;
/**
* The process options used when the process is executed.
* Defaults to an empty object literal.
*/
options: ProcessTaskOptions;
/**
* The terminal behavior. Defaults to an empty object literal.
*/
terminalBehavior: TaskTerminalBehavior;
/**
* The problem matchers attached to the task. Defaults to an empty
* array.
*/
problemMatchers: string[];
}
export type ShellTaskOptions = {
/**
* The shell executable.
*/
executable: string;
/**
* The arguments to be passed to the shell executable used to run the task.
*/
shellArgs?: string[];
/**
* The current working directory of the executed shell.
* If omitted the tools current workspace root is used.
*/
cwd?: string;
/**
* The additional environment of the executed shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env?: { [key: string]: string };
} | {
/**
* The current working directory of the executed shell.
* If omitted the tools current workspace root is used.
*/
cwd: string;
/**
* The additional environment of the executed shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env?: { [key: string]: string };
} | {
/**
* The current working directory of the executed shell.
* If omitted the tools current workspace root is used.
*/
cwd?: string;
/**
* The additional environment of the executed shell. If omitted
* the parent process' environment is used. If provided it is merged with
* the parent process' environment.
*/
env: { [key: string]: string };
};
/**
* A task that executes a shell command.
*/
export class ShellTask {
/**
* Creates a shell task.
*
* @param name the task's name. Is presented in the user interface.
* @param commandLine the command line to execute.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, commandLine: string, problemMatchers?: string | string[]);
/**
* Creates a shell task.
*
* @param name the task's name. Is presented in the user interface.
* @param commandLine the command line to execute.
* @param options additional options used when creating the shell.
* @param problemMatchers the names of problem matchers to use, like '$tsc'
* or '$eslint'. Problem matchers can be contributed by an extension using
* the `problemMatchers` extension point.
*/
constructor(name: string, commandLine: string, options: ShellTaskOptions, problemMatchers?: string | string[]);
/**
* The task's name
*/
readonly name: string;
/**
* The task's identifier. If omitted the internal identifier will
* be `${extensionName}:${name}`
*/
identifier: string | undefined;
/**
* Whether the task is a background task or not.
*/
isBackground: boolean;
/**
* The command line to execute.
*/
readonly commandLine: string;
/**
* A human-readable string describing the source of this
* shell task, e.g. 'gulp' or 'npm'.
*/
source: string | undefined;
/**
* The task group this tasks belongs to. See TaskGroup
* for a predefined set of available groups.
* Defaults to undefined meaning that the task doesn't
* belong to any special group.
*/
group: string | undefined;
/**
* The shell options used when the shell is executed. Defaults to an
* empty object literal.
*/
options: ShellTaskOptions;
/**
* The terminal behavior. Defaults to an empty object literal.
*/
terminalBehavior: TaskTerminalBehavior;
/**
* The problem matchers attached to the task. Defaults to an empty
* array.
*/
problemMatchers: string[];
}
export type Task = ProcessTask | ShellTask;
/**
* A task provider allows to add tasks to the task service.
* A task provider is registerd via #workspace.registerTaskProvider.
*/
export interface TaskProvider {
/**
* Provides additional tasks.
* @param token A cancellation token.
* @return a #TaskSet
*/
provideTasks(token: CancellationToken): ProviderResult<Task[]>;
}
export namespace workspace {
/**
* Register a task provider.
*
* @param provider A task provider.
* @return A [disposable](#Disposable) that unregisters this provider when being disposed.
*/
export function registerTaskProvider(provider: TaskProvider): Disposable;
}
export namespace window {
export function sampleFunction(): Thenable<any>;

View file

@ -448,9 +448,9 @@ export function createApiFactory(
getConfiguration: (section?: string): vscode.WorkspaceConfiguration => {
return extHostConfiguration.getConfiguration(section);
},
registerTaskProvider: (provider: vscode.TaskProvider) => {
registerTaskProvider: proposedApiFunction(extension, (provider: vscode.TaskProvider) => {
return extHostTask.registerTaskProvider(extension, provider);
}
})
};
class SCM {

View file

@ -1101,6 +1101,8 @@ namespace Globals {
export namespace ExecutionEngine {
export const _default: Tasks.ExecutionEngine = Tasks.ExecutionEngine.Process;
export function from(config: ExternalTaskRunnerConfiguration): Tasks.ExecutionEngine {
let runner = config.runner || config._runner;
let result: Tasks.ExecutionEngine;
@ -1128,16 +1130,20 @@ export namespace ExecutionEngine {
export namespace JsonSchemaVersion {
export const _default: Tasks.JsonSchemaVersion = Tasks.JsonSchemaVersion.V0_1_0;
export function from(config: ExternalTaskRunnerConfiguration): Tasks.JsonSchemaVersion {
let version = config.version;
if (!version) {
return Tasks.JsonSchemaVersion.V2_0_0;
return _default;
}
switch (version) {
case '0.1.0':
return Tasks.JsonSchemaVersion.V0_1_0;
default:
case '2.0.0':
return Tasks.JsonSchemaVersion.V2_0_0;
default:
return _default;
}
}
}

View file

@ -14,6 +14,7 @@ export interface TaskEntry extends IPickOpenEntry {
content: string;
}
/* Version 2.0 templates
const dotnetBuild: TaskEntry = {
id: 'dotnetCore',
label: '.NET Core',
@ -127,3 +128,220 @@ export let templates: TaskEntry[] = [dotnetBuild, msbuild, maven].sort((a, b) =>
return (a.sort || a.label).localeCompare(b.sort || b.label);
});
templates.push(command);
*/
const gulp: TaskEntry = {
id: 'gulp',
label: 'Gulp',
autoDetect: true,
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "gulp",',
'\t"isShellCommand": true,',
'\t"args": ["--no-color"],',
'\t"showOutput": "always"',
'}'
].join('\n')
};
const grunt: TaskEntry = {
id: 'grunt',
label: 'Grunt',
autoDetect: true,
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "grunt",',
'\t"isShellCommand": true,',
'\t"args": ["--no-color"],',
'\t"showOutput": "always"',
'}'
].join('\n')
};
const npm: TaskEntry = {
id: 'npm',
label: 'npm',
sort: 'NPM',
autoDetect: false,
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "npm",',
'\t"isShellCommand": true,',
'\t"showOutput": "always",',
'\t"suppressTaskName": true,',
'\t"tasks": [',
'\t\t{',
'\t\t\t"taskName": "install",',
'\t\t\t"args": ["install"]',
'\t\t},',
'\t\t{',
'\t\t\t"taskName": "update",',
'\t\t\t"args": ["update"]',
'\t\t},',
'\t\t{',
'\t\t\t"taskName": "test",',
'\t\t\t"args": ["run", "test"]',
'\t\t}',
'\t]',
'}'
].join('\n')
};
const tscConfig: TaskEntry = {
id: 'tsc.config',
label: 'TypeScript - tsconfig.json',
autoDetect: false,
description: nls.localize('tsc.config', 'Compiles a TypeScript project'),
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "tsc",',
'\t"isShellCommand": true,',
'\t"args": ["-p", "."],',
'\t"showOutput": "silent",',
'\t"problemMatcher": "$tsc"',
'}'
].join('\n')
};
const tscWatch: TaskEntry = {
id: 'tsc.watch',
label: 'TypeScript - Watch Mode',
autoDetect: false,
description: nls.localize('tsc.watch', 'Compiles a TypeScript project in watch mode'),
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "tsc",',
'\t"isShellCommand": true,',
'\t"args": ["-w", "-p", "."],',
'\t"showOutput": "silent",',
'\t"isBackground": true,',
'\t"problemMatcher": "$tsc-watch"',
'}'
].join('\n')
};
const dotnetBuild: TaskEntry = {
id: 'dotnetCore',
label: '.NET Core',
sort: 'NET Core',
autoDetect: false,
description: nls.localize('dotnetCore', 'Executes .NET Core build command'),
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "dotnet",',
'\t"isShellCommand": true,',
'\t"args": [],',
'\t"tasks": [',
'\t\t{',
'\t\t\t"taskName": "build",',
'\t\t\t"args": [ ],',
'\t\t\t"isBuildCommand": true,',
'\t\t\t"showOutput": "silent",',
'\t\t\t"problemMatcher": "$msCompile"',
'\t\t}',
'\t]',
'}'
].join('\n')
};
const msbuild: TaskEntry = {
id: 'msbuild',
label: 'MSBuild',
autoDetect: false,
description: nls.localize('msbuild', 'Executes the build target'),
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "msbuild",',
'\t"args": [',
'\t\t// Ask msbuild to generate full paths for file names.',
'\t\t"/property:GenerateFullPaths=true"',
'\t],',
'\t"taskSelector": "/t:",',
'\t"showOutput": "silent",',
'\t"tasks": [',
'\t\t{',
'\t\t\t"taskName": "build",',
'\t\t\t// Show the output window only if unrecognized errors occur.',
'\t\t\t"showOutput": "silent",',
'\t\t\t// Use the standard MS compiler pattern to detect errors, warnings and infos',
'\t\t\t"problemMatcher": "$msCompile"',
'\t\t}',
'\t]',
'}'
].join('\n')
};
const command: TaskEntry = {
id: 'externalCommand',
label: 'Others',
autoDetect: false,
description: nls.localize('externalCommand', 'Example to run an arbitrary external command'),
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "echo",',
'\t"isShellCommand": true,',
'\t"args": ["Hello World"],',
'\t"showOutput": "always"',
'}'
].join('\n')
};
const maven: TaskEntry = {
id: 'maven',
label: 'maven',
sort: 'MVN',
autoDetect: false,
description: nls.localize('Maven', 'Executes common maven commands'),
content: [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
'\t"version": "0.1.0",',
'\t"command": "mvn",',
'\t"isShellCommand": true,',
'\t"showOutput": "always",',
'\t"suppressTaskName": true,',
'\t"tasks": [',
'\t\t{',
'\t\t\t"taskName": "verify",',
'\t\t\t"args": ["-B", "verify"],',
'\t\t\t"isBuildCommand": true',
'\t\t},',
'\t\t{',
'\t\t\t"taskName": "test",',
'\t\t\t"args": ["-B", "test"],',
'\t\t\t"isTestCommand": true',
'\t\t}',
'\t]',
'}'
].join('\n')
};
export let templates: TaskEntry[] = [gulp, grunt, tscConfig, tscWatch, dotnetBuild, msbuild, npm, maven].sort((a, b) => {
return (a.sort || a.label).localeCompare(b.sort || b.label);
});
templates.push(command);

View file

@ -20,8 +20,8 @@ const shellCommand: IJSONSchema = {
{
$ref: '#definitions/shellConfiguration'
}
],
deprecationMessage: nls.localize('JsonSchema.tasks.isShellCommand.deprecated', 'The property isShellCommand is deprecated. Use the type property and the shell property in the options instead.')
]
// deprecationMessage: nls.localize('JsonSchema.tasks.isShellCommand.deprecated', 'The property isShellCommand is deprecated. Use the type property and the shell property in the options instead.')
};
const dependsOn: IJSONSchema = {
@ -124,10 +124,10 @@ let definitions = schema.definitions;
definitions.commandConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand);
definitions.taskDescription.properties.isShellCommand = Objects.deepClone(shellCommand);
definitions.taskDescription.properties.dependsOn = dependsOn;
definitions.showOutputType.deprecationMessage = nls.localize('JsonSchema.tasks.showOputput.deprecated', 'The property showOutput is deprecated. Use the terminal property instead.');
definitions.taskDescription.properties.echoCommand.deprecationMessage = nls.localize('JsonSchema.tasks.echoCommand.deprecated', 'The property echoCommand is deprecated. Use the terminal property instead.');
definitions.taskDescription.properties.isBuildCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isBuildCommand.deprecated', 'The property isBuildCommand is deprecated. Use the group property instead.');
definitions.taskDescription.properties.isTestCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isTestCommand.deprecated', 'The property isTestCommand is deprecated. Use the group property instead.');
// definitions.showOutputType.deprecationMessage = nls.localize('JsonSchema.tasks.showOputput.deprecated', 'The property showOutput is deprecated. Use the terminal property instead.');
// definitions.taskDescription.properties.echoCommand.deprecationMessage = nls.localize('JsonSchema.tasks.echoCommand.deprecated', 'The property echoCommand is deprecated. Use the terminal property instead.');
// definitions.taskDescription.properties.isBuildCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isBuildCommand.deprecated', 'The property isBuildCommand is deprecated. Use the group property instead.');
// definitions.taskDescription.properties.isTestCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isTestCommand.deprecated', 'The property isTestCommand is deprecated. Use the group property instead.');
definitions.taskDescription.properties.identifier = identifier;
definitions.taskDescription.properties.type = Objects.deepClone(taskType);
definitions.taskDescription.properties.terminal = terminal;

View file

@ -119,6 +119,52 @@ abstract class OpenTaskConfigurationAction extends Action {
if (!selection) {
return undefined;
}
let contentPromise: TPromise<string>;
if (selection.autoDetect) {
const outputChannel = this.outputService.getChannel(TaskService.OutputChannelId);
outputChannel.show(true);
outputChannel.append(nls.localize('ConfigureTaskRunnerAction.autoDetecting', 'Auto detecting tasks for {0}', selection.id) + '\n');
let detector = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService);
contentPromise = detector.detect(false, selection.id).then((value) => {
let config = value.config;
if (value.stderr && value.stderr.length > 0) {
value.stderr.forEach((line) => {
outputChannel.append(line + '\n');
});
if (config && (!config.tasks || config.tasks.length === 0)) {
this.messageService.show(Severity.Warning, nls.localize('ConfigureTaskRunnerAction.autoDetect', 'Auto detecting the task system failed. Using default template. Consult the task output for details.'));
return selection.content;
} else {
this.messageService.show(Severity.Warning, nls.localize('ConfigureTaskRunnerAction.autoDetectError', 'Auto detecting the task system produced errors. Consult the task output for details.'));
}
}
if (config) {
if (value.stdout && value.stdout.length > 0) {
value.stdout.forEach(line => outputChannel.append(line + '\n'));
}
let content = JSON.stringify(config, null, '\t');
content = [
'{',
'\t// See https://go.microsoft.com/fwlink/?LinkId=733558',
'\t// for the documentation about the tasks.json format',
].join('\n') + content.substr(1);
return content;
} else {
return selection.content;
}
});
} else {
contentPromise = TPromise.as(selection.content);
}
return contentPromise.then(content => {
let editorConfig = this.configurationService.getConfiguration<any>();
if (editorConfig.editor.insertSpaces) {
content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + strings.repeat(' ', s2.length * editorConfig.editor.tabSize));
}
configFileCreated = true;
return this.fileService.createFile(this.contextService.toResource('.vscode/tasks.json'), content);
});
/* 2.0 version
let content = selection.content;
let editorConfig = this.configurationService.getConfiguration<any>();
if (editorConfig.editor.insertSpaces) {
@ -126,6 +172,7 @@ abstract class OpenTaskConfigurationAction extends Action {
}
configFileCreated = true;
return this.fileService.createFile(this.contextService.toResource('.vscode/tasks.json'), content);
*/
});
}).then((stat) => {
if (!stat) {
@ -1016,8 +1063,9 @@ class TaskService extends EventEmitter implements ITaskService {
if (hasParseErrors) {
return TPromise.as({ set: undefined, hasErrors: true });
}
let engine = TaskConfig.ExecutionEngine._default;
if (config) {
let engine = TaskConfig.ExecutionEngine.from(config);
engine = TaskConfig.ExecutionEngine.from(config);
if (engine === ExecutionEngine.Process) {
if (this.hasDetectorSupport(config)) {
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService, config).detect(true).then((value): WorkspaceConfigurationResult => {
@ -1052,7 +1100,14 @@ class TaskService extends EventEmitter implements ITaskService {
configPromise = TPromise.as({ config, hasErrors: false });
}
} else {
configPromise = TPromise.as({ config, hasErrors: false });
if (engine === ExecutionEngine.Terminal) {
configPromise = TPromise.as({ config, hasErrors: false });
} else {
configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => {
let hasErrors = this.printStderr(value.stderr);
return { config: value.config, hasErrors };
});
}
}
}
return configPromise.then((resolved) => {
@ -1092,7 +1147,7 @@ class TaskService extends EventEmitter implements ITaskService {
private getExecutionEngine(): ExecutionEngine {
let { config } = this.getConfiguration();
if (!config) {
return ExecutionEngine.Terminal;
return ExecutionEngine.Process;
}
return TaskConfig.ExecutionEngine.from(config);
}