Возможно, вы захотите попробовать Lerna , инструмент для управления проектами JavaScript (и TypeScript) с несколькими пакетами.
Настройка
Предполагая, что ваш проект имеет следующееструктура каталогов:
packages
ionic-app
package.json
firebase-functions
package.json
shared
package.json
Убедитесь, что вы указали правильный уровень доступа (private
и config/access
ключи) во всех модулях, которые вы не хотите публиковать, а также в typings
запись в вашем shared
модуле:
Shared:
{
"name": "shared",
"version": "1.0.0",
"private": true,
"config": {
"access": "private"
},
"main": "lib/index.js",
"typings": "lib/index.d.ts",
"scripts": {
"compile": "tsc --project tsconfig.json"
}
}
Ionic-app:
{
"name": "ionic-app",
"version": "1.0.0",
"private": true,
"config": {
"access": "private"
},
"main": "lib/index.js",
"scripts": {
"compile": "tsc --project tsconfig.json"
},
"dependencies": {
"shared": "1.0.0"
}
}
С учетом вышеуказанных изменений вы можете создать root-level package.json
, где вы можете указать любой devDependencies
, к которому вы хотите, чтобы все ваши модули проекта имели доступ, например, ваш модуль модульного тестирования, tslint и т. д.
packages
ionic-app
package.json
firebase-functions
package.json
shared
package.json
package.json // root-level, same as the `packages` dir
Вы также можете использовать этокорневой уровень package.json
для определения сценариев npm, которые будут вызывать соответствующие сценарии в модулях вашего проекта (через lerna):
{
"name": "my-project",
"version": "1.0.0",
"private": true,
"scripts": {
"compile": "lerna run compile --stream",
"postinstall": "lerna bootstrap",
},
"devDependencies": {
"lerna": "^3.18.4",
"tslint": "^5.20.1",
"typescript": "^3.7.2"
},
}
После этого добавьте файл конфигурации lerna в корневой каталог:
packages
ionic-app
package.json
firebase-functions
package.json
shared
package.json
package.json
lerna.json
со следующим содержанием:
{
"lerna": "3.18.4",
"loglevel": "info",
"packages": [
"packages/*"
],
"version": "1.0.0"
}
Теперь, когда вы запускаете npm install
в корневом каталоге, сценарий postinstall
, определенный на вашем корневом уровне package.json
, вызовет lerna bootstrap
.
Что lerna bootstrap
делает так:он будет символически связывать ваш shared
модуль с ionic-app/node_modules/shared
и firebase-functions/node_modules/shared
, поэтому с точки зрения этих двух модулей shared
выглядит так же, как и любой другой модуль npm.
Компиляция
Конечно, символьных ссылок недостаточно, поскольку вам все еще нужно скомпилировать их из TypeScript в JavaScript.
Вот где вступает в действие сценарий корневого уровня package.json
compile
.
Когда вы запускаете npm run compile
в корне вашего проекта, npm вызывает lerna run compile --stream
, а lerna run compile --stream
вызывает скрипт с именем compile
в файле package.json
каждого из ваших модулей.
Поскольку каждый из вашихУ модулей теперь есть свой собственный скрипт compile
, у вас должен быть файл tsonfig.json
на модуль. Если вам не нравится дублирование, вы можете использовать tsconfig корневого уровня или комбинацию файлов tsconfig корневого уровня и tsconfig уровня модуля, унаследованных от корневого.
Если выХотелось бы посмотреть, как эта установка работает в реальном проекте, взгляните на Serenity / JS , где я довольно широко ее использую.
Развертывание
Хорошая вещь о том, что модуль shared
имеет символическую ссылку под node_modules
под firebase-functions
и ionic-app
, а ваш devDepedencies
под node_modules
под корневым каталогом проекта, состоит в том, что если вам нужно развернуть потребительский модуль где-нибудь (так чтоionic-app
, например), вы можете просто сжать все вместе с node_modules
и не беспокоиться о необходимости удалять зависимости dev перед развертыванием.
Надеюсь, это поможет!
Jan