Angular CLI 6: куда ставить зависимости библиотеки

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

После создания лесов и копирования некоторого кода, вот мой первый вопрос:

Как / где мне добавить сторонние зависимости?

To package.json, or to projects/ng-app-state/package.json?


person Eric Simonton    schedule 05.05.2018    source источник


Ответы (3)


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

  • package.json - это то, что будет использоваться во время разработки. Фактически вы устанавливаете здесь все свои библиотеки для собственного использования, включая те, которые также понадобятся пользователям. У вас должен быть каталог node_modules/ только в корне вашего проекта, а не в каталоге библиотеки (поэтому запускайте только npm install и аналогичные здесь).
  • projects/ng-app-state/package.json - это то, что будет развернуто в npm (с некоторыми дополнительными полями, добавленными в процессе сборки). Так что скопируйте dependencies и / или 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"
  }
}
person Eric Simonton    schedule 18.08.2018
comment
Итак, я установлю зависимость в корневую папку (само приложение, так как есть только одно node_modules) и скопирую строку "materialize-css": "^1.0.0" в projects / project-name / package.json в peerDependencies ? - person Sunil Garg; 26.12.2018
comment
Если это должна быть одноранговая зависимость для ваших пользователей, тогда да, именно так. - person Eric Simonton; 30.12.2018
comment
Если я использую миксины bootstrap scss и все в библиотеке, как я могу выполнить загрузку библиотеки? - person Janier; 22.01.2019
comment
Ясно, как грязь. Где именно документация о том, что входит в библиотеку package.json? - person Rick O'Shea; 17.02.2019
comment
Но затем, после добавления зависимостей пиров в подпроект, как построить подпроект? У меня проблема с его созданием stackoverflow.com/questions/56278286/ < / а> - person Stephane; 24.05.2019
comment
Забавно, что каждый создает свою собственную библиотеку angular + materialize-css, и для их версии 1.0.0 не появляется никаких реальных кандидатов с открытым исходным кодом. Я постараюсь сделать один для своей компании и поделюсь им, если он будет работать достаточно хорошо. - person Leogout; 22.03.2020

Его следует добавить в package.json как peerDependencies

person Jagan    schedule 10.05.2018
comment
Поскольку peerDependencies не устанавливается автоматически npm, не означает ли это, что я Придется ли вручную устанавливать все зависимости модуля в моем приложении после импорта модуля из NPM? - person Nathan Friend; 11.05.2018
comment
@NathanFriend, да, ты должен. Это именно то, на что указывает peerDependencies библиотеки - пожалуйста, установите следующие зависимости, чтобы использовать библиотеку. - person Jagan; 14.05.2018
comment
Хорошо, я установил зависимость, например: npm install lodash, тогда как импортировать это в файл канала (компонент)? - person OPV; 25.10.2018
comment
для автоматической установки 3-сторонней зависимости библиотеки вы можете добавить ее в качестве зависимости и в ng-package.json включить это свойство, чтобы ng-packagr позволил продолжить процесс сборки. whitelistedNonPeerDependencies: [fortawesome], - person Jmainol; 17.11.2020

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

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

person bhantol    schedule 25.05.2018
comment
для автоматической установки 3-сторонней зависимости библиотеки вы можете добавить ее в качестве зависимости и в ng-package.json включить это свойство, чтобы ng-packagr позволил продолжить процесс сборки. Вот объяснение: medium.com/@aselvini/ whitelistedNonPeerDependencies: [fortawesome], - person Jmainol; 17.11.2020