npx ts-lint не может найти модуль 'typcript' при запуске в докере

Я настраиваю dockerized среду разработки для узла / машинописи для проекта API. Цель состоит в том, чтобы запустить все в 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 для создания образа.

[/редактировать]

Когда я запускаю команду 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'

Я думаю, что это связано с разрешением модуля, но я точно не знаю этого. Я вижу, что люди устанавливают машинописный текст глобально, но это означало бы, что мне нужно сделать Dockerfile вместо использования стандартного образа узла. Я не против использовать Dockerfile для dev, но я думаю, что должен быть способ сделать эту работу без этого.

1 ответ

Так что я разобрался с ответом. Это не было очевидно, и я наткнулся на это случайно.

Я установил ts-lint (см. package.json выше), и я увидел пример, на который ссылается tslint (без дефиса).

Итак, я удалил ts-lint и установлен tslint и это работало как чемпион. Я не уверен, в чем разница, но тот, с дефисом, не работает в конфигурации моего проекта. Кроме того, тот, у которого нет дефиса, установил более высокий номер версии, чем тот, у которого есть дефис.

Смотрите мой новый 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 tslint --project ./ 'src/**/*.ts?(x)' $@"
  },
  "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",
    "tslint": "^5.12.0",
    "typescript": "^3.2.2"
  }
}

Это работает при запуске в Docker-контейнере, просто используя открытый узел:10 image. Для установки каких-либо глобальных зависимостей не требуется Dockerfile.

Пытаться

yarn global add tslint typescript

или если он жаловался на разрешения:

sudo yarn global add tslint typescript
Другие вопросы по тегам