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