सामान्य वर्गों के लिए एक साझा नोड मॉड्यूल का उपयोग करना


15

लक्ष्य

तो मैं इस संरचना के साथ एक परियोजना कर रहा हूँ:

  • आयनिक-ऐप
  • firebase-कार्यों
  • साझा

लक्ष्य sharedमॉड्यूल में आम इंटरफेस और कक्षाओं को परिभाषित करना है ।

प्रतिबंध

मैं अपने कोड को स्थानीय रूप से उपयोग करने के लिए npm पर अपलोड नहीं करना चाहता हूं और कोड अपलोड करने की योजना बिल्कुल नहीं बना रहा हूं। यह 100% ऑफ़लाइन काम करना चाहिए।

जबकि विकास प्रक्रिया को ऑफ़लाइन काम करना चाहिए, ionic-appऔर firebase-functionsमॉड्यूल फायरबेस (होस्टिंग और फ़ंक्शंस) में तैनात होने जा रहे हैं। इसलिए, sharedमॉड्यूल से कोड वहां उपलब्ध होना चाहिए।

मैंने अब तक क्या कोशिश की है

  • मैंने टाइपस्क्रिप्ट में प्रोजेक्ट संदर्भों का उपयोग करने की कोशिश की है , लेकिन मैंने इसे काम करने के करीब नहीं पहुंचाया है
  • मैंने इसे एक npm मॉड्यूल के रूप में स्थापित करने की कोशिश की, जैसे कि इस प्रश्न का दूसरा उत्तर
    • यह पहली बार में ठीक काम कर रहा है, लेकिन निर्माण के दौरान, मुझे इस तरह से एक त्रुटि मिलती है firebase deploy:
Function failed on loading user code. Error message: Code in file lib/index.js can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'shared'
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/srv/lib/index.js:5:18)

सवाल

क्या आपके पास किसी भी प्रकार के स्क्रिप्ट, या NPM का उपयोग करके एक साझा मॉड्यूल बनाने के लिए एक समाधान है?

कृपया इसे डुप्लिकेट के रूप में चिह्नित न करें → मैंने स्टैकऑवरफ्लो पर पाए गए किसी भी समाधान की कोशिश की है।

अतिरिक्त जानकारी

साझा करने के लिए कॉन्फ़िगर करें:

// package.json
{
  "name": "shared",
  "version": "1.0.0",
  "description": "",
  "main": "dist/src/index.js",
  "types": "dist/src/index.d.ts",
  "files": [
    "dist/src/**/*"
  ],
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "publishConfig": {
    "access": "private"
  }
}

// tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "rootDir": ".",
    "sourceRoot": "src",
    "outDir": "dist",
    "sourceMap": true,
    "declaration": true,
    "target": "es2017"
  }
}

कार्यों के लिए कॉन्फ़िगर करें:

// package.json
{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^8.0.0",
    "firebase-functions": "^3.1.0",
    "shared": "file:../../shared"
  },
  "devDependencies": {
    "@types/braintree": "^2.20.0",
    "tslint": "^5.12.0",
    "typescript": "^3.2.2"
  },
  "private": true
}


// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./",
    "module": "commonjs",
    "noImplicitReturns": true,
    "noUnusedLocals": false,
    "rootDir": "src",
    "outDir": "lib",
    "sourceMap": true,
    "strict": true,
    "target": "es2017"
  }
}

वर्तमान soution

मैंने एक एनपीएम स्क्रिप्ट को साझा मॉड्यूल में जोड़ा है, जो अन्य मॉड्यूल को सभी फाइलों (index.js के बिना) को कॉपी करता है। यह समस्या है, कि मैं SCM में डुप्लिकेट कोड की जांच करता हूं, और मुझे हर बदलाव पर उस कमांड को चलाने की आवश्यकता है। इसके अलावा, आईडीई इसे अलग-अलग फ़ाइलों के रूप में मानता है।

जवाबों:


4

प्रस्तावना: मैं बहुत परिचित नहीं हूं कि टाइपस्क्रिप्ट संकलन कैसे काम करता है और package.jsonइस तरह के मॉड्यूल को कैसे परिभाषित किया जाना चाहिए। यह समाधान, हालांकि यह काम करता है, हाथ में कार्य को प्राप्त करने का एक हैकी तरीका माना जा सकता है।

निम्न निर्देशिका संरचना मानकर:

project/
  ionic-app/
    package.json
  functions/
    src/
      index.ts
    lib/
      index.js
    package.json
  shared/
    src/
      shared.ts
    lib/
      shared.js
    package.json

फायरबेस सेवा को तैनात करते समय, आप कमांडेप्स को प्रीपेओल और पोस्टडेपल हुक से जोड़ सकते हैं । यह firebase.jsonगुणों के माध्यम से predeployऔर postdeployवांछित सेवा पर किया जाता है । इन गुणों में क्रमशः आपके कोड को तैनात करने से पहले और बाद में चलाने के लिए अनुक्रमिक आदेशों की एक सरणी होती है। इसके अलावा, इन आदेशों को पर्यावरण चर RESOURCE_DIR( ./functionsया ./ionic-app, जो भी लागू हो PROJECT_DIRकी निर्देशिका पथ ) और (निर्देशिका पथ युक्त firebase.json) के साथ कहा जाता है।

अंदर के predeployलिए सरणी का उपयोग करते हुए , हम साझा लाइब्रेरी के कोड को उस फ़ोल्डर में कॉपी कर सकते हैं जो क्लाउड फ़ंक्शंस उदाहरण के लिए तैनात है। ऐसा करने से, आप बस साझा कोड को शामिल कर सकते हैं जैसे कि यह एक सबफ़ोल्डर में स्थित एक पुस्तकालय था या आप नामांकित मॉड्यूल में टाइपस्क्रिप्ट के पथ मानचित्रण का उपयोग करके इसका नाम दे सकते हैं (ताकि आप उपयोग कर सकें )।functionsfirebase.jsontsconfig.jsonimport { hiThere } from 'shared';

predeployहुक परिभाषा (वैश्विक उपयोग के स्थापित shxWindows संगतता के लिए):

// firebase.json
{
  "functions": {
    "predeploy": [
      "shx rm -rf \"$RESOURCE_DIR/src/shared\"", // delete existing files
      "shx cp -R \"$PROJECT_DIR/shared/.\" \"$RESOURCE_DIR/src/shared\"", // copy latest version
      "npm --prefix \"$RESOURCE_DIR\" run lint", // lint & compile
      "npm --prefix \"$RESOURCE_DIR\" run build"
    ]
  },
  "hosting": {
    "public": "ionic-app",
    ...
  }
}

कॉपी किए गए लाइब्रेरी के टाइपस्क्रिप्ट स्रोत को फ़ंक्शन टाइपस्क्रिप्ट कंपाइलर कॉन्फ़िगरेशन से जोड़ना:

// functions/tsconfig.json
{
  "compilerOptions": {
    ...,
    "baseUrl": "./src",
    "paths": {
      "shared": ["shared/src"]
    }
  },
  "include": [
    "src"
  ],
  ...
}

कॉपी किए गए लाइब्रेरी के पैकेज फ़ोल्डर में मॉड्यूल नाम, "साझा", को जोड़ना।

// functions/package.json
{
  "name": "functions",
  "scripts": {
    ...
  },
  "engines": {
    "node": "8"
  },
  "main": "lib/index.js",
  "dependencies": {
    "firebase-admin": "^8.6.0",
    "firebase-functions": "^3.3.0",
    "shared": "file:./src/shared",
    ...
  },
  "devDependencies": {
    "tslint": "^5.12.0",
    "typescript": "^3.2.2",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

होस्टिंग फ़ोल्डर के साथ एक ही दृष्टिकोण का उपयोग किया जा सकता है।


उम्मीद है कि यह किसी ऐसे व्यक्ति को प्रेरित करता है जो इन हूक का उपयोग करने वाले क्लीनर समाधान के साथ आने के लिए टाइपस्क्रिप्ट संकलन से अधिक परिचित है।


3

आप कई पैकेजों के साथ जावास्क्रिप्ट (और टाइपस्क्रिप्ट) परियोजनाओं के प्रबंधन के लिए एक उपकरण लर्न को आजमाना चाह सकते हैं ।

सेट अप

यह मानते हुए कि आपकी परियोजना में निम्नलिखित निर्देशिका संरचना है:

packages
  ionic-app
    package.json
  firebase-functions
    package.json
  shared
    package.json

उन सभी मॉड्यूलों में सही पहुँच स्तर ( privateऔर config/accessकुंजियाँ) निर्दिष्ट करना सुनिश्चित करें जिन्हें आप प्रकाशित नहीं करना चाहते हैं, साथ ही साथ typingsआपकी प्रविष्टि में भी शामिल हैं shared:

साझा:

{
  "name": "shared",
  "version": "1.0.0",
  "private": true,
  "config": {
    "access": "private"
  },
  "main": "lib/index.js",
  "typings": "lib/index.d.ts",
  "scripts": {
    "compile": "tsc --project tsconfig.json"
  }
}

आयोनिक-ऐप:

{
  "name": "ionic-app",
  "version": "1.0.0",
  "private": true,
  "config": {
    "access": "private"
  },
  "main": "lib/index.js",
  "scripts": {
    "compile": "tsc --project tsconfig.json"
  },
  "dependencies": {
    "shared": "1.0.0"
  }
}

जगह में उपरोक्त बदलावों के साथ, आप एक रूट-स्तर बना सकते हैं, package.jsonजहाँ आप कोई भी निर्दिष्ट कर सकते हैं devDependenciesकि आप अपने सभी प्रोजेक्ट मॉड्यूल का उपयोग करना चाहते हैं, जैसे कि आपकी इकाई परीक्षण रूपरेखा, tslint, आदि।

packages
  ionic-app
    package.json
  firebase-functions
    package.json
  shared
    package.json
package.json         // root-level, same as the `packages` dir

आप इस रूट-स्तर package.jsonका उपयोग एनपीएम स्क्रिप्ट को परिभाषित करने के लिए भी कर सकते हैं जो आपकी परियोजना के मॉड्यूल में (लिर्ना के माध्यम से) समान स्क्रिप्ट को लागू करेगा:

{
  "name": "my-project",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "compile": "lerna run compile --stream",
    "postinstall": "lerna bootstrap",
  },
  "devDependencies": {
    "lerna": "^3.18.4",
    "tslint": "^5.20.1",
    "typescript": "^3.7.2"
  },
}

उस जगह के साथ, अपनी रूट डायरेक्टरी में lerna config फाइल जोड़ें:

packages
  ionic-app
    package.json
  firebase-functions
    package.json
  shared
    package.json
package.json
lerna.json

निम्नलिखित सामग्री के साथ:

{
  "lerna": "3.18.4",
  "loglevel": "info",
  "packages": [
    "packages/*"
  ],
  "version": "1.0.0"
}

अब जब आप npm installरूट डाइरेक्टरी में चलते हैं , तो postinstallआपके रूट-लेवल में परिभाषित स्क्रिप्ट आ package.jsonजाएगी lerna bootstrap

क्या lerna bootstrapकरता है कि यह आपके sharedमॉड्यूल को सहानुभूति देगा ionic-app/node_modules/sharedऔर firebase-functions/node_modules/sharedइसलिए उन दो मॉड्यूल के बिंदु से, sharedकिसी भी अन्य npm मॉड्यूल की तरह दिखता है।

संकलन

बेशक, मॉड्यूल को सीलिंक करना पर्याप्त नहीं है क्योंकि आपको अभी भी उन्हें टाइपस्क्रिप्ट से जावास्क्रिप्ट में संकलित करने की आवश्यकता है।

यहीं से रूट-लेवल की package.json compileस्क्रिप्ट चलती है।

जब आप npm run compileअपने प्रोजेक्ट रूट में चलते हैं , तो एनपीएम आपके प्रत्येक मॉड्यूल की फाइल में लिखी गई स्क्रिप्ट को आमंत्रित करेगा lerna run compile --streamऔर lerna run compile --streamआमंत्रित करेगा ।compilepackage.json

चूंकि आपके प्रत्येक मॉड्यूल की अब अपनी compileस्क्रिप्ट है, इसलिए आपके पास tsonfig.jsonप्रति मॉड्यूल एक फ़ाइल होनी चाहिए । यदि आपको दोहराव पसंद नहीं है, तो आप रूट-लेवल tsconfig, या रूट-लेवल tsconfig और मॉड्यूल-लेवल tsconfig फ़ाइलों के संयोजन को रूट वन से प्राप्त कर सकते हैं।

यदि आप यह देखना चाहते हैं कि यह सेटअप वास्तविक दुनिया की परियोजना पर कैसे काम करता है, तो Serenity / JS पर एक नज़र डालें जहाँ मैं इसका बड़े पैमाने पर उपयोग कर रहा हूँ।

तैनाती

होने के बारे में अच्छी बात यह है sharedमॉड्यूल के तहत सांकेतिक रूप से लिंक node_modulesके तहत firebase-functionsऔर ionic-app, और अपने devDepedenciesके तहत node_modulesपरियोजना जड़ के नीचे है कि अगर आप (ताकि उपभोक्ता मॉड्यूल कहीं भी तैनात करने की जरूरत है ionic-appउदाहरण के लिए), तो आप सिर्फ यह सब एक साथ ज़िप सकता है इसके साथ node_modulesऔर नहीं के बारे में चिंता तैनाती से पहले देव depedencies को हटाने के लिए।

उम्मीद है की यह मदद करेगा!

जनवरी


Intresting! मैं निश्चित रूप से इसकी जांच करूंगा और देखूंगा कि क्या यह सही है।
मौरिसिनो 13

2

एक अन्य संभावित समाधान, यदि आप अपने कोड को प्रबंधित करने के लिए गिट का उपयोग कर रहे हैं, का उपयोग कर रहे हैं git submodulegit submoduleआप का उपयोग करने के लिए अपनी परियोजना में एक और गिट रिपॉजिटरी शामिल करने में सक्षम हैं।

आपके उपयोग के मामले में लागू:

  1. अपने साझा-गिट-रिपॉजिटरी के वर्तमान संस्करण को पुश करें
  2. git submodule add <shared-git-repository-link>साझा भंडार को लिंक करने के लिए अपने मुख्य प्रोजेक्ट के अंदर का उपयोग करें ।

यहाँ प्रलेखन के लिए एक कड़ी है: https://git-scm.com/docs/git-submodule


यह वास्तव में एक बुरा विचार नहीं है, लेकिन स्थानीय विकास और परीक्षण मूल रूप से इस दृष्टिकोण के साथ चला गया है।
मौरिसिनिनो

0

यदि मैं आपकी समस्या को सही ढंग से समझता हूं, तो समाधान एक उत्तर की तुलना में अधिक जटिल है और यह आंशिक रूप से आपकी प्राथमिकता पर निर्भर करता है।

दृष्टिकोण 1: स्थानीय प्रतियां

आप पहले से वर्णित काम के समाधान को स्वचालित करने के लिए गुलप का उपयोग कर सकते हैं , लेकिन आईएमओ यह बनाए रखना बहुत आसान नहीं है और अगर किसी अन्य डेवलपर में आता है, तो जटिलता बहुत बढ़ जाती है।

दृष्टिकोण 2: मोनोरपो

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

दृष्टिकोण 3: घटक

इन फ़ोल्डरों में से प्रत्येक को स्टैंड-अलोन घटक के रूप में मानें। बिट पर नजर डालें । यह आपको फ़ोल्डर्स को एक बड़ी परियोजना के छोटे भागों के रूप में स्थापित करने की अनुमति देगा और आप एक निजी खाता बना सकते हैं जो केवल उन घटकों को आपके पास ले जाएगा। एक बार शुरुआत में, यह आपको अलग-अलग फ़ोल्डरों में अपडेट लागू करने की अनुमति देगा और जो अभिभावक उनका उपयोग करता है वह स्वतः अपडेट प्राप्त कर लेगा।

दृष्टिकोण 4: पैकेज

आपने विशेष रूप से कहा था कि आप npm का उपयोग नहीं करना चाहते हैं, लेकिन मैं इसे साझा करना चाहता हूं, क्योंकि मैं वर्तमान में नीचे बताए गए सेट के साथ काम कर रहा हूं और मेरे लिए एक सही काम कर रहा हूं:

  1. प्रत्येक फ़ोल्डर के लिए पैकेज का उपयोग करें npmया yarnबनाने के लिए (आप उन दोनों के लिए स्कोप पैकेज बना सकते हैं, इसलिए कोड केवल आपके लिए उपलब्ध होगा, अगर यह आपकी चिंता है)।
  2. मूल फ़ोल्डर में (जो इन सभी फ़ोल्डरों का उपयोग करता है), निर्मित पैकेज निर्भरता के रूप में जुड़े हुए हैं।
  3. मैं टाइप कोड पथ के साथ संयोजन में वेबपैक पथ उपनामों का उपयोग करके सभी कोड को बंडल करने के लिए वेबपैक का उपयोग करता हूं।

एक आकर्षण की तरह काम करता है और जब संकुल को स्थानीय विकास के लिए सम्‍मिलित किया जाता है तो यह पूरी तरह से ऑफ़लाइन और मेरे अनुभव में काम करता है - प्रत्येक फ़ोल्डर अलग से स्केलेबल होता है और रखरखाव के लिए बहुत आसान होता है।

ध्यान दें

'बच्चे' पैकेज पहले से ही मेरे मामले में पहले से तैयार हैं क्योंकि वे बहुत बड़े हैं और मैंने प्रत्येक पैकेज के लिए अलग-अलग tsconfigs बनाए हैं, लेकिन सुंदर बात यह है कि आप इसे आसानी से बदल सकते हैं। अतीत में मैंने मॉड्यूल और संकलित फ़ाइलों में टाइपस्क्रिप्ट का उपयोग किया है, और कच्चे जेएस फाइलें भी, इसलिए पूरी बात बहुत बहुमुखी है।

उम्मीद है की यह मदद करेगा

***** अद्यतन **** बिंदु 4 पर जारी रखने के लिए: मैं माफी माँगता हूँ, मेरा बुरा। हो सकता है कि मुझे यह गलत लगा हो क्योंकि जहाँ तक मुझे पता है, आप अपलोड नहीं होने पर किसी मॉड्यूल को सीलिंक नहीं कर सकते। फिर भी, यहाँ यह है:

  1. आपके पास एक अलग एनपीएम मॉड्यूल है, इसके लिए उपयोग करें firebase-functions। आप इसे पसंद करते हैं, या अपनी पसंद के आधार पर कच्चे ts का उपयोग करते हैं।
  2. अपने मूल प्रोजेक्ट firebase-functionsमें एक निर्भरता के रूप में जोड़ें ।
  3. में tsconfig.json, जोड़ें"paths": {"firebase-functions: ['node_modules/firebase-functions']"}
  4. वेबपैक में - resolve: {extensions: ['ts', 'js'], alias: 'firebase-functions': }

इस तरह, आप firebase-functionsकेवल उपयोग करके मॉड्यूल से अपने सभी निर्यात किए गए कार्यों को संदर्भित करते हैं import { Something } from 'firebase-functions'। वेबपैक और टाइपस्क्रिप्ट इसे नोड मॉड्यूल फ़ोल्डर से जोड़ देगा। इस कॉन्फ़िगरेशन के साथ, मूल प्रोजेक्ट परवाह नहीं करेगा यदि firebase-functionsमॉड्यूल टाइपस्क्रिप्ट या वेनिला जावास्क्रिप्ट में लिखा गया है।

एक बार स्थापित होने के बाद, यह उत्पादन के लिए पूरी तरह से काम करेगा। फिर, ऑफ़लाइन लिंक और काम करने के लिए:

  1. firebase-functionsप्रोजेक्ट और लिखने के लिए नेविगेट करें npm link। यह आपकी मशीन के लिए एक सिमलिंक, स्थानीय बनाएगा और लिंक को आपके द्वारा पैकेज में दिए गए नाम से मैप करेगा।
  2. पैरेंट प्रोजेक्ट पर नेविगेट करें और लिखें npm link firebase-functions, जो सिमिलिंक बनाएगा और आपके द्वारा बनाए गए फ़ोल्डर में फायरबेस-फ़ंक्शंस की निर्भरता को मैप करेगा।

मुझे लगता है कि आपने कुछ गलत समझा। मैंने कभी नहीं कहा कि मैं npm का उपयोग नहीं करना चाहता। वास्तव में उन सभी मॉड्यूल नोड मॉड्यूल हैं। मैंने अभी कहा, कि मैं अपने मॉड्यूल को npm पर अपलोड नहीं करना चाहता। क्या आप उस 4 वें हिस्से को थोड़ा और विस्तृत कर सकते हैं - जो कि आपको लगता है? शायद एक कोड नमूना प्रदान करें?
मौरिसिनिनो

मैं एक और उत्तर
जोड़ूंगा

मेरे प्रारंभिक उत्तर को अपडेट किया, आशा है कि यह स्पष्ट हो जाएगा
इवान ड्ज़रोव

0

मैं अपने कोड को स्थानीय रूप से उपयोग करने के लिए npm पर अपलोड नहीं करना चाहता हूं और कोड अपलोड करने की योजना बिल्कुल नहीं बना रहा हूं। यह 100% ऑफ़लाइन काम करना चाहिए।

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

ProGet विंडो के लिए उपलब्ध NuGet / Npm निजी रिपॉजिटरी सर्वर है जिसे आप अपने निजी पैकेजों की मेजबानी, पहुंच और प्रकाशन के लिए अपने निजी विकास / उत्पादन वातावरण में उपयोग कर सकते हैं। हालांकि यह खिड़कियों पर है, लेकिन मुझे यकीन है कि लिनक्स पर विभिन्न विकल्प उपलब्ध हैं।

  1. Git Submodules बुरा विचार है, यह वास्तव में कोड को साझा करने का एक पुराना फैशन तरीका है जिसे संकुल की तरह संस्करणित नहीं किया जाता है, बदलते और सबमोड्यूल्स को कम करना वास्तविक दर्द है।
  2. स्रोत आयात फ़ोल्डर भी एक बुरा विचार है, फिर से संस्करण जारी करना जारी है, क्योंकि यदि कोई निर्भर भंडार में निर्भर फ़ोल्डर को संशोधित करता है, तो फिर से इसे ट्रैक करना दुःस्वप्न है।
  3. पैकेज पृथक्करण का अनुकरण करने के लिए कोई भी तृतीय पक्ष स्क्रिप्ट उपकरण समय की बर्बादी है क्योंकि npm पहले से ही पैकेजों को अच्छी तरह से प्रबंधित करने के लिए उपकरणों की रेंज प्रदान करता है।

यहाँ हमारा बिल्ड / परिनियोजन परिदृश्य है।

  1. प्रत्येक निजी पैकेज में .npmrcसमाहित है registry=https://private-npm-repository
  2. हम अपने निजी तौर पर होस्ट किए गए प्रोगेट रिपॉजिटरी पर अपने सभी निजी पैकेज प्रकाशित करते हैं।
  3. प्रत्येक निजी पैकेज में ProGet पर निर्भर निजी पैकेज होते हैं।
  4. हमारा बिल्ड सर्वर हमारे द्वारा निर्धारित npm प्रमाणीकरण के माध्यम से ProGet तक पहुँचता है। हमारे नेटवर्क के बाहर किसी के पास इस भंडार तक पहुंच नहीं है।
  5. हमारा बिल्ड सर्वर एनपीएम पैकेज बनाता है bundled dependenciesजिसके अंदर सभी पैकेज होते हैं node_modulesऔर उत्पादन सर्वर को एनपीएम या निजी एनपीएम पैकेज तक पहुंचने की आवश्यकता नहीं होती है क्योंकि सभी आवश्यक पैकेज पहले से ही बंडल होते हैं।

निजी एनपीएम रिपॉजिटरी के उपयोग से विभिन्न फायदे हैं,

  1. कस्टम स्क्रिप्ट की कोई आवश्यकता नहीं है
  2. नोड बाइड / प्रकाशन पाइपलाइन में फिट बैठता है
  3. प्रत्येक निजी npm पैकेज में आपके निजी git स्रोत नियंत्रण का सीधा लिंक होगा, जो भविष्य में डिबग करने और त्रुटियों की जांच करने में आसान होगा
  4. प्रत्येक पैकेज एक आसानी से स्नैपशॉट है, इसलिए एक बार प्रकाशित होने के बाद इसे संशोधित नहीं किया जा सकता है, और जब आप नई सुविधाएँ बना रहे होते हैं, तो निर्भर पैकेजों के पुराने संस्करण के साथ मौजूदा कोड आधार प्रभावित नहीं होगा।
  5. आप आसानी से कुछ संकुल को सार्वजनिक कर सकते हैं और भविष्य में कुछ अन्य भंडार में स्थानांतरित कर सकते हैं
  6. यदि आपका निजी एनपीएम प्रदाता सॉफ्टवेयर बदलता है, उदाहरण के लिए आप अपने कोड को नोड के निजी एनपीएम पैकेज रजिस्ट्री क्लाउड में स्थानांतरित करने का निर्णय लेते हैं, तो आपको अपने कोड में कोई बदलाव करने की आवश्यकता नहीं होगी।

यह एक समाधान हो सकता है, लेकिन यह दुर्भाग्य से मेरे लिए नहीं है। हालांकि आपके समय के लिए धन्यवाद!
मौरिसिनो

एक स्थानीय npm रिपॉजिटरी भी है जिसे एक छोटे नोड सर्वर के रूप में स्थापित किया गया है, verdaccio.org
आकाश कावा

-1

आप जिस टूल की तलाश कर रहे हैं वह है npm linknpm linkएक स्थानीय एनपीएम पैकेज के लिए सीमलिंक प्रदान करता है। इस तरह आप एक पैकेज को लिंक कर सकते हैं और इसे अपने मुख्य प्रोजेक्ट में npm पैकेज लाइब्रेरी में प्रकाशित किए बिना उपयोग कर सकते हैं।

आपके उपयोग के मामले में लागू:

  1. npm linkअपने sharedपैकेज के अंदर का उपयोग करें । यह भविष्य के इंस्टाल के लिए सिमलिंक डेस्टिनेशन सेट करेगा।
  2. अपने मुख्य प्रोजेक्ट पर नेविगेट करें। अपने functionsपैकेज के अंदर और npm link sharedसाझा किए गए पैकेज को लिंक करने और node_modulesनिर्देशिका में जोड़ने के लिए उपयोग करें ।

यहाँ प्रलेखन के लिए एक लिंक है: https://docs.npmjs.com/cli/link.html


जहाँ तक मुझे पता है, npm लिंक केवल परीक्षण के लिए है और यदि आप परिणामी कोड (उदाहरण के लिए मेरे कार्य) को तैनात करना चाहते हैं तो यह काम नहीं करता है।
मॉरिसनिनो

मैं देखता हूं, आपको अपने प्रश्न में इस आवश्यकता को जोड़ना चाहिए।
तला हुआ

यह पहले से ही प्रश्न में वर्णित है, लेकिन मैं इसे स्पष्ट करूंगा।
मौरिसिनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.