मुझे मूल पोस्टर (@robsonrosa) के समान समस्या है। मेरे मामले में मैं टाइपक्रिप्ट का उपयोग करता हूं जो एक distनिर्देशिका के लिए संकलित करता है । जब मैं टाइपस्क्रिप्ट को रूट डायरेक्टरी में संकलित कर सकता था, तो मुझे लगता है कि सबसे अच्छा समाधान package.jsonडिस्टर्ब डायरेक्टरी में एक अलग फाइल जेनरेट करना है ।
यह एक प्रतिलिपि के package.jsonसाथ @scvnc सुझाव के समान है लेकिन एक मोड़ के साथ:
पैकेजिंग प्रक्रिया के हिस्से के रूप में आपको 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
Ie इकाई परीक्षण (स्पेस फाइलें) और टाइपस्क्रिप्ट मैप फाइल को नजरअंदाज करने के साथ-साथ 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एक साफ संकलन सुनिश्चित करने वाली निर्देशिका को हटाता है ।
- जावास्क्रिप्ट को टाइपस्क्रिप्ट कोड संकलित करता है।
- उस
SetupPackage.jsफ़ाइल को निष्पादित करता है जो distपैकेजिंग के लिए तैयार करती है।
distनिर्देशिका के लिए सीडी और वहाँ पैकेज बनाता है।
मैं version.txtपैकेज में संस्करण को प्राप्त करने के लिए एक आसान तरीका के रूप में फाइल का उपयोग करता हूं । संदेश और मेरे रेपो को टैग करने के लिए। ऐसा करने के लिए अनगिनत अन्य तरीके हैं या आप संस्करण को ऑटो-इंक्रीज करना चाहते हैं। इसे हटा दें SetupPackage.tsऔर .npmignoreयदि यह आपके लिए उपयोगी नहीं है।