#node.js #node-modules #npm-install
#node.js #узел-модули #npm-install
Вопрос:
Я создаю пользовательский пакет npm и хотел бы добавить файл конфигурации JSON.
Я хотел бы добавить этот файл в корневой путь приложения узла, когда a npm install mypackage
будет выполнено
Я знаю, что это возможно, поскольку это то, что делает typescript, добавляя файл tsconfig.json в папку моего приложения, когда я делаю npm install typescript
Я предполагаю, что это конфигурация package.json, но я не знаю, какая именно.
Спасибо
Ответ №1:
Вы можете добиться этого с помощью postinstall
скрипта.
{ "scripts" :
...
"postinstall" : "scripts/postinstall.js"
}
}
Вот объяснение событий жизненного цикла npm в документах:
Например, если ваш package.json содержит это:
{ "scripts" : { "install" : "scripts/install.js" , "postinstall" : "scripts/install.js" , "uninstall" : "scripts/uninstall.js" } }
затем scripts/install.js будет вызываться на этапах установки и после установки жизненного цикла, а также scripts/uninstall.js будет вызван, когда пакет будет удален. Поскольку scripts/install.js выполняется для двух разных фаз, в этом случае было бы разумно посмотреть на переменную среды npm_lifecycle_event.
Комментарии:
1. Большое спасибо. Si «install», «postinstall» и «uninstall» являются зарезервированными ключевыми словами в массиве «scripts», которые используются npm, если они найдены. Я проверю это 😉
Ответ №2:
Я решил это с помощью genechk awnser :
Мне пришлось добавить скрипт «postinstall» в мой package.json, но мне также пришлось добавить команду «node» раньше, чтобы выполнить сценарий :
"scripts" : [
...
"postinstall" : "node scripts/postinstall.js"
]
Также мне пришлось добавить скрипт к доставляемым файлам из пакета :
"files": [
...
"scripts/**/*"
]
Finlay мой postinstall.js выглядит примерно так :
const fs = require('fs');
// __dirname is "{ProjectFolder}/node_modules/mypackage/config"
const CONFIG_SRC = `${__dirname}/../config/`;
const CONFIG_DEST = `${__dirname}/../../../`;
const CONFIG_MYPACKAGE = 'mypackageconfig.json';
fs.copyFile(`${CONFIG_SRC}/${CONFIG_MYPACKAGE}`, `${CONFIG_DEST}/${CONFIG_MYPACKAGE}`, (err) => {
if (err) throw err;
console.log(`File ${CONFIG_MYPACKAGE} copied`);
});
Также, чтобы быть полностью корректным, мне пришлось использовать uninstall.js скрипт, следующий той же логике и удаляющий файл