Как разрешить ситуацию с курицей/яйцом с помощью "tsc" и "npm install"?
Поэтому у меня есть стандартная структура папок
dist/
src/
где src
имеет мои.ts файлы, а dist
имеет мои.js файлы. (У меня есть "outDir":"dist"
в файле tsconfig.json и "includes"
установлен в 'src'
).
Обратите внимание, что "dist" находится в моем файле gitignore
, поэтому он не находится в управлении версиями, и поэтому, когда он переходит к Travis или CircleCI
, ничего не происходит в папке dist
до тех пор, пока я не запустил tsc
.
Вот проблема: если я сначала запускаю npm install
это не сработает, потому что у меня есть это в моем package.json:
"bin":{
"foo" :"dist/cli.js" // dist/cli.js does not exist yet
}
но если я запустил tsc
first-tsc, тогда будут отсутствовать зависимости, которые ему нужны для компиляции, которые приходят, если я запускаю npm install
.
Единственное, что я могу решить, это установить все необходимые зависимости tsc
, затем запустить tsc, затем запустить npm install --production
.
Однако это не самая удобная вещь.
Кто-нибудь сталкивался с этой проблемой и нашел хорошее решение?
Ответы
Ответ 1
Я не помню этой проблемы, но по крайней мере в одном случае я сделал что-то, что будет работать вокруг проблемы.
Я помещаю index.js в корневую папку, которая запускает фактическую зависимость в dist. Тогда bin, который ищет npm, представляет собой файл, который присутствует, и он не должен волноваться.
Конечно, это не сработает до тех пор, пока tsc не будет запущен. Но это должно решить вашу проблему с курицей и яйцом.
Ответ 2
Похоже, что сценарий preinstall
- это то, что вам нужно
Добавьте в свой файл package.json
как
{
"scripts": {
"preinstall" : "tsc ..." // < build stuff
}
}
Ссылка https://docs.npmjs.com/misc/scripts
Ответ 3
Я бы зарегистрировал файл ./lib/cli
содержимое файла
#!/usr/bin/env node
require('../dist/cli.js')
и просто запустите npm, а затем tsc.
Ответ 4
Абсолютно не ваш ответ, но я обычно предпочитаю совершать javascript.
Нижняя сторона: тонны дополнительной истории гит/раздувания.
Мои баллы:
- В итоге вы создаете проект javascript. Поэтому нужно протестировать среду выполнения javascript, и если этот проект также предполагается использовать из машинописного
.d.ts
, протестируйте сгенерированный .d.ts
; - Версия TSC, которая генерирует ваш код, не должна быть другой движущей частью тестов и ваших потребителей. Вы проверили бы сгенерированный вывод, а не ваш источник на многие версии TSC.
- Уменьшая границу "движущихся частей" путем включения.js и.d.ts, вы получаете гораздо больше (= предсказуемость), чем то, что вы теряете (git history bloat).