Визначте кілька завдань у VSCode


82

Я бачив, що можна визначити завдання у VSCode. Але я не впевнений, як визначити кілька завдань у tasks.jsonфайлі.


14
Дивно, як погано це пояснює веб-сайт VS Code! Потрібно обшукати темні куточки Інтернету, щоб з’ясувати, як працює цей новий інструмент.
Кокодоко

Першокласна підтримка була додана до VS Code 1.9 (січень 2017 р.), Усуваючи потребу в обхідних шляхах, які можна побачити у відповідях тут. Дивіться цю відповідь (мою) .
vossad01

Відповідь можна знайти тут: stackoverflow.com/questions/43657839 / ...
pasx

Відповіді:


36

Про всяк випадок, коли це комусь допоможе .... Якщо у вас немає / потрібно gulp / grunt / etc ... або додаткового сценарію оболонки для проксі-сервера команд вашого завдання, "npm run" вже є.

це для webpack та mocha, як у "Створення та тестування", 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 із task.json. Мені б дуже хотілося просто визначити завдання безпосередньо всередині task.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 "у task.json, де vet - це моє завдання, а --verbose - аргумент. Звичайно, це спричиняє проблеми із завданнями, аргументи яких однакові, тому завдання отримало назву після його аргументів і перелічено як таке у параметрах запуску завдань VSCode.
GJSmith3

Але що, якщо я хочу різні завдання з різними командами? Наприклад, одне завдання має запускати node-sass, а друге - tsc?
Кокодоко,

Ви врятували мене від стрибка з вікна за допомогою аргументу 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. Ось так: Microsoft Windows [Версія 10.0.10240] (c) Корпорація Майкрософт (Microsoft Corporation), 2015 г. Всі права захищені. // Авторські права MS на російський C: \ Users \ roman>
neftedollar

@neftedollar Це працює лише у Windows. Якщо ви шукаєте щось, що буде працювати на Mac, змініть "command": "cmd" на "command": "sh" і змініть "args": ["/ c"] на "args": ["- c "].
ra9r

@raiglstorfer дякую, це не працювало на моєму ПК з Windows.
Нефтоллар

10

Я використовую наступний файл task.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 та / typs. 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 задумала використовувати task.json (шкода, що вони самі цього не пояснюють). Єдина проблема: а що, якщо я маю РІЗНІ завдання командного рядка? (Мені потрібне завдання tsc та завдання node-
sass

3
Див. Розділ Оновлення щодо засобів запуску декількох незалежних команд
djabraham

Я погоджуюсь, що одна "команда побудови" - це проблема, коли ви хочете використовувати tsc та node-sass. Потрібно встановлювати та вивчати інструмент побудови сторонніх розробників (наприклад, глоток) - це невдача. Потрібно перерахувати різні командні процесори для різних ОС-систем.
Jon Watte

7

Я не знаю правильної відповіді на це (і також хотів би знати), але мій потворний обхідний шлях, якщо це комусь допоможе. Я працюю в Windows, і в підсумку я створив простий пакетний сценарій, який міг містити просто

"%1" "%2"

Тоді мій task.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 до аргументу 1 для завдання. Отже, мій командний файл стає: "% 2" "% 3" замість того, що у вас є. Якщо це залишається послідовним, я можу повернутися, щоб відредагувати це рішення.
phil

6

Ви можете перелічити більше одного завдання у властивості завдань. Щось на зразок:

"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

Ось правильний вивід із завдання .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” відрізняється.

Я міг би змінити цей підхід з часом (наприклад, я ще не встиг пограти з ковтком), але на даний момент цей метод для мене працює абсолютно добре.

Я використовую кермо для 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!

І ось мій файл task.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, яке працювало для мене ... нічого іншого не працювало.

І мій файл task.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.