【问题标题】:'ts-node' is not recognized as an internal or external command, operable program or batch file'ts-node' 不是内部或外部命令、可运行程序或批处理文件
【发布时间】:2017-11-29 13:07:08
【问题描述】:

我的 Vs Code 终端和命令提示符出现错误,提示 'ts-node' 未被识别为内部或外部命令、可运行程序或批处理文件。 我正在尝试终端 npm run dev 中的启动命令,我也添加了我的 package.json 文件。

{
"name": "tsnode",
"version": "1.0.0",
"description": "ts-node experiment.",
"scripts": {
    "dev": "nodemon --exec 'ts-node --cache-directory .tscache' ./server.ts",
    "start": "ts-node --fast ./server.ts"
},
"author": "Mugesh",
"license": "ISC",
"dependencies": {
    "@types/body-parser": "^1.16.3",
    "@types/chalk": "^0.4.31",
    "@types/express": "^4.0.35",
    "@types/node": "^7.0.18",
    "body-parser": "^1.17.1",
    "chalk": "^1.1.3",
    "express": "^4.15.2",
    "nodemon": "^1.11.0",
    "ts-node": "^3.0.4",
    "typescript": "^2.3.4"
}

}

【问题讨论】:

  • 这真的很简单 - 如果您在项目中本地安装它,那么您需要通过 node_modules 的 .bin 中的符号链接访问它,即:./node_modules/.bin/ts-node 或全局安装(不太健壮的解决方案,因为版本会因项目而异)

标签: node.js typescript2.0 ts-node


【解决方案1】:

Nodemon is for watching 并在文件更改时重新运行节点进程。安装在 node_modules 目录中的本地 ts-node--exec 参数的范围内无法识别。为了解决这个问题,有人建议在全球范围内安装ts-node。正如用户指出的那样,这不是一个好的解决方案,因为它依赖于项目外部的包,并且使我们的 node_modules 中的 ts-node 毫无意义。

要修复您的解决方案,请在 ts-node 前面加上 npx 助手,这将使用您的本地 node_module 可执行文件。

package.json,在scripts 块内:

"start": "nodemon --watch './src/**/*' -e ts --exec 'npx ts-node src/index.ts'"

另一种方法是将 typescript watcher 与现有的 node 命令和 concurrently 包一起使用。

"start": "concurrently \"tsc --watch\" \"node ./dist/index.js\""

同样的原则。一个包监视更改(nodemon 和 tsc)并重新启动第二个进程(节点/ts-node 服务器)。

2021 年 11 月 17 日编辑: 我退回了这篇文章以将其用作设置原型构建的参考,发现上面的 nodemon 方法不再有效,它现在抛出错误:

''npx' is not recognized as an internal or external command,
operable program or batch file.

我发现一个解决方法是将所有单引号转换为转义双引号。

"start": "nodemon --watch \"./src/**/*\" -e ts --exec \"npx ts-node src/index.ts\""

猜想自从我的原始帖子以来发生了一些变化。希望对您有所帮助!

【讨论】:

    【解决方案2】:

    你可以试试下面的命令

    "dev": "nodemon --watch './**/*.ts' --exec \"ts-node\" src/index.ts"
    

    这对我有用。

    【讨论】:

      【解决方案3】:

      如果您在 Windows 下工作,则不能在 json 文件中使用单引号。这就是为什么你必须用双引号(")替换所有单引号(')。 但是在两个双引号(“)之间你必须使用转义的双引号(”)。 对于当前情况,您必须更改文件 package.json 中的行:

      "dev": "nodemon --exec 'ts-node --cache-directory .tscache' ./server.ts",

      入行:

      "dev": "nodemon --exec \"ts-node --cache-directory .tscache\" ./server.ts",

      【讨论】:

        【解决方案4】:

        我在 npm install ts-node 之后运行了这个命令。 这解决了我的问题:

        npm install -D tslib @types/node
        

        【讨论】:

          【解决方案5】:

          就像某些答案中建议的那样,您应该在本地而不是全局安装 ts-nodenpx 使使用 CLI 工具和其他托管在注册表 as explained here 上的可执行文件变得容易。因此,可用于在您的终端上运行ts-node,甚至可以从您的package.json 文件中运行脚本。例如;

          将此作为我的package.json 文件

          {
          ...
           "scripts": {
             "start": "npx nodemon path/to/file"
            }
          }
          

          现在运行npm run start 不会再出现任何问题。

          【讨论】:

            【解决方案6】:

            如果您在 vs-code 中使用 code-runner,则编辑 setting.json 文件

            "typescript": "tsc $fileName && node $fileNameWithoutExt.js "

            【讨论】:

              【解决方案7】:

              唯一对我有用的解决方案:

              "start": "nodemon --exec npx ts-node ./index.ts",
              

              【讨论】:

              • 尝试所有答案,终于成功了。
              • 为我工作。我创建了一个 dev: 而不是 start: 脚本,并使用 npm run dev 运行它
              • 这很好,但是为什么每个人都跳过了你的答案?
              【解决方案8】:

              我通过删除 ts-node 周围的单个 quorts 解决了这个问题。如下所示 "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts"

              更新为 "dev": "nodemon --watch 'src/**/*.ts' --exec ts-node src/index.ts"

              请注意。我的环境是windows 10和npm version6.14.4

              【讨论】:

              • 我的原始项目是在 Ubuntu 18 上构建的,并且可以正常运行。移到win10,出现此错误,这对我有用。
              【解决方案9】:

              我遇到了类似的问题,但我已经通过更换解决了

              "dev": "nodemon --exec 'ts-node --cache-directory .tscache' ./server.ts",
              

              "dev": "nodemon --exec ts-node --cache-directory .tscache ./server.ts",
              

              只需删除单引号(')并全局安装 ts-node

              【讨论】:

                【解决方案10】:

                我遇到了同样的问题。我发现我的问题的解决方案已经解决,当我只是先运行这个命令"npm run build" 然后尝试它nodemon 并添加package.json

                "scripts": {
                "test": "echo \"Error: no test specified\" && exit 1",
                "build": "tsc",
                "dev": "ts-node ./lib/server.ts",
                "start": "nodemon ./dist/server.js",
                "prod": "npm run build && npm run start"}
                

                【讨论】:

                  【解决方案11】:

                  我在 Windows 上遇到了同样的问题。当我纠正了一些错误的'

                  时,我发现我的问题的解决方案已解决

                  原文:

                  "scripts": {
                      "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts",
                      "build": "tsc",
                      "start": "node dist/index.js"
                  }
                  

                  固定:

                  "scripts": {
                      "dev": "nodemon --watch 'src/**/*.ts' --exec \"ts-node\" src/index.ts",
                      "build": "tsc",
                      "start": "node dist/index.js"
                  }
                  

                  如果不清楚,区别在于我不再将ts-node 包裹在'

                  * 编辑 * 我根据上面@RoutesMaps.com 的答案更改了这一点。这解决了我的问题并删除了',但@RoutesMaps.com 实际上解释了问题的解决方案

                  【讨论】:

                    【解决方案12】:

                    如果您的 ts-node 不工作,作为替代方案,您可以执行以下操作:

                    1) 本地安装nodemon --> npm i nodemon

                    2) 在您的 package.json 'scripts' 中添加以下内容:

                    "scripts": {
                        "start": "nodemon index.ts",
                        "test": "echo \"Error: no test specified\" && exit 1"
                      },
                    

                    3) 现在运行 npm start(这将自动为您运行节点,但这不会编译 TS)

                    4) 在终端/命令行中打开一个新选项卡,cd 工作所在的文件夹并运行 tsc index.tsc --watch
                    这将编译您的打字稿。唯一的缺点是您只需要打开两个选项卡,一个用于自动运行节点,另一个用于自动编译,但这有效。

                    【讨论】:

                      【解决方案13】:

                      我在使用nodemon时遇到了类似的问题:

                      • 我在全局安装了nodemon,并且仅在本地安装了ts-node

                      解决方案:

                      • 我全局安装了ts-node(仍然保持本地依赖)。

                      【讨论】:

                        【解决方案14】:

                        我将它从开发依赖项中删除并将其添加到依赖项中。这解决了我的问题。

                        【讨论】:

                          【解决方案15】:

                          对我来说,删除 node_modules 并使用 npm i 重新安装就足够了。

                          【讨论】:

                            【解决方案16】:

                            如果您使用的是 mac,这些是我想出的步骤,以便在终端中解决此问题。

                            1. 全局安装并将返回的文件路径与符号链接“ts-node”一起使用,并将此文件移动到 /usr/local/bin
                            2. 在本地安装而不保存到 package.json
                            3. 将 /node_modules 中的文件夹复制到 /usr/local/lib/node_modules/ 中
                            4. 通过打开 /ts-node/dist 并使用命令 chmod +x bin.js 确保文件是可执行的
                            5. 在 ts-node 文件夹中运行 npm i
                            6. 确保 dist 文件夹仍然存在,如果没有将其复制回来。
                            7. 在终端测试运行 ts-node,如果它不工作,它会返回错误,指出需要将哪个模块移到 ../
                            8. ts-node 运行后一定要删除文件夹 /usr/local/lib/node_modules/ts-node/node_modules

                            【讨论】:

                              【解决方案17】:

                              我遇到了同样的问题,发现它可以通过使用双引号而不是单引号来工作。

                              "dev": "nodemon --exec \"ts-node\" --cache-directory .tscache ./server.ts"
                              

                              P.S. 这是问题发生后 1 年。不确定包版本是否是一个因素。如有需要会确认。

                              【讨论】:

                              • 这主要是你在windows上,否则你可以使用单引号。
                              • 我的 Mac 上有单引号。带到 Windows 机器上,双引号或没有引号起作用......不确定这是否有意义。
                              • 这对我来说是真正的解决方案!
                              【解决方案18】:

                              我不建议在您自己的模块中依赖全局安装的ts-node,就像这里的一些答案所建议的那样。

                              如果你这样做,那么安装你的模块的任何人都需要在全局范围内安装ts-node(仅仅一个普通的npm install 是不够的)然后如果两个模块需要像@987654325 这样的东西,你就会遇到问题@ 全局安装但版本不同等。

                              为避免这种情况,您的所有依赖项都应在 package.json 中定义并在本地安装在 node_modules 中。

                              有一个鲜为人知的命令 npx 用于从本地安装在 node_modules 中的模块运行二进制文件。

                              例如,看看我安装(本地)ts-nodetypescript 时会发生什么:

                              rsp@mn-r:~/node/test/ts-test-1$ npm i ts-node typescript
                              npm WARN ts-test-1@0.0.0 No description
                              npm WARN ts-test-1@0.0.0 No repository field.
                              
                              + ts-node@6.0.3
                              + typescript@2.8.3
                              added 19 packages from 44 contributors in 2.157s
                              [+] no known vulnerabilities found [19 packages audited]
                              

                              然后我尝试运行ts-node:

                              rsp@mn-r:~/node/test/ts-test-1$ ts-node -v
                              -bash: /Users/rsp/opt/node/bin/ts-node: No such file or directory
                              

                              我可以用npx运行它:

                              127!rsp@mn-r:~/node/test/ts-test-1$ npx ts-node -v
                              ts-node v6.0.3
                              node v10.1.0
                              typescript v2.8.3
                              

                              或者我可以明确给出路径:

                              rsp@mn-r:~/node/test/ts-test-1$ ./node_modules/.bin/ts-node -v
                              ts-node v6.0.3
                              node v10.1.0
                              typescript v2.8.3
                              

                              无论如何,我不需要全局安装任何东西。

                              【讨论】:

                              • 所以解决方案是将 ./node_modules/.bin 添加到 PATH 中?为什么npmjs.com/package/ts-node 没有提到它?
                              • 底线,你的答案是:npm i ts-node typescript
                              • 通读每一个。这是迄今为止最好的解决方案。我正在使用 AWS CDK 并遇到了一个构建过程,我可以将 TS 编译委托给构建和测试阶段。这对我来说是一种很好的方式来保持这种影响力,而不是依赖于全局包。
                              【解决方案19】:

                              我刚刚遇到了类似的问题:在 Mac OS 上 --exec ts-node 有效,在 Windows 上无效。

                              我的解决方法是像这样创建nodemon.json

                              {
                                "watch": "src/**/*.ts",
                                "execMap": {
                                  "ts": "ts-node"
                                }
                              }
                              

                              并将package.json 脚本部分更改为

                              "scripts": {
                                "start": "nodemon src/index.ts"
                              },
                              

                              【讨论】:

                              • nodemon.json 的文档可以从github.com/remy/nodemon#config-files 找到,然后继续阅读下一节
                              • 谢谢,我不知道我可以用 nodemon 做到这一点
                              • 非常好,因为我们可以保持我的全局小,便于传递给其他人
                              • 谢谢。为我解决了。
                              • 这对我有用。就我而言,Nodemon 本地配置要好得多。
                              【解决方案20】:

                              您需要将 ts-node 安装为全局

                              npm install -g ts-node
                              

                              更多信息

                              https://github.com/TypeStrong/ts-node

                              【讨论】:

                              • 你是对的,如果我尝试在我的根目录(即 ts-node app.ts)中的特定文件,它可以工作,但它在我的 package.json 运行脚本中不起作用(开发)
                              • 这不是一个很好的答案,因为它依赖于其他开发人员在全球范围内安装相同的模块。看rsp的回答below
                              • 无需全局安装。
                              • 这并没有解决问题。尝试在 VS Code 中使用 Code Runner。 Typescript 预先添加成功。
                              猜你喜欢
                              • 2021-05-30
                              • 1970-01-01
                              • 2017-06-19
                              • 2021-02-18
                              • 1970-01-01
                              • 2021-02-11
                              • 2018-08-25
                              • 2014-06-01
                              • 2022-01-06
                              相关资源
                              最近更新 更多