У мене проблема, схожа на оригінальний плакат (@robsonrosa). У моєму випадку я використовую машинопис, який компілюється в dist
каталог. Хоча я міг зробити компіляцію TypeScript в кореневому каталозі, я вважаю, що найкращим рішенням є створення окремого package.json
файлу в каталозі dist.
Це схоже на пропозицію @scvnc копіювати, package.json
але з поворотом:
Як частину процесу упаковки ви повинні створити package.json
пакунок, який базується на, але відрізняється від основного package.json
файлу в кореневому каталозі
Обґрунтування:
- Кореневий
package.json
файл - це файл розробки. Він може містити сценарії або залежності від розробки, які не приносять користі користувачеві пакету, але можуть створювати для вас проблеми з безпекою. Ваша процедура упаковки може містити код, який вилучає цю інформацію з виробництва package.json
.
- Можливо, ви захочете розгорнути свій пакет в різних середовищах, які можуть вимагати різних файлів пакунків (наприклад, ви можете мати різні версії або залежності).
--- РЕДАКТУВАТИ ---
Мене попросили рішення в коментарях. Отже, ось деякий код, який я використовую. Це слід розглядати як приклад: воно не має бути загальним і стосується моїх проектів.
Моє налаштування:
package.json - main package.json with dev dependencies and useful scripts.
.npmignore - files to ignore; copied to 'dist' directory as part of the setup.
/src - directory where my typescript code resides.
/src/SetupPackage.ts - bit of code used to setup the package.
/dist - destination directory for the compiled javascript files.
Я хочу упакувати лише dist
каталог, і каталог повинен бути кореневим каталогом пакета.
Файл SetupPackage.ts
у моєму src
каталозі буде скомпільовано SetupPackage.js
в dist
каталог за допомогою typecript:
import fs from "fs";
// DO NOT DELETE THIS FILE
// This file is used by build system to build a clean npm package with the compiled js files in the root of the package.
// It will not be included in the npm package.
function main() {
const source = fs.readFileSync(__dirname + "/../package.json").toString('utf-8');
const sourceObj = JSON.parse(source);
sourceObj.scripts = {};
sourceObj.devDependencies = {};
if (sourceObj.main.startsWith("dist/")) {
sourceObj.main = sourceObj.main.slice(5);
}
fs.writeFileSync(__dirname + "/package.json", Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8") );
fs.writeFileSync(__dirname + "/version.txt", Buffer.from(sourceObj.version, "utf-8") );
fs.copyFileSync(__dirname + "/../.npmignore", __dirname + "/.npmignore");
}
main();
Цей файл:
- Копіює root,
package.json
але видаляє скрипти та залежності від розробника, які не потрібні в пакеті. Він також фіксує основну точку входу в пакет.
- Записує версію пакета
package.json
у файл, який називається version.txt
.
- Копіює
.npmignore
пакет з кореня.
Вміст .npmignore:
*.map
*.spec.*
SetupPackage.*
version.txt
Тобто модульні тести (файли специфікацій) і файли карт машинопису ігноруються, а також SetupPackage.js
файл і version.txt
файл, який він створює. Це залишає чистий пакет.
Нарешті, основний package.json
файл має такі сценарії для використання системою складання (передбачається, що sh
він використовується як оболонка).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
Для побудови пакету система збірки клонує репо, робить, npm install
а потім запускає, npm run buildpackage
що в свою чергу:
- Видаляє
dist
каталог, забезпечуючи чисту компіляцію.
- Компілює код машинопису в javascript.
- Виконує
SetupPackage.js
файл, який готується dist
до упаковки.
- cds до
dist
каталогу і будує там пакет.
Я використовую version.txt
файл як простий спосіб отримати версію в package.json і позначити мій репо. Існує незліченна кількість інших способів зробити це, або, можливо, ви захочете автоматично збільшити версію. Видаліть це з, SetupPackage.ts
і .npmignore
якщо це вам не корисно.