Визначте кілька завдань у 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.