Определите несколько задач в 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.

Hurelu
источник
Вау, я не мог поверить в этот ответ, но попробовал, и он оказался правдой и сработал. Мне нужна была задача в 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"
        }
    ]
}
AlexStack
источник
подробнее пожалуйста? Что за ошибка? Я использую это как 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Файл с помощью команд на внешний вид задачи , как [выше] .

vossad01
источник
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
GJSmith3rd
источник
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

AlexandruC
источник
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, хотя я не искал уже пару недель.

Марк Джонс
источник