У меня проблема, похожая на исходный плакат (@robsonrosa). В моем случае я использую typecript, который компилируется в dist
каталог. Хотя я мог бы скомпилировать машинописный текст в корневой каталог, я думаю, что лучшим решением будет создать отдельный 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
каталог с помощью машинописного текста:
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();
Этот файл:
- Копирует корень,
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
если это вам не нужно.