Угловой CLI 6: Где разместить библиотечные зависимости

Я конвертирую библиотеку (ng-app-state) для использования углового cli, теперь, когда v6 поддерживает библиотеки (yay!).

После создания лесов и копирования в каком-то коде, вот мой первый вопрос: как/где я могу добавить зависимостей сторонних разработчиков? Для package.json, или к projects/ng-app-state/package.json?

Ответ 1

Оказывается, ответ подобен "обоим". Понимание ответа происходит из этого:

  • package.json - это то, что будет использоваться во время разработки. Вы фактически устанавливаете все свои библиотеки здесь для вашего собственного использования, в том числе те, которые пользователям также понадобятся. У вас должен быть только node_modules/ в корне вашего проекта, а не в каталоге библиотеки (так что только запустите npm install и аналогичный здесь).
  • projects/ng-app-state/package.json - это то, что будет развернуто до npm (с некоторыми дополнительными полями, добавленными процессом сборки). Поэтому скопируйте в dependencies и/или peerDependencies которые peerDependencies пользователям вашей библиотеки. Здесь нет смысла devDependencies.

Это полный ответ. Читайте дальше, чтобы увидеть пример.

В моем случае package.json имеет длинный список многих dependencies и devDependencies (вы можете увидеть его здесь), но все это влияет только на меня (и всех, кто хочет внести вклад в состояние ng-app-state). projects/ng-app-state/package.json намного меньше, и это влияет на пользователей моей библиотеки:

{
  "name": "ng-app-state",
  "version": "8.0.0",
  "author": "Simonton Software",
  "license": "MIT",
  "repository": "simontonsoftware/ng-app-state",
  "peerDependencies": {
    "@angular/common": ">=6.0.0 <7.0.0",
    "@angular/core": ">=6.0.0 <7.0.0",
    "@ngrx/store": ">=6.0.0 <7.0.0",
    "micro-dash": ">=3.5.0 <4.0.0"
  }
}

После запуска ng build np-app-state --prod чтобы сгенерировать то, что будет выпущено до npm, это то, что заканчивается в dist/ng-app-state/ (что и должно быть опубликовано):

{
  "name": "ng-app-state",
  "version": "8.0.0",
  "author": "Simonton Software",
  "license": "MIT",
  "repository": "simontonsoftware/ng-app-state",
  "peerDependencies": {
    "@angular/common": ">=6.0.0 <7.0.0",
    "@angular/core": ">=6.0.0 <7.0.0",
    "@ngrx/store": ">=6.0.0 <7.0.0",
    "micro-dash": ">=3.5.0 <4.0.0"
  },
  "main": "bundles/ng-app-state.umd.js",
  "module": "fesm5/ng-app-state.js",
  "es2015": "fesm2015/ng-app-state.js",
  "esm5": "esm5/ng-app-state.js",
  "esm2015": "esm2015/ng-app-state.js",
  "fesm5": "fesm5/ng-app-state.js",
  "fesm2015": "fesm2015/ng-app-state.js",
  "typings": "ng-app-state.d.ts",
  "metadata": "ng-app-state.metadata.json",
  "sideEffects": false,
  "dependencies": {
    "tslib": "^1.9.0"
  }
}

Ответ 2

Он должен быть добавлен в package.json как peerDependencies

Ответ 3

Зависимости сторонних сторон должны размещаться в dependencies projects/ng-app-state/package.json

Однако, если зависимости сторонних сторон также поддерживают ng 6, тогда у вас есть другой вопрос и сложность, выходящие за рамки этого вопроса. Я кратко скажу, что вам, возможно, придется называть обновление ng в своих библиотеках или разработать схемы, которые называют их, которые ожидают, что их версия библиотеки ng 6 будет присутствовать.