Mam podobny problem do oryginalnego plakatu (@robsonrosa). W moim przypadku używam typecript, który kompiluje do distkatalogu. Chociaż mógłbym skompilować maszynę do katalogu głównego, myślę, że najlepszym rozwiązaniem jest wygenerowanie oddzielnego package.jsonpliku w katalogu dist.
Jest to podobne do sugestii @scvnc, aby skopiować plik, package.jsonale z niespodzianką :
W ramach procesu pakowania należy wygenerować package.jsondla pakietu, który jest oparty na głównym package.jsonpliku w katalogu głównym, ale różni się od niego
Uzasadnienie:
- Plik główny
package.jsonjest 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 distkatalog, a katalog powinien być katalogiem głównym w pakiecie.
Plik SetupPackage.tsw moim srckatalogu zostaną skompilowane do SetupPackage.jsw distkatalogu 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.jsonale 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.jsondo pliku o nazwie version.txt.
- Kopiuje
.npmignorepakiet 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.jsplik i version.txtplik, który tworzy. To pozostawia czysty pakiet.
Wreszcie główny package.jsonplik zawiera następujące skrypty do użytku przez system kompilacji (zakłada, że shjest 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 installa następnie uruchamia, npm run buildpackageco z kolei:
- Usuwa
distkatalog, zapewniając czystą kompilację.
- Kompiluje kod maszynopisu do javascript.
- Wykonuje
SetupPackage.jsplik, który przygotowuje się distdo pakowania.
- cds do
distkatalogu i tam buduje pakiet.
Używam tego version.txtpliku 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.tsi .npmignorejeśli nie jest to dla Ciebie przydatne.