将 TypeScript 应用程序发布到 Azure 时找不到模块“../lib/tsc.js”

Jor*_*rdi 10 azure node.js npm typescript azure-devops

我正在尝试将打字稿应用程序发布到在 Linux 上运行的 Azure 应用服务。我正在使用 Azure DevOps 执行此操作。我已经设置了成功的构建和发布管道,但是当我访问应用程序服务的 URL 时,我看到一条消息“:c 应用程序错误”,它引用了诊断日志。这些日志给我以下错误:

错误:找不到模块“../lib/tsc.js”

完整的错误日志

myApp@1.0.0 prod /home/site/wwwroot
> npm run build && npm run start
> myApp@1.0.0 build /home/site/wwwroot
> tsc
internal/modules/cjs/loader.js:583
throw err;
^
Error: Cannot find module '../lib/tsc.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object. (/home/site/wwwroot/node_modules/.bin/tsc:2:1)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! myApp@1.0.0 build: `tsc`
npm ERR! Exit status 1
Run Code Online (Sandbox Code Playgroud)

我的 Azure Devops 环境由构建管道和发布管道组成,前者执行 npm 安装并将其发布到工件,后者执行部署然后运行启动命令。这些步骤成功并运行了启动命令,但它会产生上述错误。

我尝试在创建工件之前构建应用程序,但这在构建步骤中出现错误,无法找到正在导入的文件。我可以在本地运行npm run prod命令,没有任何问题。

有谁知道这可能是什么原因造成的?

包.json

{
"name": "MyApp",
"version": "1.0.0",
"description": "",
"main": "./dist/index.js",
"scripts": {
"build": "tsc",
"dev": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec ts-node src/index.ts",
"start": "nodemon ./dist/index.js",
"prod": "npm run build && npm run start",
"test": "mocha --ui tdd -r ts-node/register tests/**/*.test.ts"
},
"author": "",
"license": "ISC",
"dependencies": {
    "@google/chatbase": "^1.1.2",
    "@types/express": "^4.17.0",
    "actions-on-google": "^2.7.1",
    "body-parser": "^1.19.0",
    "dotenv": "^8.0.0",
    "express": "^4.17.1",
    "morgan": "^1.9.1",
    "nodemon": "^1.19.1",
    "ssml-builder": "^0.4.3",
    "ts-sinon": "^1.0.17",
    "ts-node": "^8.3.0",
    "tsc-watch": "^2.2.1",
    "typescript": "^3.5.3",
    "uuid": "^3.3.2"
    },
"devDependencies": {
    "@types/chai": "^4.1.7",
    "@types/mocha": "^5.2.7",
    "chai": "^4.2.0",
    "mocha": "^6.1.4"
}
}
Run Code Online (Sandbox Code Playgroud)

Tsconfig.json

{
"compilerOptions": {
"module": "commonjs",
  "moduleResolution": "node",
  "pretty": true,
  "sourceMap": true,
  "target": "es6",
  "outDir": "./dist",
  "baseUrl": "./src",
  "resolveJsonModule": true,
  "esModuleInterop": true,
},
"include": [
  "src/**/*.ts",
  "src/data/*.json",
  "src/data/sounds/*.mp3"
],
"exclude": [
  "node_modules"
]
}
Run Code Online (Sandbox Code Playgroud)

小智 17

由于复制而面临同样的问题node_modules

解决方案

以下更改package.json解决了该问题:

"scripts": {
  "build": "./node_modules/typescript/bin/tsc", // not just "tsc"
  ...
}
Run Code Online (Sandbox Code Playgroud)

描述

原始 tsc 脚本位于node_modules/typescript/bin/tsc,但该文件的符号链接位于node_modules/.bin/tsc

虽然node_modules/.bin/tsc是符号链接,但导入../lib/tsc.js工作正常,但复制后这只是一个具有相同内容的文件,因此复制会破坏相对路径的导入。

因此指定原始 tsc 脚本的路径可以解决这个问题。

  • 这应该被接受的答案 (3认同)

Fla*_*oia 7

解决了

rm -rf your_project/node_modules
Run Code Online (Sandbox Code Playgroud)


sta*_*SFT 2

您正在使用tsc命令来编译您的 typescript 文件,这样,它不会将必要的包代码包含到结果文件(js)中,因此您需要将node_modules文件夹(包括包文件)上传/发布到/home/ site/wwwroot也可以(可以通过发布将node_modules与结果文件一起发布)。

您可以通过 webpack 编译 typescript 文件,它可以将包的代码包含到结果文件中。https://webpack.js.org/guides/typescript/