Угловое 6 здание библиотеки с активами
После сборки и упаковки библиотеки Angular 6 я, похоже, не могу дать указание Угловому CLI скопировать библиотечные ресурсы в папку dist/assets
при каждой сборке.
Предполагая, что структура папки проекта -
- dist
- e2e
- node_modules
- projects
- lib1
- src
- lib
- assets
- icons
- src
Когда я запускаю ng build lib1
или ng build lib1 --prod
папка assets/icons
не копируется в dist/lib1/assets/icons
.
Если я запустил ng build
, копируются src/assets
(корневой файл src/assets), но не projects/lib1/assets
.
Файл angular.json
содержит ссылку на "assets": ["src/assets"]
но он не позволит добавлять ключ к assets
специально для проекта, только к основному корневому приложению. При добавлении я получаю следующую ошибку:
Ошибка проверки схемы с ошибками: путь данных "" НЕ должен иметь дополнительных свойств (активов).
Я также попытался добавить следующее правило копирования в активы для копирования активов в dist/lib вместо dist/appname:
"assets": [
"src/favicon.ico",
"src/assets",
{ "glob": "**/*", "input": "src/assets/icons", "output": "../lib1/assets/icons" }
],
Но я получаю следующую ошибку:
Актива не может быть записана в местоположение за пределами выходного пути.
Есть ли встроенный способ управления копией ресурса библиотеки при каждой сборке?
ОБНОВЛЕНИЕ 06/05/2018
Я открыл проблему с Angular CLI в отношении этого, но еще не слышал назад. Выпуск № 11701
Ответы
Ответ 1
В настоящее время я до сих пор не нашел официального встроенного способа сделать это.
Я открыл проблему с Угловой CLI и, надеюсь, получит ответ команды CLI.
Тем временем в моем обходном пути используются инструменты командной строки:
В package.json
я добавил:
"scripts": {
...
"build": "ng build lib1 --prod && scss-bundle -c scss-bundle.config.json && cp -R projects/lib1/src/assets/ dist/lib1/assets/",
}
Чтобы скопировать файлы SASS, я использую scss-bundle
с конфигурационным файлом scss-bundle.config.json
который содержит:
{
"entry": "./projects/lib1/src/assets/style/main.scss",
"dest": "./dist/lib1/assets/style/styles.scss"
}
Это создаст файлы SASS проекта в 1 файл и скопирует их в папку dist. Моя файловая структура SASS выглядит примерно так:
-- projects/lib1/src/assets/
-- style
-- main.scss
-- partials
-- _variables.scss
-- _styles.scss
__ _rtl.scss
Так что, как вы видите, я не хочу отправлять все сырые сасы, только один окончательный файл. Конечно, вы также можете скомпилировать его в файл .css
.
Чтобы убедиться, что все другие активы скопированы, я использую простую команду Mac OS/Linux cp -R
или rsync
.
И, конечно же, вместо запуска ng build
я npm run build
.
Надеюсь, что это поможет, и если у вас есть лучшее решение, пожалуйста, дайте мне знать.
Ответ 2
Похоже, что в будущем все это можно будет автоматизировать с помощью CLI, однако на данный момент существует несколько решений. Некоторые из них занимались написанием сценария после установки, который очень хорош, если у вас есть куча вещей, которые происходят. Одна включает в себя перемещение их вручную, но это слишком открыто для ошибки IMO. Я также видел пару пакетов npm, которые вы можете установить и которые расширяют возможности ng-packagr (ng-packagr создает ваши библиотеки, а webpack - ваши приложения).
Некоторые из них хорошие, а некоторые плохие, ИМО, я не буду вдаваться в то, что я думаю о них по отдельности, а просто поделюсь тем, что я делаю.
Я работаю над корпоративным приложением Angular и извлекаю наши функции и функции в библиотеки, чтобы в ближайшем будущем мы могли начать совместное использование кода с мини-приложениями. Из-за наших процессов и протоколов сборки мы уже не используем ng cli напрямую для создания наших проектов, вместо этого мы используем сценарии npm.
Если вы уже знакомы со скриптами NPM, пропустите их ниже, в противном случае эта заметка будет очень полезна.
С помощью Angular CLI вы запускаете что-то вроде этого...
ng build myProject --configuration=production
, чтобы запустить prod build вашего проекта.
ng build myLibrary
, чтобы запустить сборку prod вашей библиотеки, и вы, вероятно, запускаете ng build myLibrary --watch=true
, чтобы запустить сборку dev вашей библиотеки и наблюдать за изменениями, пока вы работаете над библиотекой.
Для меня, пока я работаю над проектом, я использую интерфейс командной строки ng, как и вы, и запускаете ng build myLibrary --watch=true
Это работает отлично. У меня есть папка ресурсов для моих библиотек, которые содержат ресурсы, и я храню их в myProject/src/lib/assets. Все хорошо. Хотя мои ресурсы не находятся в моей dist/myLibrary... но это круто, потому что во время разработки, когда я использую относительный путь в моих тегах изображений, <img>
веб-пакет извлекает из моего библиотечного проекта, а не из моей папки dist. Так как мне решить это с помощью сценария NPM? Ну, когда вы читаете следующую строку, вы собираетесь чмокнуть себя в лоб и сказать: "Дерьмо, я знал, что"... вот так...
Если пропустить, начните здесь...
"myLibrary:prod": "ng build myLibrary && mkdir dist/myLibrary/lib/assets && cp -R projects/myLibrary/src/lib/assets/ dist/myLibrary/lib/assets/ && npm run msgAssetsCopied",
Да, это просто базовый удар :)
Я сломаю это для тех, кто плохо знаком с командной строкой все же.
myLibrary:prod
Это имя сценария npm, также известного как сценарий запуска npm. Вы вызываете это в командной строке с npm run myLibrary:prod
и позволяете вашему терминалу делать все остальное. "Остальные" - это просто команды, которые ваш компьютерный терминал может читать, интерпретировать и выполнять соответствующим образом.
ng build myLibrary
запускает стандартную команду сборки CLI ng, тем самым собирая вашу библиотеку
&&
это говорит: "Эй, после того, как ты сделаешь что-то слева от меня [& amp;], сделай это справа от меня"
mkdir dist/myLibrary/lib/assets
эта команда является базовой командой bash, которая создает каталог, в который вы будете копировать свои активы. mkdir
создает каталог, а путь указывает, где и что я хочу, чтобы этот каталог был. Если бы я находился в папке, я хотел создать каталог, скажем, "foo", я бы сделал mkdir bar
, который дал бы мне foo/bar
, если бы я был в "foo" и хотел, чтобы каталог "tacos" находился в Каталог "bar", я бы сделал mkdir bar/tacos
, и он создал бы "tacos" в каталоге "bar", как foo/bar/tacos
.
Я предпочитаю создавать папки и перемещать ресурсы из a → b, а не пытаться скопировать папку и ее активы.
cp -R projects/myLibrary/src/lib/assets/ dist/myLibrary/lib/assets/
этот разделен на 4 части для новичков в bash.
cp
это "копия"
-R
предназначен для "рекурсивного", то есть взять все файлы и папки и сохранить их одну и ту же структуру после копирования.
projects/myLibrary/src/lib/assets/
Здесь мои активы, которые я хочу переместить в тот новый каталог, который я создал с помощью предыдущей команды mkdir
ранее.
dist/myLibrary/lib/assets/
является местом назначения для команды копирования.
Итак, с этим у вас есть...
- Команда
cp -R
- Цель
path/to/assets/in/library/project/
- Пункт назначения
path/to/desired/directory/in/build
Последний шаг - это npm run msgAssetsCopied
, который является еще одним скриптом npm в моем package.json, который сообщает человеку, стучащему по клавиатуре, что ресурсы были скопированы. В моих сценариях обычно есть сообщения с эмодзи, чтобы разработчику было легче увидеть, где именно находится сценарий в любой момент времени, путем определения смайликов на экране. Например...
"msgAssetsCopied": "echo '📁 Assets Copied to Library Dist Folder 📁'",
Таким образом, 📁 Assets Copied to Library Dist Folder 📁
печатается в терминале, когда мы закончим.
Все еще новенький? Не беспокойтесь, теперь я покажу вам, куда они идут в вашем package.json.
{
"name": "YourWorkspace",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
}
}
Как видите, это верх вашего файла package.json. Вы можете добавить столько скриптов, сколько вам нужно, ниже мы добавим тот, которым я только что поделился...
{
"name": "YourWorkspace",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e",
"myLibrary:prod": "ng build myLibrary && mkdir dist/myLibrary/lib/assets && cp
-R projects/myLibrary/src/lib/assets/ dist/myLibrary/lib/assets/ && npm run
msgAssetsCopied",
}
}
Бум идет динамит!