VScode使命配置详解(task.json与launch.json)

  金牌会员 | 2024-11-17 03:29:17 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

简介

vscode非常强盛,有很多可以自定义的东西,但是也不轻易上手,例如搭建一个新环境是怎样配置运行程序。
本篇文章就将具体分析vscode的怎样配置使命来完成编译等操作,怎样配置launch来debug。

  • tasks.json:配置和管理自动化使命,如编译、构建、运行脚本…
  • launch.json:配置调试器,定义调试会话的启动和运行参数
task

可以配置功能


  • 编译代码:用javac、gcc、tsc编译工具编译代码
  • 执行脚本:执行shell、Python、bat脚本
  • 构建项目:用Maven、Make、Gradle等构建工具构建脚本
  • 其他使命:清算生成文件、打包、上传…
task配置的是下令,以是它可以非常机动,可以看作是一个执行脚本的快捷方式。
参数分析

参数分析label使命名称,标识,以便于执行的时候知道是哪一个使命type使命类型,shell、process、typescript,shell通常是脚本如python、bat、各种下令,process作为独立的进程运行command执行的下令,gcc、javac、python、ps、echo等下令args下令的参数,数组group使命分组,build(构建)、test(测试)presentation控制使命输出的呈现方式,例如是否体现在终端中,是否清除之前的输出等problemMatcher配置错误和警告的匹配器,用于从使命输出中解析错误和警告,vscode内置                                                  g                                  c                                  c                                  、                                          gcc、                           gcc、eslintoptions使命执行的选项,环境变量、当前工作目次等dependsOn使命依赖,数组[“task-a”,“task-c”] 使命运行前先执行依赖使命dependsOrder依赖执行顺序,sequence按照"dependsOn使命列表顺序执行shell配置执行shell终端,cmd、git,如在Windows下不能执行shell脚本,可以配置git来执行 type的一个作用就可以根据文件匹配,例如在ts文件中按F5举行debug,vscode就知道去找type支持ts的task,例如typescript。
默认会去找group配置为kind为build,isDefault为true的task,假如有多个,就会让手动选择。
presentation参数:

  • echo: 是否输出执行的command,默认ture
  • reveal: 输出头板控制,never、silent、always, 是否在用户界面体现输出,默认always
  • focus:体现使命输出的面板是否处于焦点状态,默认false
  • panel: 面板控制,shared默认,共享; dedicated专用;new每次使命创建新面板
  • “showReuseMessage”: true-体现重用消息
  • “clear”: false-不清除之前的输出

task外部程序示例

task中也可以单独指定执行shell的终端
  1. {
  2.     "version": "2.0.0",
  3.     "tasks": [
  4.         {
  5.             "label": "task-测试shell",
  6.             "type": "shell",
  7.             "group": {
  8.                 "kind": "build",
  9.                 "isDefault": true,
  10.             },
  11.             "command": "ls",
  12.             "args": [
  13.                 "-al"
  14.             ],
  15.             "options": {
  16.                 "cwd": "${workspaceFolder}",
  17.                 "shell": {
  18.                     "executable": "E:\\tool\\Git\\bin\\bash.exe",
  19.                     "args": [
  20.                         "-c"
  21.                     ]
  22.                 }
  23.             }
  24.         }
  25.     ]
  26. }
复制代码

前面介绍了task可以通过F5调试的方式匹配执行。
还可以Ctrl+F8手动执行。
还可以在Terminal菜单选择Run Task来执行。
task输入参数示例

task也可以交互输入参数,又2中方式:

  • 一种是配置选项,运行是下拉选择pickString
  • 一种是手动输入,promptString
pickString参数:

  • description:变量分析
  • options:可选项数组
  • default:默认值。它必须在options中
promptString参数:

  • description:变量分析
  • default:默认值
  • password:是否是密码,假如是输入用*代替



  1. {
  2.     "version": "2.0.0",
  3.     "tasks": [
  4.         {
  5.             "label": "task-测试变量输入",
  6.             "type": "shell",
  7.             "windows": { //windows下执行操作
  8.                 "command": "echo",
  9.                 "args": [
  10.                     "下拉参数:${input:manual_pick}",
  11.                     "输入参数:${input:manual_input}"
  12.                 ]
  13.             },
  14.             "group": {
  15.                 "kind": "build",
  16.                 "isDefault": true,
  17.             },
  18.         }
  19.     ],
  20.     "inputs": [
  21.         {
  22.             "id": "manual_pick",
  23.             "type": "pickString", //"输入参数类型: 挑选预设的选项",
  24.             "default": "选项B",
  25.             "options": [
  26.                 "选项A",
  27.                 "选项B",
  28.                 "选项C",
  29.                 "选项D"
  30.             ],
  31.             "description": "task输入参数预设,执行时下拉选择",
  32.         },
  33.         {
  34.             "id": "manual_input",
  35.             "type": "promptString", // 输入参数类型: 直接输入的字符串
  36.             "password": false, // 如果是true,表示密码用*表示
  37.             "default": "你干嘛啊!", // 默认字符串
  38.             "description": "task参数手动输入",
  39.         },
  40.     ],
  41. }
复制代码
task内置参数示例


  1. {
  2.     "version": "2.0.0",
  3.     "tasks": [
  4.         {
  5.             "label": "task-测试vscode内置变量",
  6.             "type": "shell",
  7.             "command": "print.sh",
  8.             "args": [
  9.                 "workspaceFolder=${workspaceFolder}",
  10.                 "workspaceFolderBasename=${workspaceFolderBasename}",
  11.                 "file=${file}",
  12.                 "fileWorkspaceFolder=${fileWorkspaceFolder}",
  13.                 "relativeFile=${relativeFile}",
  14.                 "relativeFileDirname=${relativeFileDirname}",
  15.                 "fileBasename=${fileBasename}",
  16.                 "fileBasenameNoExtension=${fileBasenameNoExtension}",
  17.                 "fileExtname=${fileExtname}",
  18.                 "fileDirname=${fileDirname}",
  19.                 "fileDirnameBasename=${fileDirnameBasename}"
  20.             ],
  21.             "options": {
  22.                 "shell": {
  23.                     "executable": "E:\\tool\\Git\\bin\\sh.exe",
  24.                     "args": [
  25.                         "-i"
  26.                     ]
  27.                 }
  28.             },
  29.             "presentation": {
  30.                 "echo": true, // 显示命令  
  31.                 "reveal": "always", // 显示输出面板  
  32.                 "focus": false, // 不自动聚焦输出面板  
  33.                 "panel": "new", // 共享输出面板  
  34.                 "showReuseMessage": true, // 显示重用消息  
  35.                 "clear": false // 不清除之前的输出  
  36.             },
  37.             "group": {
  38.                 "kind": "build",
  39.                 "isDefault": true,
  40.             },
  41.         }
  42.     ]
  43. }
复制代码
  1. for arg in "$@"; do
  2.   echo "$arg"
  3. done
复制代码
更多参数分析请查察官方文档
使命依赖关系

我们把前面整合起来,来看一下使命的依赖设置:
  1. {
  2.     "version": "2.0.0",
  3.     "tasks": [
  4.         {
  5.             "label": "task-运行脚本",
  6.             "type": "shell",
  7.             "options": {
  8.                 "cwd": "${workspaceFolder}",
  9.             },
  10.             "windows": {
  11.                 "command": "base.bat",
  12.                 "args": [
  13.                     "参数1",
  14.                     "参数2"
  15.                 ],
  16.             },
  17.             "group": {
  18.                 "kind": "build",
  19.                 "isDefault": true,
  20.             },
  21.             "dependsOrder": "sequence",
  22.             "dependsOn": [
  23.                 "task-测试变量输入",
  24.                 "task-测试shell",
  25.                 "task-测试vscode内置变量"
  26.             ]
  27.         },
  28.         {
  29.             "label": "task-测试变量输入",
  30.             "type": "shell",
  31.             "group": "build",
  32.             "windows": { //windows下执行操作
  33.                 "command": "echo",
  34.                 "args": [
  35.                     "下拉参数:${input:manual_pick}",
  36.                     "输入参数:${input:manual_input}"
  37.                 ]
  38.             }
  39.         },
  40.         {
  41.             "label": "task-测试shell",
  42.             "type": "shell",
  43.             "group": "build",
  44.             "command": "ls",
  45.             "args": [
  46.                 "-al"
  47.             ],
  48.             "options": {
  49.                 "cwd": "${workspaceFolder}",
  50.                 "shell": {
  51.                     "executable": "E:\\tool\\Git\\bin\\bash.exe",
  52.                     "args": [
  53.                         "-c"
  54.                     ]
  55.                 }
  56.             }
  57.         },
  58.         {
  59.             "label": "task-测试vscode内置变量",
  60.             "type": "shell",
  61.             "command": "print.sh",
  62.             "args": [
  63.                 "workspaceFolder=${workspaceFolder}",
  64.                 "workspaceFolderBasename=${workspaceFolderBasename}",
  65.                 "file=${file}",
  66.                 "fileWorkspaceFolder=${fileWorkspaceFolder}",
  67.                 "relativeFile=${relativeFile}",
  68.                 "relativeFileDirname=${relativeFileDirname}",
  69.                 "fileBasename=${fileBasename}",
  70.                 "fileBasenameNoExtension=${fileBasenameNoExtension}",
  71.                 "fileExtname=${fileExtname}",
  72.                 "fileDirname=${fileDirname}",
  73.                 "fileDirnameBasename=${fileDirnameBasename}"
  74.             ],
  75.             "options": {
  76.                 "shell": {
  77.                     "executable": "E:\\tool\\Git\\bin\\sh.exe",
  78.                     "args": [
  79.                         "-i"
  80.                     ]
  81.                 }
  82.             }
  83.         }
  84.     ],
  85.     "inputs": [
  86.         {
  87.             "id": "manual_pick",
  88.             "type": "pickString", //"输入参数类型: 挑选预设的选项",
  89.             "default": "选项B",
  90.             "options": [
  91.                 "选项A",
  92.                 "选项B",
  93.                 "选项C",
  94.                 "选项D"
  95.             ],
  96.             "description": "task输入参数预设,执行时下拉选择",
  97.         },
  98.         {
  99.             "id": "manual_input",
  100.             "type": "promptString", // 输入参数类型: 直接输入的字符串
  101.             "password": false, // 如果是true,表示密码用*表示
  102.             "default": "你干嘛啊!", // 默认字符串
  103.             "description": "task参数手动输入",
  104.         },
  105.     ],
  106. }
复制代码
  1. @echo off
  2. echo "打印所有命令行参数"
  3. for %%i in (%*) do (
  4.     echo %%i
  5. )
复制代码
launch

launch用来配置debug,常用参数:

  • name: 配置名称,便于区分就可以
  • type: 调试器类型,python、cppdbg、node、java
  • request: 调试哀求类型,launch、attach
  • program: 要调试的程序路径或文件
  • args: 通报给程序的下令行参数,数组形式
  • cwd: 当前工作目次
  • env: 环境变量设置
  • sourceMaps: 是否启用源映射(JavaScript、TypeScript)
  • preLaunchTask: 调试前要执行的使命,通常是编译使命
  • postDebugTask: 调试竣过后要执行的使命
  • stopOnEntry: 是否在程序入口处制止。
  • console: 控制台类型integratedTerminal、externalTerminal、internalConsole
  1. {
  2.     "version": "0.2.0",
  3.     "configurations": [
  4.         {
  5.             "name": "debug-Go程序", // 名称可以在debug面板中看到区分
  6.             "type": "go", // 定义调试器的类型
  7.             "request": "launch",
  8.             "program": "${file}", // 待调试的可执行程序的路径
  9.             "args": [], // 设置可执行程序所需要的参数
  10.             "stopAtEntry": false, // 程序不会再入口点处停止(即main函数),从头运行到结束或设置的断点处
  11.             "cwd": "${workspaceFolder}", // 设置当前的工作目录
  12.             "environment": [], // 设置调试的环境变量
  13.             "externalConsole": false, // 不使用外部控制台,调试输出将显示在内置的调试控制台中
  14.             "preLaunchTask": "go-build" // tasks.json创建的任务中的label匹配
  15.         }
  16.     ]
  17. }
复制代码
配置TyepScript的task和launch

起首我们来看一下完整的目次结构:

task.json

  1. {
  2.     "version": "2.0.0",
  3.     "tasks": [
  4.         {
  5.             "label": "编译TS项目",
  6.             "type": "typescript",
  7.             "tsconfig": "tsconfig.json",
  8.             "problemMatcher": [
  9.                 "$tsc"
  10.             ],
  11.             "group": {
  12.                 "kind": "build",
  13.                 "isDefault": true
  14.             }
  15.         }
  16.     ]
  17. }
复制代码
注意type是typescript,特别的,可以指定使命配置文件
tsconfig.json

这个是typescript的配置文件。
  1. {
  2.     "compilerOptions": {
  3.         "target": "ES2016",
  4.         "module": "CommonJS",
  5.         "outDir": "dist",
  6.         "sourceMap": true
  7.     }
  8. }
复制代码
outDir是编译之后的JS文件目次。
launch.json

  1. {
  2.     "version": "0.2.0",
  3.     "configurations": [
  4.         {
  5.             "name": "调试当前TS",
  6.             "type": "node",
  7.             "request": "launch",
  8.             "skipFiles": [
  9.                 "<node_internals>/**"
  10.             ],
  11.             "program": "${file}",
  12.             "preLaunchTask": "编译TS项目",
  13.             "outFiles": [
  14.                 "${workspaceFolder}/dist/**/*.js"
  15.             ]
  16.         }
  17.     ]
  18. }
复制代码
type是node,program要执行的文件,这里配置的是当前文件,可以配置为固定路径的入口文件。
outFiles配置的是编译之后的JS文件,就是要执行的文件,假如不配或者找不到,执行的是program的ts文件,有问题,以是肯定要检查是否正确。
Debug


我们可以在debug中看到launch的name,终端中的task tab中看到task的label。
代码文件

入口文件main.ts
  1. // import tarray = require("./ts-array");
  2. // import amap = require('./ts-map');
  3. import { getArray } from "./ts-array";
  4. import * as amap from "./ts-map";
  5. // let array: string[] = tarray.getArray();
  6. let array: string[] = getArray();
  7. array.forEach(function (value) {
  8.     console.log(value);
  9. })
  10. amap.testMapIter();
  11. amap.testMapBaseFun();
复制代码
测试文件:
  1. export {getArray}
  2. function getArray(): string[] {
  3.     return new Array("Java", "Go", "C++", "Rust", "Python", "C", "PHP", "SQL", "TypeScript");
  4.   }
  5.   
  6.   function testArrayBase() {
  7.     let array: string[];
  8.     array = getArray();
  9.     console.log(array[0]);
  10.     console.log(array[1]);
  11.   
  12.     let nums: number[] = [1, 2, 3, 4]
  13.     console.log(nums[0]);
  14.     console.log(nums[1]);
  15.     console.log(nums[2]);
  16.     console.log(nums[3]);
  17.   }
  18.   
  19.   function testArrayLength() {
  20.     let nums = new Array(4);
  21.     for (let i = 0; i < nums.length; i++) {
  22.       nums[i] = i * 2;
  23.   
  24.     }
  25.   
  26.     for (let i in nums) {
  27.       console.log(nums[i]);
  28.     }
  29.   
  30.     var language = getArray();
  31.     for (var i = 0; i < language.length; i++) {
  32.       console.log(language[i]);
  33.     }
  34.   }
  35.   
  36.   testArrayBase();
  37.   testArrayLength();
复制代码
  1. export {testMapBaseFun,testMapIter}
  2. function testMapIter() {
  3.     let map = new Map();
  4.   
  5.     map.set("Java", 1);
  6.     map.set("C++", 2);
  7.     map.set("Go", 3);
  8.   
  9.     // 迭代 Map 中的 key
  10.     for (let key of map.keys()) {
  11.       console.log(key);
  12.     }
  13.   
  14.     // 迭代 Map 中的 value
  15.     for (let value of map.values()) {
  16.       console.log(value);
  17.     }
  18.   
  19.     // 迭代 Map 中的 key => value
  20.     for (let entry of map.entries()) {
  21.       console.log(entry[0], entry[1]);
  22.     }
  23.   
  24.     // 使用对象解析
  25.     for (let [key, value] of map) {
  26.       console.log(key, value);
  27.     }
  28.   }
  29.   
  30.   function testMapBaseFun() {
  31.     let map = new Map();
  32.   
  33.     map.set("Java", 1);
  34.     map.set("C++", 2);
  35.     map.set("Go", 3);
  36.   
  37.     // 获取键对应的值
  38.     console.log(map.get("Go"));
  39.   
  40.     // 判断 Map 中是否包含键对应的值
  41.     console.log(map.has("Python"));
  42.     console.log(map.has("Java"));
  43.   
  44.     // 返回 Map 对象键/值对的数量
  45.     console.log(map.size);
  46.   
  47.     // 删除元素,删除成功返回true
  48.     console.log(map.delete("Go"));
  49.     console.log(map);
  50.     // 移除 Map 对象的所有键/值对
  51.     map.clear();
  52.     console.log(map);
  53.   }
  54.   
  55.   testMapIter();
  56.   testMapBaseFun();
复制代码
更多配置可以参考官网
异常情况

powershell不能用的情况:
  1. Executing task: tsc -p d:\project\front\ts\tsconfig.json
  2. tsc : 无法加载文件 E:\language\nodejs16\node_global\tsc.ps1,因为在此系统上禁止运行脚本。
  3. 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
  4. 所在位置 行:1 字符: 1
  5. + tsc -p d:\project\front\ts\tsconfig.json
  6. + ~~~
  7.     + CategoryInfo          : SecurityError: (:) [],PSSecurityException
  8.     + FullyQualifiedErrorId : UnauthorizedAccess
  9. The terminal process "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -Command tsc -p d:\project\front\ts\tsconfig.json" terminated with exit code: 1.
  10. Terminal will be reused by tasks, press any key to close it.
复制代码
我们在vscode终端不能打开中已经有过一点介绍。
我们知道默认利用的终端也是settings.json中配置:

  1. "terminal.integrated.defaultProfile.windows": "Command Prompt"
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表