VSCode'da birden fazla görev tanımlayın


82

VSCode'da bir görev tanımlamanın mümkün olduğunu gördüm. Ancak tasks.jsondosyada birden çok görevi nasıl tanımlayacağımdan emin değilim .


14
VS Code web sitesinin bunu ne kadar kötü açıklaması oldukça şaşırtıcı! Bu yeni aracın nasıl çalıştığını bulmak için internetin karanlık köşelerini araştırmak gerekiyor.
Kokodoko

VS Code 1.9'da (Ocak 2017) birinci sınıf destek eklendi ve buradaki en iyi yanıtlarda görülen geçici çözümlere olan ihtiyacı ortadan kaldırdı. Bu cevaba bakın (benimki) .
vossad01

Bir cevap burada bulunabilir: stackoverflow.com/questions/43657839/…
pasx

Yanıtlar:


36

Birine yardım etmesi durumunda ... Eğer gulp / grunt / etc ... istemiyorsanız / istemiyorsanız veya görev komutlarınızı vekil olarak çalıştırmak için fazladan bir kabuk betiğine sahip değilseniz, "npm run" zaten vardır.

bu "Build and Test", Shift+ Ctrl+ B, Shift+ Ctrl+ 'da olduğu gibi webpack ve mocha içindirT

.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"
  },
  ...
}

Güzel çözüm! Böylece, gerçek komutlarınızı npm scripts etiketinde tanımlarsınız ve sonra npm komut dosyasını tasks.json'dan çağırırsınız. Görevleri doğrudan tasks.json içinde tanımlamak isterdim. Bu biraz gereksiz görünüyor mu?
Kokodoko

13

Bunu daha iyi anlamama yardımcı olan, komuta aktarılan argümanlar dizisi. Bazıları için açık olabilir ama belgelerde net değil.

Yalnızca gönderilen komuta odaklanmak için bazı alanların çıkarılması:

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

Yukarıdaki tanım aşağıdaki komutla sonuçlanacaktır:

myCommand myCommandArguments myTaskArguments myTask

Görev adı myTaskher zaman en sondur. 0.4 sürümünden bu yana atlanabilir "suppressTaskName": true.


Vay canına, bu cevaba inanamadım ama denedim ve doğru ve işe yaradı. VSCode'da "gulp --no-color veteriner --verbose" için bir görev istedim, ancak çalışmasını sağlamak için argümanı görev olarak ve görevi argüman olarak "gulp --no-color" gibi kullandım --verbose vet "in the tasks.json'da veteriner benim görevim ve --verbose bir argüman. Elbette bu, bağımsız değişkenleri aynı olan görevlerde sorunlara neden olur, bu nedenle görev, argümanlarından sonra adlandırılır ve VSCode görev çalıştırma seçeneklerinde olduğu gibi listelenir.
GJSmith3

Ama ya farklı komutlara sahip farklı görevler istersem? Örneğin, bir görev node-sass çalıştırmalı ve diğeri tsc?
Kokodoko

SupressTaskName bağımsız değişkeniyle beni pencereden atlamaktan kurtardınız.
Machinegon

12

Bunu dene

{
    "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"
        }
    ]
}

daha fazla bilgi lütfen? Hata nedir? Bunu VS Code 0.8.0 itibariyle kullanıyorum ve iyi çalışıyor.
AlexStack

toogle çıktıda standart cmd.exe onrun çıktısını görüyorum. Şunun gibi: Microsoft Windows [Sürüm 10.0.10240] (c) Korpорация Майкрософт (Microsoft Corporation), 2015 г. Все права защищены. // Rusça C: \ Users \ roman> için MS telif hakları
neftedollar

@neftedollar Bu yalnızca Windows'ta çalışır. Mac'te çalışacak bir şey arıyorsanız, "command": "cmd" yi "command": "sh" olarak değiştirin ve "args": ["/ c"] "args": ["- c "].
ra9r

@raiglstorfer teşekkürler, Windows PC'imde çalışmıyordu.
neftedollar

10

Birden çok TypeScript oluşturma senaryosu çalıştırmak için aşağıdaki tasks.json dosyasını kullanıyorum. Her klasöre bir tsconfig.json dosyası koyuyorum, böylece her klasörün çıktısını ayrı ayrı ayarlamamı sağlıyor. Görev adını, komut dizesine koymaya çalıştığı için bastırdığınızdan emin olun.

{
    "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"
        }   
    ]
}

Klasör yapısı böyle görünür, burada / script çıktı kökü ve / source girdi köküdür. Her iki klasör de / typingd klasöründeki ve / typings klasöründeki tür bildirimlerine başvurur. TypeScript, harici referanslarda göreli yolları kullanmakla bir şekilde sınırlıdır, bu nedenle bu klasör yapılarının benzer olması durumunda işleri basitleştirmeye yardımcı olur.

TypeScript Multi-Build Klasör Yapısı

Oh evet, onları derlenmemiş olarak işaretlerseniz ve bir listeden belirli bir görevi seçmek için derleme anahtarını geçersiz kılarsanız, bunları seçerek başlatmayı kolaylaştırır.

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

Güncelleme : İsterseniz her zaman tamamen haydut olabilirsiniz. Bağımsız değişkenleri ele almanın daha iyi yolları olabilir, ancak bu şu anda OSX altında benim için çalışıyor.

{
  "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
Bu çok açık bir örnek! Muhtemelen MS, tasks.json'un nasıl kullanılmasını amaçladı (bunu kendi başlarına açıklamamaları çok yazık). Tek sorun şudur: Ya FARKLI komut satırı görevlerim varsa? (Ben tsc görev ve düğüm-küstahlık görev gerekir)
Kokodoko

3
Birden çok bağımsız komut çalıştırmanın bir yolu için Güncelleme bölümüne bakın.
djabraham

Tsc ve node-sass kullanmak istediğinizde tek bir "build komutunun" sorun olduğunu kabul ediyorum. Üçüncü taraf bir derleme aracı (gulp gibi) kurmak ve öğrenmek zorunda kalmak bir olumsuzluktur. Farklı işletim sistemleri için farklı komut işlemcileri listelemek zorunluluktur.
Jon Watte

7

Bunun doğru cevabını bilmiyorum (ve ayrıca bilmek isterim), ancak birisine yardımcı olması durumunda çirkin çözümüm. Windows kullanıyorum, kendime basitçe şunları içeren basit bir toplu komut dosyası oluşturdum:

"%1" "%2"

Sonra görevlerim.json şuna benzer

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

Sonunda bunu çalıştırdım. Son 9 ay içinde VS Code, görevdeki arg 1'e taskName'i eklemeye başladı. Yani toplu dosyam sahip olduklarınızın yerine: "% 2" "% 3" olur. Bu tutarlı kalırsa, bu çözümü düzenlemek için geri gelebilirim.
phil

6

Görevler özelliğinde birden fazla görev listeleyebilirsiniz. Gibi bir şey:

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

7
Yine de aynı komutu kullanmak zorundalar. Yalnızca argümanları değiştirebilirsiniz.
Edward B.

Evet Edward B. bazı nedenlerden dolayı, mevcut her blog gönderisinde VS Code ile yeni başladığınızı ve henüz göreviniz olmadığını varsayar: S. Ancak kök düğümde "suppressTaskName": true değerini ayarlamanız gerekir ve daha sonra farklı komutları kullanmak için alt görevlerde "görevAdı" ayarlamanız gerekir. @Dan with tscand mochatasks örneğine bakın .
Bart

4

Bu işlevsellik, Visual Studio Code v1.9'da (Ocak 2017) eklenmiştir . Örnek ve metin, sürüm notlarından gelir :

{
  "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
    }
  ]
}

Görev başına komut

Artık görev başına farklı komutlar tanımlayabilirsiniz ( # 981 ). Bu, kendi kabuk komut dosyanızı yazmadan farklı görevler için farklı komutların çalıştırılmasına izin verir. tasks.jsonGörev başına komut kullanan bir dosya [yukarıdaki] gibi görünür.


3

Bu, v0.5.0'dan İtibaren Bir VSCode Hatası Olarak Görünüyor

Bu yüzden, @hurelu tarafından daha önce açıklanmış olanın çalışan bir örneğini göstermek için bu yanıtı ekledim. Görevlerim.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));
    }

}

İlk görevin isBuildCommand'ı kullandığına dikkat edin, bu nedenle CTRL + SHFT + B başlar ve sonraki görev isTestCommand olduğundan CTRL + SHFT + T başlatılır. Bununla birlikte, ilk görevi değiştirgeleri kabul etmek için almak için görev adı ve bağımsız değişkenlerin tersine çevrilmesi gerekiyordu.

VSCode 0.5.0'dan itibaren yukarıdakiler çalışır ancak aşağıdakiler çalışmaz:

{
    "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"
            ]
        }
    ]
}

İşte task.json'dan doğru görev ve args sırasına sahip çıktı:

[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

İşte args kullanırken taskname ve arg tersine çevrilmiş görevler.json'dan doğru çıktı:

[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

İtibariyle Şubat 2017 sürümü, sen bağımlılık görevleri kurarak Terminali Runner ve oluşturma birden fazla görev kullanabilirsiniz. Her görev için ayrı bir entegre terminal açacak olması biraz garip, işlerin işe yarayıp yaramadığını görmek için izlemeniz ve kapatmayı hatırlamanız ("yığılıyorlar") ve "tamamlandı" bildirimi almazsınız. ama işi halleder. İşlevsellik başlangıç ​​niteliğindedir, ancak umut vericidir. İşte bir Cordova uygulaması için tsc ve jspm'yi çalıştırmak için bir örnek.

{
// 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"]
    }]
}

Daha sonraki bir görev sürümünü kullanmak için en iyi notlar. İşleri çok daha kolay hale getirir!
2017

1

Aşağıdakiler benim için çalıştı:

task.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'ı çalıştırın: vscode Run testlerinden Ctrl + Shift + B: vscode'dan Ctrl + Shift + T


1

Bu benim için çalışıyor ...

Burada birçok farklı cevap olduğunu biliyorum ama yaklaşımım biraz daha farklıydı, bu yüzden 2 peni değerimi ekleyeceğimi düşündüm.

Windows'tayım ve komutlarımı çalıştırmak için harici bir toplu iş dosyası kullanıyorum. Bu Jonathan'ın yukarıdaki cevabına benziyor ama ona herhangi bir komut aktarmıyorum, bu da "tasks.json" dosyamın farklı olduğu anlamına geliyor.

Bu yaklaşımı zamanla değiştirebilirim (örneğin, henüz yudumla oynamaya başlamadım) ama bu yöntem şu anda benim için mükemmel çalışıyor.

Html şablonlama için gidon kullanıyorum, babel, böylece ES6 kodunu ve hataları algılamak için bir kod linterini kullanabiliyorum. Sonunda, toplu iş dosyası başlangıç ​​sayfamla (index.html) bir tarayıcı başlatır

İşte run_tasks.bat adlı toplu iş dosyam:

@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!

Ve işte tasks.json dosyam:

{ 
    "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"
        }
}

Daha sonra VSCode'da toplu iş dosyamı çalıştırmak için “CTRL + SHIFT + B” ye basıyorum.


1

Daha az stil sayfası derlemesi ve ardından programı oluşturması ve başlatması gereken bir Electron uygulamam var. Benim için çalışan @ Ocean'ın çözümünü kullandım ... başka hiçbir şey işe yaramadı.

Hem tasks.json hem de build-tasks.bat dosyası, projenin kök dizinindeki .vscode dizinindedir.

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!

task.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

Bu iş parçacığı sayesinde, artık osx üzerinde vscode'da çalışan c # / dnxcore50 derleme ve test hata ayıklama vb. Var:

{
"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"    
    }      
]
}

Eminim linux temelde aynı olacaktır. Beni rahatsız eden tek şey, .csproj dosyalarını sadece hata ayıklamak için saklamaktır. Birkaç haftadır bakmamış olsam da, dnx ile hata ayıklamanın bir yolunu dört gözle bekliyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.