कैसे npm विशिष्ट फ़ोल्डर प्रकाशित करें, लेकिन पैकेज रूट के रूप में


86

मेरे पास एक परियोजना है जिसमें स्रोतों के निर्माण और पैकेजिंग के लिए एक gulp कार्य शामिल है और एक निर्देशिका में जारी किया जाता है dist। मेरा लक्ष्य इसे एक npm पैकेज के रूप में प्रकाशित करना है, लेकिन केवल मेरा डिस्ट फ़ोल्डर। NPM प्रलेखन का कहना है कि मैं उपयोग कर सकते हैं filesनिर्यात करने के लिए फ़ाइलों को निर्दिष्ट करने के टैग। यह काम करता हैं। लेकिन, प्रलेखन यह भी कहता है कि:

यदि आप किसी फ़ोल्डर को सरणी में नाम देते हैं, तो यह उस फ़ोल्डर के अंदर की फ़ाइलों को भी शामिल करेगा

परिणाम, एक npm पैकेज है, जिस पर node_modules दिखता है:

एनपीएम पैकेज उत्पन्न किया

लेकिन मैं अपनी सभी फाइलों को पैकेज के रूट (उस distफ़ोल्डर के बिना ) में देखना चाहता हूं । मेरी index.jsफ़ाइल distफ़ोल्डर के अंदर है , लेकिन रूट पर होना चाहिए। मैं सेट टैग करने की कोशिश की है filesके रूप में /dist/**/*, लेकिन यह काम नहीं किया।

मैं इसे कैसे प्राप्त कर सकता हूं?

जवाबों:


44

मेरी भी यही इच्छा है लेकिन मुझे लगता है कि केवल npm टूलींग का उपयोग करके इसे पूरा करने का कोई तरीका नहीं है । आपके पैकेज को व्यवस्थित करने के लिए एक और स्क्रिप्ट / टूल का उपयोग किया जा सकता है।

दूसरा तरीका

वर्तमान में मैं अपने को कॉपी कर रहा हूँ package.jsonमें distफ़ोल्डर और फिर चल npm packअंदर distफ़ोल्डर। मुझे लगता है कि यह अनिवार्य रूप से हमारे पैकेज की वांछित व्यवस्था प्रदान करता है।

यहाँ इस npm डिजाइन पर कुछ प्रासंगिक पढ़ने है: क्यों कोई निर्देशिकाएँ। नोड में

यह भी ध्यान रखना दिलचस्प है कि jspm npm पैकेज को हल करते समय फाइलों directories.libमें विकल्प का सम्मान करता है package.jsonऔर पुनर्व्यवस्थित करता है। यह सब मेरे बारे में आया है क्योंकि मैं एक सामान्य पुस्तकालय का निर्माण करना चाहता हूं जिसका उपयोग jspm या npm / webpack द्वारा किया जा सकता है।


1
(नो डाइरेक्टिस.लिब क्यों ...) एक मृत लिंक है
Shanimal

1
नो डाइरेक्टरीज़ क्यों नहीं। नोड में कहा जा रहा है, यदि आप इसे हमारे तरीके से नहीं करते हैं, तो आपको दर्द महसूस करना चाहिए। यह सब कुछ इस मुद्दे को हल करने के लिए उपकरणों की आवश्यकता पैदा करता है।
ब्रायन तकिता

6
मेरा मानना ​​है कि यह उत्तर पुराना है। नोट के नीचे की प्रतिक्रिया के रूप में npm pack, package.json filesऔर mainफ़ील्ड्स का उपयोग करके , और .npmignoreएक डेवलपर को एक विशिष्ट, इंस्टॉल करने योग्य निर्देशिका से एक पैकेज बनाने के लिए आवश्यक सब कुछ देता है।
जेफटॉपिया

1
"प्रकाशित उपदिशा" पैटर्न को कारगर बनाने / लागू करने के लिए कुछ स्क्रिप्ट बनाए
15

2
क्या कोई समाधान पोस्ट कर सकता है कि यह पैकेज में npmignore, फ़ाइलों और मुख्य संपत्ति का उपयोग करके कैसे प्राप्त किया जा सकता है। मैं सभी फ़ाइल को रूट पर ले जाना चाहता हूं और डिस्ट फ़ोल्डर नहीं है
अंगद

16

मुझे मूल पोस्टर (@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यदि यह आपके लिए उपयोगी नहीं है।


यह उत्तर सबसे अच्छा लगता है, लेकिन क्या आपके पास तैयार सिद्धांत एक तरफ है?
yumaa

3
@yumaa मैंने अपना उत्तर एक ठोस उदाहरण के साथ संपादित किया है। आशा है कि यह उपयोगी है।
एली अलग्रांती

13

यदि आपके प्रोजेक्ट में गिट है तो आप छोटे हैक का उपयोग कर सकते हैं। अगली स्क्रिप्ट्स को package.json में जोड़ें

    "prepublishOnly": "npm run build && cp -r ./lib/* . && rm -rf ./lib",
    "postpublish": "git clean -fd",

अब जब आप publishकमांड npm को चलाते हैं prepublishOnly। यह फ़ाइलों को बनाता है और उन्हें libफ़ोल्डर में सहेजता है (एक निर्माण स्क्रिप्ट आपके प्रोजेक्ट पर निर्भर करती है)। अगला कमांड रूट फ़ोल्डर में फ़ाइलों को कॉपी करता है और हटाता है libpostpublishस्क्रिप्ट प्रकाशित करने के बाद प्रोजेक्ट को पिछली स्थिति में लौटाता है।


1
मैं इस समाधान का प्रशंसक हूं!
DanMad

6

मैं आपको .npmignoreचीजों को स्थानांतरित करने या कॉपी करने के बजाय उपयोग करने के लिए अत्यधिक सलाह देता हूं , विशेष रूप से यदि आप तैनाती के लिए सीआई का उपयोग कर रहे हैं, और बस उन फ़ाइलों को जोड़ें जिन्हें आप प्रकाशित नहीं करना चाहते हैं।

https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

उदाहरण:

#tests
test
coverage

#build tools
.travis.yml
.jenkins.yml
.codeclimate.yml

#linters
.jscsrc
.jshintrc
.eslintrc*

#editor settings
.idea
.editorconfig

अपडेट करें:

यदि आप एक ही रेपो का उपयोग करते हुए अपने कोड को अलग-अलग npm संकुल में विभाजित करना चाहते हैं, तो मैं हाल ही में इस परियोजना से टकराया: लर्ना और वास्तव में अच्छा लग रहा है।

शायद आपको देख लेना चाहिए


9
हमें पैकेज की रूट डायरेक्टरी में अभी भी अपनी निर्मित फाइलों को फेंकना होगा। शायद CI के लिए स्वीकार्य है। इसहाक के ब्लॉग से पोस्ट मैं से जुड़ा हुआ निरीक्षण करें और मुझे बताओ कि अपने समाधान के लिए अनुमति होगी require('mypackage/foo')के बजायrequire('mypackage/dist/foo')
scvnc

मैं यहाँ उस समस्या को हल करने की कोशिश नहीं कर रहा था। यदि आप अपने कोड को विभाजित करना चाहते हैं, तो मैं हाल ही में इस परियोजना में टकरा गया: लर्नजेसियो और वास्तव में अच्छा लग रहा है
थ्रैम

एक और उपकरण मिला जिसकी कीमत एक नज़र है :) github.com/philcockfield/msync
Thram

यह सामग्री यूआई का उपयोग करें और मैंने इसका उपयोग किया। मेरी आखिरी कंपनी, मैंने इसे ठीक पाया
निक

5

यह मेरे लिए ठीक काम करता है।

सीडी TMPDIR; npm pack/path/to/package.json

टारबॉल TMPDIR डायरेक्टरी के अंदर बनेगा।


^ इस जवाब को रेखांकित किया गया है। npm packप्लस package.json filesफ़ील्ड (या .npmignore) अद्भुत काम करता है।
जेफटॉपिया

1

आपको distफ़ोल्डर प्रकाशित करने की आवश्यकता है

Npm दृष्टिकोण के अनुसार, इसे प्राप्त करने का प्राकृतिक तरीका उस फ़ोल्डर को प्रकाशित करना है जो रूट होना है। ऐसा करने के कई तरीके हैं, अंतिम पर्यावरण पर निर्भर करता है जिसके साथ आप काम करना चाहते हैं:

  1. npm प्रकाशित अपने पैकेज रेपो से npm रजिस्ट्री में <फ़ोल्डर> प्रकाशित करें और फिर अन्य पैकेज स्थापित करते हुए अपने पैकेज को अन्य प्रोजेक्ट में स्थापित करें। आपके मामले में यह होगा npm publish dist
  2. npm किसी अन्य प्रोजेक्ट में <फ़ोल्डर> स्थापित करें यदि आप अपने पैकेज का उपयोग केवल स्थानीय रूप से करना चाहते हैं। आपके मामले में आप दूसरे प्रोजेक्ट पर जाते हैं और दौड़ते हैंnpm install relative/path/to/dist
  3. npm आपके फ़ोल्डर को स्थानीय रूप से node_modulesकिसी अन्य प्रोजेक्ट में आपके द्वारा लिंक किए जाने की स्थिति में आप अपने मूल पैकेज में परिवर्तन तुरंत अन्य प्रोजेक्ट में दिखाना चाहते हैं। आपके मामले में आप पहले cd distदौड़ते हैं npm linkऔर फिर दूसरी परियोजना में जाते हैं और दौड़ते हैं npm link robsonrosa-ui-alert

पूर्वापेक्षा : उपरोक्त किसी भी मामले में, प्रकाशित / स्थापित / लिंक से पहले, आपको अपने distफ़ोल्डर में कम से कम एक उचित package.jsonफ़ाइल डालनी होगी। आपके मामले में, आपको अपने पैकेज में परिभाषित पैकेज का नाम रखना होगा "name": "robsonrosa-ui-alert"। आमतौर पर, आप चाहते हैं कि README.md या LICENSE जैसी कुछ अन्य फाइलें भी हों।

स्वचालन उदाहरण

आप prepareस्क्रिप्ट के साथ संयुक्त स्क्रिप्ट का उपयोग करके प्रकाशन प्रक्रिया को स्वचालित कर सकते हैं build। इसके अतिरिक्त, आप "private": trueअपने पैकेज रेपो की रूट डायरेक्टरी में स्थित package.json में लगाए गए पैकेज रूट फ़ोल्डर के आकस्मिक प्रकाशन के खिलाफ अपने पैकेज की रक्षा कर सकते हैं । यहाँ एक उदाहरण है:

  "private": true,
  "scripts": {
    "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json",
    "prepare": "npm run build"
  },

इस तरह आप रूट फ़ोल्डर को प्रकाशित नहीं करेंगे और distप्रकाशन प्रक्रिया के भीतर, फ़ोल्डर में कॉपी किए गए पैकेज और पैकेज को स्वचालित रूप से कॉपी कर सकते हैं।


0

विकल्प 1: फ़ोल्डर पर नेविगेट करें और "npm प्रकाशित" निष्पादित करें। आदेश

विकल्प 2: npm प्रकाशित / पथ / निर्देशिका चलाएँ


-1

यहाँ एक और दृष्टिकोण है जो मुझे लगता है कि सबसे साफ है। फ़ाइलों को स्थानांतरित करने और बिल्ड और पैक स्क्रिप्ट में पथ निर्दिष्ट करने की आवश्यकता के बिना यह सभी कॉन्फ़िगरेशन आधारित है:

package.json मुख्य फ़ाइल निर्दिष्ट करें।

{
    "main": "lib/index.js",
}

कुछ अतिरिक्त प्रकार के विकल्प:

  • निर्दिष्ट करें rootDir। इस निर्देशिका में सभी स्रोत कोड होंगे और इसमें एक indexफ़ाइल होनी चाहिए (या कुछ अन्य फ़ाइल जिनका आप मुख्य रूप से उपयोग कर सकते हैं package.json)।
  • निर्दिष्ट करें outDir। यह वह जगह है जहाँ आपके tsc कमांड का निर्माण होगा

tsconfig.json

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "lib",
    },
    ...

}

क्या यह वही नहीं है जैसा कि ओपी ने मूल रूप से नाम को डिस्टर्ब से बदल कर लाइम के लिए किया था?
Bob9630

-3

बस एक .npmignoreफ़ाइल बनाएं और उसमें निम्नलिखित जोड़ें:

*.*
!dist/*

1
यह ओपी के अनुरोध के अनुसार करता है? मैं यह काम करने में सक्षम नहीं था। यह विचार था कि प्रकाशित पैकेज में केवल निर्देशिका सहित बिना डिस्टर्ब डायरेक्टरी की सामग्री शामिल है। मुझे यह सुनिश्चित करने के लिए है कि हम कुछ भी शामिल नहीं करते हैं जो डायरेक्ट डायरेक्टरी में नहीं है जो पहले से ही withe पैकेज हो सकता है। json "files" सूची।
Bob9630
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.