npx ts-lint не может найти модуль 'typcript' при запуске в докере - PullRequest
0 голосов
/ 18 декабря 2018

Я настраиваю среду разработки dockerized для узла / машинописи для проекта API.Цель состоит в том, чтобы запустить все в Docker и не иметь ни одного из установленных узлов, npm или модулей, установленных на хосте.Это необходимо для изоляции всех версий узла и всех модулей от других проектов.

. / Node

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 находится в общем томе, поэтому он сохраняется на хосте после удаления контейнера.Таким образом, мне не нужен 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'

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

1 Ответ

0 голосов
/ 19 декабря 2018

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

Я установил 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 изображений.Для установки каких-либо глобальных зависимостей не требуется Dockerfile.

...