在docker中运行时,npx ts-lint无法找到模块'typescript'

时间:2018-12-18 13:53:17

标签: javascript node.js typescript docker npx

我正在为api项目的节点/打字稿设置一个dockerized开发环境。目标是在docker中运行所有内容,并且主机上未安装任何已安装的节点,npm或模块。这是为了将节点的所有版本和所有模块与其他项目隔离。

./节点

docker run \
    -it \
    -p "8080:80" \
    --rm \
    -w "/app" \
    -v "$(pwd):/app" \
    "node:10" "$@"

./ npm

#!/bin/sh
./node npm $@

./ npx

#!/bin/sh
./node npx $@

./ package.json

{
  "name": "testapi",
  "version": "0.0.1",
  "description": "a hello world api",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "npx ts-node src/app.ts",
    "lint": "npx ts-lint --project src $@"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "dotenv": "^6.2.0",
    "fastify": "^1.13.2",
    "ts-node": "^7.0.1"
  },
  "devDependencies": {
    "@types/node": "^10.12.15",
    "ts-lint": "^4.5.1",
    "typescript": "^3.2.2"
  }
}

[编辑]

我使用./npm install来构建我的node_modules。 node_modules位于共享卷中,因此在删除容器后它仍将保留在主机上。这样,我就不需要Dockerfile来构建映像。

[/ edit]

运行lint命令时,出现以下错误:

testapi$ ./npx ts-lint -i
10: Pulling from node
Digest: sha256:5af431757f84bf7878ff72447eb993fc37afcd975874fff13278157bf83661e6
Status: Image is up to date for docker-remote.registry.kroger.com/node:10
npx: installed 32 in 2.883s
Cannot find module 'typescript'

我认为这与模块分辨率有关,但是我不确定这一点。我看到人们在全球范围内安装Typescript,但这意味着我必须做一个Dockerfile而不是使用stock节点映像。我不介意为开发人员使用Dockerfile,但我认为应该有一种方法可以不进行此操作。

2 个答案:

答案 0 :(得分:1)

所以我想出了答案。这不是显而易见的,我偶然发现了它。

我已经安装了$this->user(请参见上面的package.json),并且看到了一个引用了ts-lint(没有连字符)的示例。

因此,我删除了tslint并安装了ts-lint,它的工作原理很简单。我不确定有什么区别,但是带连字符的字符在我的项目配置中不起作用。另外,没有连字符的安装版本号比有连字符的安装版本号高。

请参阅包含工作依赖项的新package.json:

tslint

仅在使用public node:10映像的情况下在docker容器中运行时有效。不需要Dockerfile即可安装任何全局依赖项。

答案 1 :(得分:0)

尝试

yarn global add tslint typescript

或者如果它抱怨许可:

sudo yarn global add tslint typescript