Mam podobny problem do oryginalnego plakatu (@robsonrosa). W moim przypadku używam typecript, który kompiluje do dist
katalogu. Chociaż mógłbym skompilować maszynę do katalogu głównego, myślę, że najlepszym rozwiązaniem jest wygenerowanie oddzielnego package.json
pliku w katalogu dist.
Jest to podobne do sugestii @scvnc, aby skopiować plik, package.json
ale z niespodzianką :
W ramach procesu pakowania należy wygenerować package.json
dla pakietu, który jest oparty na głównym package.json
pliku w katalogu głównym, ale różni się od niego
Uzasadnienie:
- Plik główny
package.json
jest plikiem deweloperskim. Może zawierać skrypty lub zależności programistyczne, które nie są przydatne dla użytkownika pakietu, ale mogą stanowić zagrożenie dla Ciebie. Twoja procedura pakowania może obejmować kod, który usuwa te informacje z produkcjipackage.json
.
- Możesz chcieć wdrożyć swój pakiet w różnych środowiskach, które mogą wymagać różnych plików pakietów (np. Możesz chcieć mieć różne wersje lub zależności).
--- EDYTOWAĆ ---
W komentarzach poproszono mnie o rozwiązanie. Oto kod, którego używam. Należy to traktować jako przykład. Nie ma być ogólny i jest specyficzny dla moich projektów.
Moja konfiguracja:
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.
Chcę spakować tylko dist
katalog, a katalog powinien być katalogiem głównym w pakiecie.
Plik SetupPackage.ts
w moim src
katalogu zostaną skompilowane do SetupPackage.js
w dist
katalogu przez maszynopisu:
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();
Ten plik:
- Kopiuje root,
package.json
ale usuwa skrypty i zależności dev, które nie są potrzebne w pakiecie. Naprawia również główny punkt wejścia do pakietu.
- Zapisuje wersję pakietu z
package.json
do pliku o nazwie version.txt
.
- Kopiuje
.npmignore
pakiet z katalogu głównego.
Zawartość .npmignore to:
*.map
*.spec.*
SetupPackage.*
version.txt
Tj. Testy jednostkowe (pliki specyfikacji) i pliki map maszynopisów są ignorowane, podobnie jak SetupPackage.js
plik i version.txt
plik, który tworzy. To pozostawia czysty pakiet.
Wreszcie główny package.json
plik zawiera następujące skrypty do użytku przez system kompilacji (zakłada, że sh
jest używany jako powłoka).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
Aby zbudować pakiet, system kompilacji klonuje repozytorium, wykonuje, npm install
a następnie uruchamia, npm run buildpackage
co z kolei:
- Usuwa
dist
katalog, zapewniając czystą kompilację.
- Kompiluje kod maszynopisu do javascript.
- Wykonuje
SetupPackage.js
plik, który przygotowuje się dist
do pakowania.
- cds do
dist
katalogu i tam buduje pakiet.
Używam tego version.txt
pliku jako łatwego sposobu na pobranie wersji w package.json i otagowanie mojego repozytorium. Istnieje wiele innych sposobów, aby to zrobić, lub możesz chcieć automatycznie zwiększyć wersję. Usuń to z SetupPackage.ts
i .npmignore
jeśli nie jest to dla Ciebie przydatne.