我以前使用gulp并运行gulp从Visual Studio Code debugger启动我的应用程序和监听器,但最近需要通过 npm 切换到运行脚本。不幸的是,在VSCode中,我无法通过调试器运行 npm 脚本,因此我不得不求助于运行 node 直接启动我的服务器摆脱我自动重新加载代码的监听器任务。
这似乎应该很简单,但到目前为止,我还没有多少运气。以下是我尝试使用的launch.json文件的片段,但无法找到 npm 。
{
...
"program": "npm",
"args": [
"run",
"debug"
],
...
}
这给了我以下错误。
错误请求'启动':程序' c:\ myproject \ npm'不存在
相关资源:
答案 0 :(得分:20)
似乎VS Code将支持release from October 2016中的npm脚本和其他启动方案。
以下是proposed on GitHub的示例。
packages.json
"scripts": {
"debug": "node --nolazy --debug-brk=5858 myProgram.js"
},
vscode启动配置
{
"name": "Launch via NPM",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "npm",
"runtimeArgs": [
"run-script", "debug"
],
"port": 5858
}
答案 1 :(得分:17)
在.vscode / launch.json中配置新的调试目标:
{
"name": "Attach To npm",
"type": "node",
"request": "attach",
"port": 5858,
"address": "localhost",
"restart": false,
"sourceMaps": false,
"outDir": null,
"localRoot": "${workspaceRoot}",
"remoteRoot": null
}
使用--debug-brk选项配置你的npm运行节点:
"scripts": {
"start": "node app.js",
"debug": "node --debug-brk app.js"
...
从shell中启动您的应用:
$npm run debug
默认情况下,程序将在端口5858中等待附加调试器
因此,在Visual Studio代码中运行调试器("附加到npm")。
享受您的调试器:)
答案 2 :(得分:6)
我认为您正在寻找的是以下配置。
将以下对象添加到 configurations
文件中的 .vscode/launch.json
数组。
{
"command": "npm run dev",
"name": "Run npm dev",
"request": "launch",
"type": "node-terminal"
}
现在尝试使用新配置进行调试。 VSCode 会处理调试器附件。
不要忘记用您想要的命令替换 npm run dev
。
答案 3 :(得分:3)
这是我的 launch.json 的样子,而且它有效:
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch via NPM",
"request": "launch",
"runtimeArgs": [
"run-script",
"dev"
],
"runtimeExecutable": "npm",
"skipFiles": [
"<node_internals>/**"
],
"type": "pwa-node"
}
]
}
答案 4 :(得分:2)
我尝试了GutiMac和Jpierson提供的解决方案,但由于某些原因,我无法使调试器与其中任何一个一起工作。
对我来说很好的替代解决方案(Ubuntu 16,节点8.9.1,VS 1.8.1)是使用这个简单的应用程序启动器(将在VS launch.json的配置数组中添加):
#myModal
答案 5 :(得分:2)
使用npm可行,而不必更改scripts
中的package.json
部分
这里的技巧是将--inspect-brk=9229
传递给节点。
该命令看起来像npm run start -- --inspect-brk=9229
这里是.vscode/launch.json
:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch via NPM",
"runtimeExecutable": "${env:NVM_BIN}/npm", //change this to your npm path
"runtimeArgs": [
"run-script",
"start",
"--",
"--inspect-brk=9229"
],
"port": 9229
},
]
}
答案 6 :(得分:2)
在运行外部npm运行脚本时,我还没有找到如何将--inspect-brk=9229
传递给node
的解决方案。因此,这是解决方法启动配置的解决方案。
如果要使用参数或什至脚本链来调试外部npm脚本,则可以直接从节点运行它们。例如,诸如angular-cli运行脚本之类的脚本:
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
},
大多数外部票据都位于node_modules/bin
文件夹中。您只需要找到脚本并弄清楚它运行的js文件。对于ng
,它node_modules/@angular/cli/bin/ng
。这是最终的启动配置:
{
"type": "node",
"request": "launch",
"name": "Launch ng build",
"runtimeExecutable": "node",
"runtimeArgs": [
"--inspect-brk=9229",
"node_modules/@angular/cli/bin/ng"
],
"args": ["build"],
"port": 9229
}
因此,当您开始调试时,您将启动下一个命令:
node --inspect-brk=9229 node_modules/@angular/cli/bin/ng build
现在您可以在外部脚本中设置断点了。
答案 7 :(得分:0)
我的情况有些不同。我正在测试一个api服务器和一个客户端(针对该api服务器)。这对我有用。
(api服务器的)package.json
"scripts": {
"start": "DEBUG=users:* PORT=3333 SEQUELIZE_CONNECT=models/sequelize-sqlite.yaml node user-server",
"debug": "DEBUG=users:* PORT=3333 SEQUELIZE_CONNECT=models/sequelize-sqlite.yaml node --inspect-brk user-server"
},
launch.json (属于api服务器)
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to Remote",
"address": "localhost",
"port": 9229,
"localRoot": "${workspaceFolder}",
"remoteRoot": "${workspaceFolder}",
"skipFiles": [
"<node_internals>/**"
]
},
完成后,我将执行以下操作。
这将运行api服务器,并使调试器开始为我调试。
最后,要实际测试api客户端,我将像这样运行api客户端文件。 注意-所有文件都在根文件夹中。如果文件分布在其他位置,则必须相应地修改localRoot和remoteRoot。
PORT=3333 node users-add-testthisman1.js
在这里,重要的是要注意我的客户端配置。
var client = restify.createJsonClient({
url: 'http://localhost:'+process.env.PORT,
version: '*'
});
如果您有不同的配置,那么您的命令行当然会有不同的参数。
答案 8 :(得分:-3)
NPM脚本和gulp并不是真正用于启动应用程序,而是用于运行编译等任务。如果它是节点应用程序,我建议您在没有npm的情况下以这种方式配置launch.json。如果您有复杂的侦听器或PM2等流程管理器,请从流程管理器手动启动应用程序,然后使用Attach配置。
对于npm 任务,您可以使用"command": "npm"
和"args": ["run"]
指定tasks.json。