Определите несколько задач в VSCode


82

Я видел, что можно определить задачу в VSCode. Но я не уверен, как определить несколько задач в tasks.jsonфайле.


14
Удивительно, насколько плохо это объясняет сайт VS Code! Чтобы узнать, как работает этот новый инструмент, нужно рыться в темных уголках Интернета.
— Kokodoko

Первоклассная поддержка была добавлена ​​в VS Code 1.9 (январь 2017 г.), что устраняет необходимость в обходных путях, описанных в основных ответах здесь. Смотрите этот ответ (мой) .
— vossad01

Ответ можно найти здесь: stackoverflow.com/questions/43657839/…
— pasx

Ответы:


36

На всякий случай кому-то поможет ... Если у вас нет / вы не хотите gulp / grunt / etc ... или дополнительного сценария оболочки для прокси-сервера ваших команд задач, "npm run" уже есть.

это для webpack и mocha, как в "Build and Test", Shift+ Ctrl+ B, Shift+ Ctrl+T

.vscode / tasks.json:

{
  "name": "npmTask",
  //...
  "suppressTaskName": true,
  "command": "npm",
  "isShellCommand": true,
  "args": [
    "run"
  ],
  "tasks": [
    {
      //Build Task
      "taskName": "webpack",
      //Run On Shift+Ctrl+B
      "isBuildCommand": true,
      //Don't run when Shift+Ctrl+T
      "isTestCommand": false,
      // Show the output window if error any
      "showOutput": "silent",
      //Npm Task Name
      "args": [
        "webpack"
      ],
      // use 2 regex:
      // 1st the file, then the problem       
      "problemMatcher": {
        "owner": "webpack",
        "severity": "error",
        "fileLocation": "relative",
        "pattern": [
          {
            "regexp": "ERROR in (.*)",
            "file": 1
          },
          {
            "regexp": "\\((\\d+),(\\d+)\\):(.*)",
            "line": 1,
            "column": 2,
            "message": 3
          }
        ]
      }
    },
    {
      //Test Task   
      "taskName": "mocha",
      // Don't run on Shift+Ctrl+B
      "isBuildCommand": false,
      // Run on Shift+Ctrl+T
      "isTestCommand": true,
      "showOutput": "always",
      "args": [
        "mocha"
      ]
    }
  ]
}

package.json:

{
  ...
  "scripts": {
    "webpack": "webpack",
    "mocha": "/usr/bin/mocha"
  },
  ...
}

Хорошее решение! Итак, вы определяете свои фактические команды в теге сценариев npm, а затем вызываете сценарий npm из tasks.json. Мне бы очень хотелось просто определять задачи прямо внутри tasks.json. Это кажется лишним?
— Кокодоко

13

Что помогло мне лучше понять это, так это последовательность аргументов, переданных команде. Для кого-то это может быть очевидно, но не ясно в документации.

Пропуск некоторых полей, чтобы сосредоточиться только на отправляемой команде:

{ "command": "myCommand"
  "args": ["myCommandArguments"],
  "tasks" : [ 
    { "taskName": "myTask",
      "args": ["myTaskArguments"],
      "suppressTaskName": false,
    }
  ]
}

Приведенное выше определение приведет к следующей команде:

myCommand myCommandArguments myTaskArguments myTask

Название задачи myTaskвсегда последнее. Начиная с версии 0.4 его можно не использовать "suppressTaskName": true.


Вау, я не мог поверить в этот ответ, но попробовал, и он оказался правдой и сработал. Мне нужна была задача в VSCode для «gulp --no-color vet --verbose», но для того, чтобы заставить ее работать, я использовал аргумент в качестве задачи и задачу в качестве аргумента типа «gulp --no-color» --verbose vet "в файле tasks.json, где vet - моя задача, а --verbose - аргумент. Конечно, это вызывает проблемы с задачами, аргументы которых совпадают, поэтому задача названа в соответствии с ее аргументами и указана как таковая в параметрах запуска задачи VSCode.
— GJSmith3rd

Но что, если мне нужны разные задачи с разными командами? Например, одна задача должна запускать node-sass, а другая - tsc?
— Kokodoko

Вы спасли меня от прыжка с окна с аргументом suppressTaskName.
— Machinegon

12

Попробуй это

{
    "version": "0.1.0",
    "command": "cmd",
    "isShellCommand": true,
    "args": ["/C"],
    "tasks": [
        {
            "taskName": "install",
            "args": ["npm install"]
        },
        {
            "taskName": "build",
            "args": ["gulp build"],
            "isBuildCommand": true,
            "problemMatcher": "$gulp-tsc"
        }
    ]
}

подробнее пожалуйста? Что за ошибка? Я использую это как VS Code 0.8.0, и он работает нормально.
— AlexStack

на выводе toogle я видел стандартный вывод cmd.exe onrun. Как это: Microsoft Windows [Версия 10.0.10240] (c) Корпорация Майкрософт (Microsoft Corporation), 2015 г. Все права защищены. // Авторские права MS на русский язык C: \ Users \ roman>
— нефтедоллар

@neftedollar Это работает только в Windows. Если вы ищете что-то, что будет работать на Mac, измените "command": "cmd" на "command": "sh" и замените "args": ["/ c"] на "args": ["- c "].
— ra9r 01

@raiglstorfer, спасибо, он не работал на моем ПК с Windows.
— нефтедоллар 01

10

Я использую следующий файл tasks.json для запуска нескольких сценариев сборки TypeScript. Я помещаю файл tsconfig.json в каждую папку, что позволяет мне настраивать вывод каждой папки индивидуально. Просто убедитесь, что вы подавили имя задачи, потому что оно пытается поместить его в командную строку.

{
    "version": "0.1.0",
    "command": "tsc",
    "showOutput": "always",
    "isShellCommand": true,
    "args": [],
    "windows": {
        "command": "tsc",
        "showOutput": "always",
        "isShellCommand": true
    },
    "tasks": [
        {
            "taskName": "Build the examples",
            "suppressTaskName": true,
            "isBuildCommand": false,            
            "args": ["-p", "./source/examples", "--outDir", "./script/examples"],
            "problemMatcher": "$tsc"
        },
        {
            "taskName": "Build the solution",            
            "suppressTaskName": true,
            "isBuildCommand": false,        
            "args": ["-p", "./source/solution", "--outDir", "./script/solution"],
            "problemMatcher": "$tsc"
        }   
    ]
}

Вот как выглядит структура папок, где / script - корень вывода, а / source - корень ввода. Обе папки ссылаются на объявления типов в папке / typingd и / typings. TypeScript несколько ограничен использованием относительных путей во внешних ссылках, поэтому он помогает упростить вещи, если структуры этих папок похожи.

Структура папки с несколькими сборками TypeScript

О да, их выборочно запускать проще, если вы пометите их как не построенные и переопределите ключ сборки, чтобы выбрать конкретную задачу из списка, например ...

// Place your key bindings in this file to overwrite the defaults
[
    { "key": "ctrl+shift+b", "command": "workbench.action.tasks.runTask" }
]

Обновление : вы всегда можете просто пойти полным мошенником, если хотите. Могут быть более эффективные способы обработки аргументов, но на данный момент это работает для меня под OSX.

{
  "version": "0.1.0",
  "isShellCommand": true,
  "linux": { "command": "sh", "args": ["-c"] },
  "osx": { "command": "sh", "args": ["-c"] },
  "windows": { "command": "powershell", "args": ["-Command"] },
  "tasks": [
    {
      "taskName": "build-models",
      "args": ["gulp build-models"],
      "suppressTaskName": true,
      "isBuildCommand": false,
      "isTestCommand": false
    },
    {
      "taskName": "run tests",
      "args": ["mocha ${workspaceRoot}/test"],
      "suppressTaskName": true,
      "isBuildCommand": false,
      "isTestCommand": false
    }
  ]
}

2
Это очень наглядный пример! Вероятно, именно так MS планировала использовать tasks.json (жаль, что они сами этого не объясняют). Единственная проблема: что, если у меня ДРУГИЕ задачи командной строки? (Мне нужна задача tsc и задача node-sass)
— Кокодоко

3
См. Обновление, чтобы узнать о способах выполнения нескольких независимых команд.
— djabraham

Я согласен с тем, что одна «команда сборки» - проблема, когда вы хотите использовать tsc и node-sass. Необходимость устанавливать и изучать сторонний инструмент сборки (например, gulp) мешает. Необходимость перечислять разные командные процессоры для разных ОС - это разочарование.
— Джон Ватт, 01

7

Я не знаю правильного ответа на это (и тоже хотел бы знать), но мой уродливый обходной путь на случай, если он кому-то поможет. Я работаю в Windows, и в итоге я создал простой пакетный скрипт, который может содержать просто

"%1" "%2"

Тогда мой tasks.json выглядит примерно так

{
    "version": "0.1.0",
    "command": "c:\\...\\mytasks.bat"
    "tasks" : [
        {
            "taskName": "myFirstTask",
            "args": "c:\\...\\task1.exe", "${file}"],
        },
        {
            "taskName": "mySecondTask",
            "args": "c:\\...\\task2.exe", "${file}"],
        },
    ]
}

Я наконец-то заработал. Где-то в последние 9 месяцев VS Code начал добавлять taskName к arg 1 задачи. Итак, мой командный файл становится: "% 2" "% 3" вместо того, что у вас есть. Если это останется неизменным, я могу вернуться, чтобы отредактировать это решение.
— Фил

6

В свойстве tasks можно указать несколько задач. Что-то вроде:

"tasks": [
    {
        "taskName": "build",
        ...
    },
    {
         "taskName": "package",
         ...
    }
]

7
Однако они должны использовать одну и ту же команду. Можно только варьировать аргументы.
— Эдвард Б.

Да, Эдвард Б. По какой-то причине каждое текущее сообщение в блоге предполагает, что вы только начинаете работать с VS Code и у вас еще нет задач: S. Но вы должны установить "suppressTaskName": true на корневом узле, а затем можете установить "taskName" в подзадачах, чтобы использовать разные команды. См пример @Dan с tscи mochaзадач.
— Барт,

4

Эта функция была добавлена ​​в Visual Studio Code v1.9 (январь 2017 г.) . Пример и текст взяты из примечаний к выпуску :

{
  "version": "0.1.0",
  "tasks": [
    {
      "taskName": "tsc",
      "command": "tsc",
      "args": ["-w"],
      "isShellCommand": true,
      "isBackground": true,
      "problemMatcher": "$tsc-watch"
    },
    {
      "taskName": "build",
      "command": "gulp",
      "args": ["build"],
      "isShellCommand": true
    }
  ]
}

Команды на задачу

Теперь вы можете определять разные команды для каждой задачи ( # 981 ). Это позволяет запускать разные команды для разных задач без написания собственного сценария оболочки. tasks.jsonФайл с помощью команд на внешний вид задачи , как [выше] .


3

Похоже, это ошибка VSCode с версии 0.5.0.

поэтому я добавил этот ответ, чтобы показать рабочий пример того, что ранее объяснил @hurelu. Мои задачи.json:

{
    "version": "0.1.0",
    "command": "gulp",
    "isShellCommand": true,
    "args": [
        "--no-color"
    ],
    "tasks": [
        {
            "taskName": "--verbose",
            "isBuildCommand": true,
            "showOutput": "always",
            "args": [
                "vet"
            ],
            "problemMatcher": [
                "$jshint",
                "$jshint-stylish"
            ]
        },
        {
            "taskName": "vet",
            "isTestCommand": true,
            "showOutput": "always",
            "args": [],
            "problemMatcher": [
                "$jshint",
                "$jshint-stylish"
            ]
        }
    ]
}

Мой gulp.js:

/// <reference path="typings/tsd.d.ts" />

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var jscs = require('gulp-jscs');
var util = require('gulp-util');
var gulpprint = require('gulp-print');
var gulpif = require('gulp-if');
var args = require('yargs').argv;

gulp.task('vet', function () {
    log('Analyzing source with JSHint and JSCS');

    return gulp
        .src
        ([
            './src/**/*.js',
            './*.js'
        ])
        .pipe(gulpif(args.verbose, gulpprint()))
        .pipe(jscs())
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish', { verbose: true }))
        .pipe(jshint.reporter('fail'));
});

gulp.task('hello-world', function () {
    console.log('This is our first Gulp task!');
});

////////////
function log(msg) {
    if (typeof (msg) === 'object') {
        for (var item in msg) {
            if (msg.hasOwnProperty(item)) {
                util.log(util.colors.blue(msg[item]));
            }
        }
    } else {
        util.log(util.colors.blue(msg));
    }

}

Обратите внимание, что первая задача использует isBuildCommand, поэтому запускается CTRL + SHFT + B, а следующая задача - isTestCommand, поэтому запускается CTRL + SHFT + T. Однако для того, чтобы первая задача принимала аргументы, необходимо было поменять местами имя задачи и аргументы.

Начиная с VSCode 0.5.0 вышеупомянутое работает, но не следующее:

{
    "version": "0.1.0",
    "command": "gulp",
    "isShellCommand": true,
    "args": [
        "--no-color"
    ],
    "tasks": [
        {
            "taskName": "vet",
            "isBuildCommand": true,
            "showOutput": "always",
            "args": [
                "--verbose"
            ],
            "problemMatcher": [
                "$jshint",
                "$jshint-stylish"
            ]
        },
        {
            "taskName": "vet",
            "isTestCommand": true,
            "showOutput": "always",
            "args": [],
            "problemMatcher": [
                "$jshint",
                "$jshint-stylish"
            ]
        }
    ]
}

Вот вывод из task.json с правильной задачей и порядком аргументов:

[10:59:29] Using gulpfile ~/Workspaces/Examples/Gulp/pluralsight-gulp/gulpfile.js
[10:59:29] Task 'default' is not in your gulpfile
[10:59:29] Please check the documentation for proper gulpfile formatting

Вот правильный вывод tasks.json с обратным именем задачи и аргументом при использовании аргументов:

[11:02:44] Using gulpfile ~/Workspaces/Examples/Gulp/pluralsight-gulp/gulpfile.js
[11:02:44] Starting 'vet'...
[11:02:44] Analyzing source with JSHint and JSCS
[gulp] src/server/app.js
[gulp] src/client/app/app.module.js
[gulp] src/client/test-helpers/bind-polyfill.js
[gulp] src/client/test-helpers/mock-data.js
[gulp] src/server/routes/index.js
[gulp] src/client/app/core/config.js
[gulp] src/client/app/core/constants.js
[gulp] src/client/app/core/core.module.js
[gulp] src/client/app/core/dataservice.js
[gulp] src/client/app/core/dataservice.spec.js
[gulp] src/client/app/customers/customer-detail.controller.js
[gulp] src/client/app/customers/customer-detail.controller.spec.js
[gulp] src/client/app/customers/customers.controller.js
[gulp] src/client/app/customers/customers.controller.spec.js
[gulp] src/client/app/customers/customers.module.js
[gulp] src/client/app/customers/customers.route.js
[gulp] src/client/app/customers/customers.route.spec.js
[gulp] src/client/app/dashboard/dashboard.controller.js
[gulp] src/client/app/dashboard/dashboard.controller.spec.js
[gulp] src/client/app/dashboard/dashboard.module.js
[gulp] src/client/app/dashboard/dashboard.route.js
[gulp] src/client/app/dashboard/dashboard.route.spec.js
[gulp] src/client/app/layout/ht-sidebar.directive.js
[gulp] src/client/app/layout/ht-sidebar.directive.spec.js
[gulp] src/client/app/layout/ht-top-nav.directive.js
[gulp] src/client/app/layout/layout.module.js
[gulp] src/client/app/layout/shell.controller.js
[gulp] src/client/app/layout/shell.controller.spec.js
[gulp] src/client/app/layout/sidebar.controller.js
[gulp] src/client/app/layout/sidebar.controller.spec.js
[gulp] src/client/app/widgets/ht-img-person.directive.js
[gulp] src/client/app/widgets/ht-widget-header.directive.js
[gulp] src/client/app/widgets/widgets.module.js
[gulp] src/client/tests/server-integration/dataservice.spec.js
[gulp] src/server/routes/utils/errorHandler.js
[gulp] src/server/routes/utils/jsonfileservice.js
[gulp] src/client/app/blocks/exception/exception-handler.provider.js
[gulp] src/client/app/blocks/exception/exception-handler.provider.spec.js
[gulp] src/client/app/blocks/exception/exception.js
[gulp] src/client/app/blocks/exception/exception.module.js
[gulp] src/client/app/blocks/logger/logger.js
[gulp] src/client/app/blocks/logger/logger.module.js
[gulp] src/client/app/blocks/router/router-helper.provider.js
[gulp] src/client/app/blocks/router/router.module.js
[gulp] gulpfile.js
[gulp] karma.conf.js
[11:02:48] Finished 'vet' after 4.37 s

2

По состоянию на февраль 2017 года , вы можете использовать Terminal Runner и составлять несколько задач, настраивая задачи зависимостей. Это немного забавно в том смысле, что он открывает отдельный интегрированный терминал для каждой задачи, за которым вы должны следить, чтобы увидеть, работает ли что-то, и не забудьте закрыть (они «складываются»), и вы не получите уведомление «готово» , но он выполняет свою работу. Функционал предварительный, но перспективный. Вот пример запуска tsc и jspm для приложения Cordova.

{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [{
        "taskName": "tsc",
        "command": "tsc",
        "isShellCommand": true,
        "args": ["-p", "."],
        "showOutput": "always",
        "problemMatcher": "$tsc"
    }, {
        "taskName": "jspm",
        "command": "jspm",
        "isShellCommand": true,
        "args": ["bundle-sfx", "www/app/main.js", "www/dist/bundle.js", "--inline-source-maps", "--source-map-contents"],
        "showOutput": "always"
    },
    {
        "taskName": "build",
        "isBuildCommand": true,
        "dependsOn": ["tsc", "jspm"]
    }]
}

Высшие оценки за использование более поздней версии задач. Делает вещи намного проще!
— wonea

1

Для меня сработало следующее:

tasks.json:

{
    "version": "0.1.0",
    "command": "cmd",
    "isShellCommand": true,
    "args": [
        "/c"
    ],
    "tasks": [
        {
            "taskName": "bower",
            "args" : ["gulp bower"],
            "isBuildCommand": true,
            "showOutput": "always"
        },
        {
            "taskName": "unittest",
            "suppressTaskName": true,
            "args" : ["dnx -p ${cwd}\\test\\MyProject.UnitTests test"],
            "isTestCommand": true,
            "showOutput": "always"
        }
    ]
}

MyProject.UnitTests \ project.json :

 "commands": {
    "test": "xunit.runner.dnx"
  }

Запустить bower: Ctrl + Shift + B из vscode Запустить тесты: Ctrl + Shift + T из vscode


1

Это работает для меня ...

Я знаю, что здесь много разных ответов, но мой подход снова был немного другим, поэтому я подумал, что добавлю свои 2 пенса.

Я работаю в Windows и использую внешний пакетный файл для выполнения своих команд. Это похоже на ответ Джонатана выше, но я не передаю ему никаких команд, что означает, что мой файл «tasks.json» отличается.

Я мог бы со временем изменить этот подход (например, у меня еще не было времени поиграть с gulp), но этот метод сейчас отлично работает для меня.

Я использую ручки для создания шаблонов html, babel, поэтому я могу использовать код ES6 и линтер кода для выявления ошибок. В конце пакетный файл запускает браузер с моей стартовой страницей (index.html)

Вот мой командный файл с именем run_tasks.bat:

@ECHO OFF
@ECHO Startz!
@ECHO Running Handlebars!

call handlebars html_templates -e html -f dist/html_templates.js

@ECHO Linting ES6 code

call eslint -c eslint.json src

@ECHO Running Babel ES6 to ES5

call babel src --out-dir dist --source-maps

@ECHO Now startzing page up in browser!
index.html

@ECHO Donezz it!

А вот и мой файл tasks.json:

{ 
    "version": "0.1.0",
    "command": "${workspaceRoot}/run_tasks.bat",
    "isShellCommand": true,
    "isWatching": true,
    "showOutput": "always",

    "args": [],

    "tasks": [
        {
            "taskName": "build",
            "isBuildCommand": true,
            "isWatching": true,
            "showOutput": "always"
        }
}

Затем в VSCode я нажимаю «CTRL + SHIFT + B», чтобы запустить командный файл.


1

У меня есть приложение Electron, которому нужно скомпилировать меньшую таблицу стилей, а затем собрать и запустить программу. Я использовал решение @ Ocean, которое сработало для меня ... больше ничего не сработало.

Оба моих файла tasks.json и build-tasks.bat находятся в каталоге .vscode в корне проекта.

build-tasks.bat

@ECHO OFF
@ECHO Begin!
@ECHO Compiling Less

call lessc ./css/styles.less ./css/styles.css

@ECHO Build Electron App and Launch

call electron ./app.js

@ECHO Finished!

tasks.json

{
    "version": "0.1.0",
    "command": "${workspaceRoot}\\.vscode\\build-tasks.bat",
    "isShellCommand": true,
    "isWatching": true,
    "showOutput": "always",

    "args": [],

    "tasks": [
        {
            "taskName": "build",
            "isBuildCommand": true,
            "isWatching": true,
            "showOutput": "always"
        }
    ]
}

0

Благодаря этой теме у меня теперь есть сборка c # / dnxcore50 и тестовая отладка и т. Д., Работающая в vscode на osx с этим:

{
"version": "0.1.0",
"command": "bash",
"args": [
],
"tasks": [
    {
        "taskName": "xbuild",
        "args": [
            "./src/Service.Host/Service.Host.csproj"
        ],          

        "showOutput": "always",
        "problemMatcher": "$msCompile",
        "isBuildCommand": true
    },
    {
        "taskName": "dnx",
        "args" : ["-p", "./test/Service.Tests.Unit", "test"],
        "isTestCommand": true,
        "showOutput": "always"    
    }      
]
}

Я уверен, что Linux будет в основном таким же. Единственное, что меня раздражает, - это необходимость поддерживать файлы .csproj только для отладки. Я с нетерпением жду способа отладки с помощью dnx, хотя я не искал уже пару недель.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.