এনপিএম মধ্যে alচ্ছিক নির্ভরতা?


23

আমি এই একই প্রশ্ন , কিন্তু একেবারে এক নয়।

আমি আমার অ্যাপ্লিকেশনটির ব্যবহারকারীর পক্ষে এটি যেভাবে নির্ভর করতে হবে সে যেভাবে এটি ব্যবহার করতে চায় তার জন্য এটি নির্ভরতা স্থাপন করুন to সুতরাং, উদাহরণস্বরূপ, তারা যদি মঙ্গোডিবিতে অবিচল থাকতে চায় তবে কেবল মঙ্গো সম্পর্কিত লাইব্রেরি ইনস্টল করা হবে তবে তারা যদি রেডিসের কাছে অবিরত থাকতে চান তবে কেবল রেডিস সম্পর্কিত লাইব্রেরি ইনস্টল করা হবে। আমি তাদের ডাউনলোড এবং পাঠাগারগুলি ইনস্টল করতে চাই না যা তারা ব্যবহার করবেন না।

আমি জানি যে আমি এটির সাথে উন্নয়নের উদ্দেশ্যে এটি করতে পারি devDependenciesতবে এটি এর চেয়ে আরও বেশি এগিয়ে যায়। উপরের প্রশ্নের উত্তর যেমনটি বলেছে, এটি পাইথন setuptools extras_requireএবং ক্লোজারের leiningenপ্রোফাইলগুলির সাথে আরও ঘনিষ্ঠভাবে সম্পর্কিত । এনপিএম এ জাতীয় কিছু? নির্ভরতা নির্দিষ্ট করে তোলার জন্য আরও বহুমুখী পদ্ধতির প্রোফাইল devDependenciesহওয়া উচিত বলে আমি সত্যিই অনুভব করি dev


কেবল একটি চিন্তা কিন্তু আপনি একাধিক প্যাকেজ নিয়ে যেতে পারেন। MyPackage-Core MyPackage-Db-Mongo MyPackage-Db-Redisইত্যাদি ... তারা লোভনীয় মডিউলগুলি বেশিরভাগভাবেই করে থাকে যার অর্থ অ্যাংুলারজগুলি প্রসারিত করা
মাইক 15

@ মাইক: হুম ধন্যবাদ, আমি এটি বিবেচনা করব। আমি এখনও মনে করি package.jsonএটি অন্যান্য প্যাকেজ পরিচালকদের মধ্যে সীমাবদ্ধতার একটি সীমাবদ্ধতা ।
মায়েরা

1
এটি একটি দুর্দান্ত প্রশ্ন, তবে আমি মনে করি এটি অফ-টপিক কারণ এটি কোনও সরঞ্জাম ব্যবহার করার বিষয়ে। এই জাতীয় প্রশ্নগুলি কেবল তখনই বিষয়টিতে থাকে যদি তারা কীভাবে সরঞ্জামটিকে কিছু বিকাশের প্রক্রিয়াতে সংহত করে - তবে এই সাইটটি সফ্টওয়্যার ইঞ্জিনিয়ারিং সম্পর্কে। বিশদ জন্য আমাদের সহায়তা কেন্দ্র দেখুন । দয়া করে পড়ুন: আমার সরঞ্জাম প্রশ্নটি কোথায় যায়? এনপিমের মতো উন্নয়ন সরঞ্জামগুলির ব্যবহার স্ট্যাক ওভারফ্লো প্রসঙ্গে হবে।
আমন

উত্তর:


9

Codependency মডিউল হতে পারে আপনি যা খুঁজছেন তা, বা কিছু অনুরূপ কিছু নেই:

  • ঐচ্ছিক নির্ভরতা মধ্যে ঘোষণা package.jsonযে নেই স্বয়ংক্রিয়ভাবে ইনস্টল npm installবলোoptionalPeerDependencies
  • একটি কাস্টম- requireস্টাইল ফাংশন যা optionalPeerDependenciesসঠিক কাজ সম্পর্কে জানে এবং করে, যা নিক্ষেপ / সতর্কতা সহ যখন মডিউলগুলির প্রয়োজনীয় শ্রেণি পূরণ করে না (যেমন redis, না mongo, এবং না mysql, ইত্যাদি ইনস্টল করা হয় না) সহ including
  • এই মডিউলটির গ্রাহকরা peচ্ছিক পিয়ার মডিউলগুলির অন্তত 1 টি ইনস্টল করার প্রত্যাশাটি নথি করুন document

একটি পার্থক্য হ'ল যদি মডিউলটির মূল কার্যকারিতা কোনও alচ্ছিক নির্ভরতা (যেমন প্লাগইন প্যাটার্ন) ছাড়াই কাজ করে, কোনও ত্রুটি / সতর্কতা যখন পাওয়া যায় না যা পিয়ার নির্ভরতা পূরণ করে।

উন্নয়নের উপর নির্ভরশীলতা নির্ভরশীলতা সম্পর্কিত হিসাব করার সময় উপরের তালিকাটি করছে অন্য একটি প্রকরণ, যেমন dependenciesএবং এর জন্য একটি এনালগ devDependencies

সম্ভবত অন-ডিমান্ডের সাথে একত্রিত হওয়ার জন্য প্রয়োজন এমন ilyচ্ছিক মডিউলগুলি অলসভাবে প্রয়োজন, যেমন:

exports = {
    Core : require('./core'),
    get redis(){ return require('./redis'); },
    get mongo(){ return require('./mongo'); }
}

আমার কিছুদিনের জন্য এটির প্রয়োজন হয়নি, তবে আমি মনে করি এটি আমার যা সমস্যা ছিল তা সমাধান করে। ধন্যবাদ!
ইম্পরিক

2
হ্যাঁ আমি বুঝতে পেরেছিলাম যে এটি কয়েক মাস বয়সী আপনি সম্ভবত এটি বের করে ফেলেছেন বা এগিয়ে চলেছেন। আমি আপনার প্রশ্নটি নিজেই উত্তরগুলির সন্ধানের সাথে খুঁজে পেয়েছি সুতরাং এটি বেশিরভাগ উত্তরোত্তর জন্য। আমি একাধিকবার অনুসন্ধান করতে গিয়েছি, কেবল কয়েক বছর আগে নিজের থেকে লেখা উত্তর খুঁজে পেতে। সুতরাং এই আলোকিত স্বার্থ বিবেচনা করুন। এছাড়াও, codependencyমডিউলটি এনপিএম থেকে বাষ্পীভূত হওয়ার ইভেন্টে মডিউলটি কী সরবরাহ করে তা সাধারণভাবে বর্ণনা করার জন্য উত্তর আপডেট করেছে এবং কারণ उद्धरणগুলি ছাড়াই লিঙ্কগুলি খারাপ এসও ফর্ম।
টুলবার

9

আপনি যদি প্লাগইনগুলির মতো সাধারণ alচ্ছিক নির্ভরতা চান, যেমন আপনি ফু ইনস্টল করেন আপনি এটি রঙিন চালাবেন তবে ইনস্টল না করা থাকলে আপনার কোনও সমস্যা হয় না এবং ধূসরতে দেখা যায় তবে আপনি প্যাকেজ.জেসনে sonচ্ছিক নির্ভরতা ব্যবহার করতে পারেন :

{
  "name": "watchit",
  "version": "1.2.3",
  "optionalDependencies": {
    "foo": "^2.0.0"
  }
}

এবং কোডে:

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}

প্যাকেজ.জসন ডকুমেন্টেশন থেকে বের করা হয়েছে


1

আমি যা করি তা হ'ল আমার প্যাকেজ.জসনের ভিতরে একটি ইনস্টল স্ক্রিপ্ট কনফিগার করা হয় scripts:

"install": "node ./my-tools/my-install.js",

এটি npm installশেষ হওয়ার পরে ঠিক চলবে । আমি এটি বেশিরভাগ .envডিফল্ট সহ কোনও ফাইল স্বয়ংক্রিয় উত্পন্ন করার জন্য ব্যবহার করি ।

my-install.jsস্ক্রিপ্ট বিভিন্ন কমান্ড চালাতে পারে, ফাইল তৈরি করুন, ব্যবহারকারীর ইনপুট জন্য অনুরোধ, তাই আপনি বলতে পারে "চান Redis বা মোঙ্গো?":

const exec = require('child_process').exec;
const readline = require('readline');

// Insert "Ask question script" here
// using readline core module

if ( option == 'mongo' )
  exec('npm install mongoose');

if ( option == 'redis' )
  exec('npm install redis');

এটি খুব দ্রুত উত্তর, সঠিকভাবে ব্যবহারকারীর ইনপুট পড়ার জন্য পাঠ্যলাইন এবং কমান্ড পরিচালনা এবং প্রসেসিং আউটপুট প্রক্রিয়াকরণের জন্য শিশু প্রক্রিয়া ইত্যাদি পরীক্ষা করে দেখুন

এছাড়াও লক্ষ করুন যে ইনস্টল স্ক্রিপ্টটি আপনি যা চান তা হতে পারে (অজগর, বাশ ইত্যাদি)


2
ব্যবহারকারীর ইনপুট চেয়ে জিজ্ঞাসা স্বয়ংক্রিয় বিল্ডস স্ক্রু হবে। npm installইনস্টল স্ক্রিপ্টের ভিতরে আবার চালনা করাও অনিচ্ছাকৃত আচরণকে ট্রিগার করতে পারে। আমি এই সমাধানের প্রস্তাব দিই না।
লাম্বদা পরী

1

নির্ভরযোগ্যতা পরিচালনার সবচেয়ে শক্ত অংশগুলির মধ্যে একটি দ্রুত, পুনরুত্পাদনযোগ্য বিল্ডগুলি সহজ এবং অপেক্ষাকৃত ব্যর্থ সাফল্য নিশ্চিত করা হওয়ায় এনএমপি সত্যই এর জন্য ডিজাইন করা হয়নি। তবে আমি বিশ্বাস করি একটি ব্যবহারের মামলা আছে, এবং অবশ্যই আমার জন্য ছিল। সুতরাং আপনি যা চাইছেন ঠিক তাই করার জন্য আমি একটি প্যাকেজ লিখেছিলাম।

আমার প্যাকেজটি হ'ল install-subsetএবং এর মাধ্যমে বিশ্বব্যাপী ইনস্টল করা যেতে পারেnpm install -g install-subset

https://www.npmjs.com/package/install-subset

প্রথমে, আপনি আপনার প্যাকেজটিতে নাম ইনস্টল করা সাবসেটের জন্য হোয়াইটলিস্ট এবং ব্ল্যাকলিস্টগুলি তৈরি করেন j জসনের মতো:

"subsets": {
    "build": {
        "whitelist": [
            "babel-cli",
            "dotenv"
        ]
    },
    "test": {
        "blacklist": [
            "eslint",
            "lint-rules",
            "prettier"
        ]
    }
}

তারপরে এটিকে কল করুন, উদাহরণস্বরূপ, install-subset test

এই প্যাকেজগুলি কালো তালিকাভুক্ত না করার জন্য এটি অস্থায়ীভাবে আপনার প্যাকেজ.জসনের পুনর্লিখন করবে, তারপরে এটি পুনরুদ্ধার করুন, যা প্যাকেজগুলির উপর নির্ভর করে অনেক সময় এবং ব্যান্ডউইথকে সাশ্রয় করতে পারে।

সুতা দিয়েও কাজ করে, এটি ওপেন সোর্স এবং ইস্যু / পিআরএস স্বাগত।

অনেক ক্ষেত্রে আমি এটি আমাদের সিআই সার্ভারে বিল্ড সময় কম করতে ব্যবহার করি এবং আমাদের সর্বশেষ প্রতিক্রিয়া নেটিভ প্রকল্পে, আমাদের সাধারণ তাজা বিকাশকারী ইনস্টলটি 72 সেকেন্ড থেকে প্রায় 20 সেকেন্ডে নিয়ে যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.