Как разрешить ситуацию с курицей/яйцом с помощью "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).