কেন "এনপিএম ইনস্টল" প্যাকেজ-লক.জসন পুনর্লিখন করে?


612

আমি সম্প্রতি এনপিএম @ 5 এ আপগ্রেড করেছি । আমি এখন একটি আছে প্যাকেজ-lock.json থেকে সবকিছু সাহায্যে ফাইল package.json । আমি প্রত্যাশা করব, যখন আমি চালাচ্ছি npm installযে আমার নোড_মডিউল ডিরেক্টরিতে কী ইনস্টল করা উচিত তা নির্ধারণের জন্য লক ফাইল থেকে নির্ভরতা সংস্করণগুলি টানতে হবে । আশ্চর্যের বিষয় হ'ল এটি আসলে আমার প্যাকেজ-লক.জসন ফাইলটি সংশোধন ও পুনর্লিখন শেষ করে ।

উদাহরণ হিসেবে বলা যায়, লক ফাইল টাইপ করা বিষয় সংস্করণ এ হতে নিদিষ্ট ছিল 2.1.6 । তারপরে, npm installকমান্ডের পরে , সংস্করণটি 2.4.1 এ পরিবর্তন করা হয়েছিল । এটি লক ফাইলের পুরো উদ্দেশ্যকে পরাস্ত করে বলে মনে হচ্ছে।

আমি কী মিস করছি? আমি আমার লক ফাইলটিকে সম্মান জানাতে কীভাবে এনপিএম পাব?


4
এটি আপনার প্রশ্নের উত্তর দেয় না তাই আশা করি কোনও মন্তব্য ঠিক আছে তবে সুতার দিকে একবার নজর দিন। স্যুইচিংয়ে আমাদের এক ঘন্টারও কম সময় লেগেছে।
কায়াকিনকডার

4
একই সমস্যা তবে সুতা github.com/yarnpkg/yarn/issues/570 (খুব শিক্ষামূলক) ব্যবহার করছেন
ইয়ভেস এম।

2
আমি একই সমস্যা হচ্ছে না। package-lock.jsonআমি যখন দৌড়ে যাই তখন আমার পুনরুত্থান হয় npm install। এটি এনপিএম বাগের মতো গন্ধযুক্ত। আপনি কি নিজের রেজিস্ট্রি ব্যবহার করেন?
HaNdTriX


@YvesM। --no-saveলকফিল পরিবর্তন করা রোধ করে, তবে এটি ওপি উল্লেখ করেছে যে বোকা প্রথম স্তরের নির্ভরতা আপগ্রেড প্রভাবিত করে না।
রস অ্যালেন

উত্তর:


422

আপডেট 3: অন্যান্য উত্তরগুলিও উল্লেখ করে, npm ciসিআই প্রসঙ্গে দ্রুত এবং পুনরুত্পাদনযোগ্য বিল্ডগুলি অর্জনের অতিরিক্ত উপায় হিসাবে কমান্ডটি এনএমপি 5.7.0 এ প্রবর্তিত হয়েছিল। আরও তথ্যের জন্য ডকুমেন্টেশন এবং এনপিএম ব্লগ দেখুন ।


আপডেট 2: ডকুমেন্টেশন আপডেট এবং স্পষ্ট করার বিষয়টি হ'ল গিটহাব ইস্যু # 18103


আপডেট 1: নীচে বর্ণিত আচরণটি এনপিএম 5.4.2 এ সংশোধন হয়েছে: বর্তমানে ইচ্ছাপূর্ণ আচরণটি গিটহাব ইস্যু # 17979 তে বর্ণিত হয়েছে


আসল উত্তর: # 16866 ইস্যুতে আলোচিত হিসাবে 5.1.0package-lock.jsonএনপিএম এর আচরণ পরিবর্তন করা হয়েছিল । আপনি যে আচরণটি পর্যবেক্ষণ করেছেন তা আপাতত সংস্করণ 5.1.0 সংস্করণ হিসাবে এনপিএম দ্বারা উদ্দিষ্ট।

এর অর্থ এটি যখনই কোনও নির্ভরতার জন্য নতুন সংস্করণটি খুঁজে পায় তখন package.jsonওভাররাইড করতে পারে । আপনি যদি নিজের নির্ভরশীলতাগুলি কার্যকরভাবে পিন করতে চান তবে আপনাকে এখন অবশ্যই উপসর্গ ব্যতীত সংস্করণগুলি নির্দিষ্ট করতে হবে, উদাহরণস্বরূপ, আপনাকে সেগুলি এর পরিবর্তে বা লিখতে হবে । তারপর সমন্বয় এবং পুনরায় উত্পাদন তৈরী করে উত্পাদ হবে। পরিষ্কার হতে: একা আর মূল স্তরের নির্ভরতা লক করে না!package-lock.jsonpackage.json1.2.0~1.2.0^1.2.0package.jsonpackage-lock.jsonpackage-lock.json

এই নকশার সিদ্ধান্তটি ভাল ছিল বা তর্কযোগ্য নয়, # 17979 ইস্যুতে গিটহাবের উপর এই বিভ্রান্তির ফলে চলমান আলোচনা চলছে । (আমার দৃষ্টিতে এটি একটি সন্দেহজনক সিদ্ধান্ত; কমপক্ষে নামটি lockআর সত্য হয় না))

আরও একটি পার্শ্ব দ্রষ্টব্য: এমন রেজিস্ট্রিগুলির ক্ষেত্রেও নিষেধাজ্ঞা রয়েছে যা অপরিবর্তনীয় প্যাকেজগুলিকে সমর্থন করে না, যেমন আপনি যখন এনএমপিজেএস.আর.র পরিবর্তে সরাসরি গিটহাব থেকে প্যাকেজগুলি টানেন। আরও ব্যাখ্যার জন্য প্যাকেজ লকের এই ডকুমেন্টেশনটি দেখুন ।


43
হ্যাক npm updateতাহলে কি জন্য? : ও আমার একই অনুভূতি ছিল যা npm installআপডেট ডিপ্স, তবে আমি এটি বিশ্বাস করতে চাই না .. তবে এটি দুঃখজনকভাবে সত্য বলে মনে হচ্ছে .. যাইহোক npm shrinkwrap, ডিপগুলি লক করার জন্য এখনও বিকল্প রয়েছে , তবে অবশ্যই প্যাকেজ-লকের নাম ভুল রয়েছে যেহেতু এটি
হিমশীতল

266
কী এলোমেলো! বিশ্বের বৃহত্তম প্যাকেজ ম্যানেজার এখনও এটি কীভাবে কাজ করবে সে সম্পর্কে ডকুমেন্টেশন নেই। এটি কী করা উচিত তা প্রত্যেকেই অনুমান করছেন এবং এটি মতামতের যুদ্ধে পরিণত হয়েছে। আলোচনা ভাল তবে বন্যের মধ্যে প্রকাশের আগে হওয়া উচিত। এক পর্যায়ে কাউকে চূড়ান্ত কল করতে হবে এবং তারপরে বাস্তবায়ন, ডকুমেন্টেড এবং মুক্তি পেতে পারে। পিএইচপি কমিটি দ্বারা ডিজাইন করা হয়েছিল এবং একযোগে তৈরি হয়েছিল এবং দেখুন কীভাবে এটি পরিণত হয়েছিল। এই সমালোচনা এবং ব্যাপকভাবে ব্যবহৃত একটি সরঞ্জামে একই জিনিস ঘটতে দেখে আমি ঘৃণা করব।
ল্যান্ডন পোচ

85
তারপরে, প্যাকেজ-লক ব্যবহারের কী লাভ? আমি ভেবেছিলাম এটি বিভিন্ন কর্মক্ষেত্রে একই পরিবেশ তৈরি করবে তবে দেখা যাচ্ছে এটি কিছুই করছে না
লল্টিন

17
"তারপরে প্যাকেজ.জসন এবং প্যাকেজ-লক.জসনের সংমিশ্রণে পুনরুত্পাদনযোগ্য বিল্ড পাবেন" " "প্যাকেজ-লক.জসন" এর এখানে কী ভূমিকা আছে? কোনও সংস্করণ উপসর্গ ব্যবহার না করা থাকলে কি "প্যাকেজ.জসন" ইতিমধ্যে প্রজননযোগ্য বিল্ডগুলি সরবরাহ করে না?
জোনিস এলমারিস

12
@ জনিস এলমারিস আমি মনে করি প্যাকেজ.জসন গভীর নির্ভরতা লক করতে পারে না ...
হুয়ান মেন্ডেস

165

আমি দেখেছি যে, সেখানে npm এর একটি নতুন সংস্করণ হবে 5.7.1 নতুন আদেশের সঙ্গে npm ci, যা থেকে ইনস্টল করবে package-lock.jsonশুধুমাত্র

নতুন এনপিএম সিআই কমান্ডটি কেবলমাত্র আপনার লক-ফাইল থেকে ইনস্টল করে। যদি আপনার প্যাকেজ.জসন এবং আপনার লক-ফাইল সিঙ্কের বাইরে চলে যায় তবে এটি একটি ত্রুটির প্রতিবেদন করবে।

এটি আপনার নোড_মডিউলগুলি ফেলে দিয়ে এবং এটিকে স্ক্র্যাচ থেকে পুনরুদ্ধার করে কাজ করে।

আপনার গ্যারান্টি ছাড়াই যে আপনি কেবলমাত্র আপনার লক-ফাইলে যা পেয়েছেন তা এনপিএম ইনস্টল করার চেয়েও দ্রুত (2x-10x!) পাবেন যখন আপনি কোনও নোড_মডিউলগুলি শুরু করবেন না।

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


133
লকফিল বিদ্যমান থাকলে এটি ডিফল্ট আচরণ হওয়া উচিত।
14:48 এ 16

13
সুতরাং তারা কীভাবে এনপিএম কাজ করে তা পরিবর্তন করেছিল, কেবল কয়েক মাস পরে এটিকে এনপিএম হিসাবে ফিরিয়ে আনতে?
স্কট ফ্ল্যাক

1
আমি এখনও বিভ্রান্ত দস্তাবেজগুলিতে বলা আছেnpm install যে "npm ci প্রকল্পটিতে কমান্ড চালানোর আগে আপনার কাছে একটি প্যাকেজ-লক এবং একটি আপ-টু-ডেট ইনস্টল রয়েছে তা নিশ্চিত করুন: " npm installপ্যাকেজ-লক.জসন ফাইল ওভাররাইট করে না ?
আদিগা

1
আফাইক: @ আদিগা - সংস্করণ 5.4 এর সাথে শুরু করে প্যাকেজ.জসনের বৈশিষ্ট্যগুলি পূরণের জন্য npm কেবল প্রয়োজন হলে লক ফাইল পরিবর্তন করে । সুতরাং যদি প্যাকেজগুলি বলত thatpackage: 1এবং লক বলত , ..: 1.0.4দেব বলতে বলতে সম্পাদনা করতে পারে thatpackage: 2- এবং এটি লক ফাইলকে পরিবর্তন করতে বাধ্য করবে, কারণ 1.0.4সদ্য নির্দিষ্ট করা ব্যাপ্তির সাথে উপযুক্ত নয়। যদি পরিবর্তন না packages.jsonকরা হয়, লক ফাইলটি মোছা না করা অবধি সঠিক সংস্করণে লক থাকবে। [যদি লক না থাকে এবং প্যাকেজগুলি পরিবর্তন না করে তবে জগসন, একটি বাগ রিপোর্ট দাখিল করুন]]
টুলমেকারস্টেভ

1
@ জর্জি আমি যে তথ্য পড়েছি তা থেকে (এনপিএমের সাম্প্রতিক সংস্করণগুলির জন্য), এবং আমার সীমাবদ্ধ পরীক্ষা: হ্যাঁ উভয়ই।
ভেন্রিক্স

95

সদ্য চালু হওয়া ব্যবহার করুন

npm ci

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

npm ciদ্রুত, আরও নির্ভরযোগ্য বিল্ডগুলির জন্য উপস্থাপন করা হচ্ছে


3
এটা কি আমার কাছে সঠিক মনে হচ্ছে? অন্য কেউ নিশ্চিত করতে পারেন?
phouse512

6
@ phouse512 এটি সঠিক। আমরা বেশিরভাগই কেবল ব্যবহার করি npm ci, এবং কেবলমাত্র npm installনতুন প্যাকেজ আপডেট বা ইনস্টল করার সময় ব্যবহার করি।
জ্যাকব সিভার্স

1
সাম্প্রতিক মন্তব্যসমূহ, ইত্যাদি এই উত্তরটি আমি নিয়ে যাচ্ছি। খুব খারাপ তারা ভয়ঙ্কর স্নাফুকে ঠিক করতে পারে না তবে নতুন গসপেলটি যদি "এনপিএম সিআই" হয়, তবে ঠিক আছে। আমি মানিয়ে নিতে পারি
Svend

খুব খারাপ এটি সর্বদা একটি বিদ্যমান node_modulesডিরেক্টরি মুছে দেয় এবং স্থানীয়ভাবে পুনর্নির্মাণ করে, এটি অন্যথায় খালি তবে গুরুত্বপূর্ণ সিমলিংক হলেও। :(
জো এটজবার্গার

2
নিবন্ধন করুন আমি মনে করি যে ডিরেক্টরিগুলির বিষয়বস্তু মুছে ফেলা কেবল ডিরেক্টরি মোছার চেয়ে ধীরে ধীরে ধীরে ধীরে হবে। আপনাকে সামগ্রীগুলি গণনা করতে হবে তারপরে ও / এস-তে কেবল একটি মুছুন আদেশটি না দিয়ে মুছে ফেলা কমান্ডগুলির একটি সিরিজ ইস্যু করতে হবে। এনপিএম-এ সমতাযুক্ত পারফরম্যান্স সংক্রান্ত সমস্যা এবং npm ciআমি ব্যবহার করে যে উন্নতি করেছি আশা করি তারা অস্বাভাবিক ব্যবহারের ক্ষেত্রে পারফরম্যান্স হ্রাস করতে পারে এমন কোনও কিছু প্রবর্তন করতে খুব অনীহা প্রকাশ করবেন। আপনি pnpm.js.org চেক করে দেখতে চাইতে পারেন যদিও এটি ডিস্কের ব্যবহার হ্রাস করতে কঠোর লিঙ্কগুলি ব্যবহার করে।
Caltor

64

সংক্ষিপ্ত উত্তর:

  • npm install প্যাকেজ-লক.জসনকে কেবল সম্মান জানানো হয় যদি এটি প্যাকেজ.জসনের প্রয়োজনীয়তা পূরণ করে।
  • যদি এটি প্রয়োজনীয়তাগুলি পূরণ করে না, প্যাকেজগুলি আপডেট হয়ে গেছে এবং প্যাকেজ-লকটি ওভাররাইট করা হয়েছে।
  • যদি আপনি এটির পরিবর্তে প্যাকেজ-লকটি পুনরায় লেখার চেয়ে বিল্ডটি ব্যর্থ করেন তবে তা ব্যবহার করুন npm ci

এখানে এমন একটি দৃশ্য রয়েছে যা জিনিসগুলি ব্যাখ্যা করতে পারে (এনপিএম 6.3.0 দিয়ে যাচাই করা হয়েছে)

আপনি প্যাকেজ.জসনের উপর নির্ভরতা ঘোষণা করেন:

"depA": "^1.0.0"

তারপরে আপনি এটি করুন npm installযা প্যাকেজ-লক.জসন এর সাথে উত্পন্ন করবে:

"depA": "1.0.0"

কয়েক দিন পরে, "DepA" এর একটি নতুন গৌণ সংস্করণ প্রকাশিত হয়েছে, "1.1.0" বলুন, তারপরে নিম্নলিখিতটি সত্য রাখে:

npm ci       # respects only package-lock.json and installs 1.0.0

npm install  # also, respects the package-lock version and keeps 1.0.0 installed 
             # (i.e. when package-lock.json exists, it overrules package.json)

এরপরে, আপনি নিজের প্যাকেজটি ম্যানুয়ালি আপডেট করুন: জসন:

"depA": "^1.1.0"

তারপরে পুনরায় চালু করুন:

npm ci      # will try to honor package-lock which says 1.0.0
            # but that does not satisfy package.json requirement of "^1.1.0" 
            # so it would throw an error 

npm install # installs "1.1.0" (as required by the updated package.json)
            # also rewrites package-lock.json version to "1.1.0"
            # (i.e. when package.json is modified, it overrules the package-lock.json)

4
এটি আসলে একটি "লক" ফাইলের উদ্দেশ্যমূলক আচরণ। স্পষ্টতই, এনপিএম এর পুরানো সংস্করণগুলির ক্ষেত্রে এটি ছিল না।
ব্লকোস্ট

1
তারপরে এনডিএম কীভাবে প্যাকেজ.জসনের সর্বশেষ আপডেটটি ট্র্যাক করে? আপনি যখন আপনার প্যাকেজ.জসন এবং প্যাকেজ-লক.জসনকে অন্য কম্পিউটারে নিয়ে যান তখন কী হবে? নতুন কম্পিউটারে এনপিএম কীভাবে জানতে পারে যে প্যাকেজ.লকটি আসল কিনা বা এটি আপডেট করা হয়েছে, প্যাকেজ-লক.জসন আপডেট করা দরকার কিনা তা সিদ্ধান্ত নিতে?
লাহিরু চানদিমা

3
@ লাহিরুচণ্ডিমা এটি সত্যিই আপডেটগুলি ট্র্যাক করে না। npm installলক সংস্করণগুলি ব্যবহার করা হবে package-lock.jsonযতক্ষণ না এটি package.jsonপ্যাকেজ.জসন ইনস্টল করে এবং তদনুসারে প্যাকেজ-লক.জসন পুনর্নির্মাণ করে সেই ক্ষেত্রে এটি পূরণ না করে । আপনি যদি package.jsonএমনভাবে পরিবর্তন করেন যে বিদ্যমান প্যাকেজ-লকটি এখনও আপডেটটিকে সন্তুষ্ট করে তবে package.jsonএটি ব্যবহার চালিয়ে যাবেpackage-lock
আহমদ আবদেলঘানি

1
আপনার যদি ইতিমধ্যে নোড_মডিউলগুলিতে একটি মডিউল থাকে যা প্যাকেজ.জসনের প্রয়োজনীয়তা পূরণ করে, তবে npm installপ্যাকেজ-লক.জসন নির্বিশেষে কিছুই করেন না। প্যাকেজ.জসনে উল্লিখিত সেমভারের সাথে মেলে এমন আপডেটগুলি পাওয়া গেলেও আমাদের স্পষ্টভাবে প্যাকেজগুলি আপডেট করতে হবে। অন্তত বছরের পর বছর ধরে আমার অভিজ্ঞতা হয়েছে।
carlin.scott 12'19

1
@ কুলমেকারস্টিভ আমিও @ কার্লিন.স্কোটের প্রতিবেদনের আচরণ সম্পর্কে সন্দেহবাদী ছিলাম, তবে আমি কেবল এটি পরীক্ষা করেছি এবং বাস্তবে তিনি সঠিক। যদি এর মধ্যে সংস্করণটি node_modulesসীমার মধ্যে সন্তুষ্ট হয় package.jsonএবং কোনও package-lock.jsonফাইল না থাকে, এনপিএম চলমান অবস্থায় মডিউলটি আপডেট করবে না npm install। আমি অনুমান করি যেহেতু আপনি নির্ভরতা আপডেট করতে আপনি npm update(বা npm-checkসর্বশেষের জন্য) ব্যবহার করতে পারেন , এবং এই আচরণটি কারওর মধ্যে কেবল একটি এন্ট্রি যুক্ত করার ক্ষেত্রে package.json, এবং সেম-ভেরকে সন্তুষ্টকারী সর্বশেষে নিজেকে আপডেট করার জন্য কোনও সম্পর্কযুক্ত প্যাকেজগুলি না চাওয়ার ক্ষেত্রে এই আচরণটি দ্রুততর is পরিসীমা।
ভেন্রিক্স

19

এর npm ciপরিবর্তে কমান্ডটি ব্যবহার করুন npm install

"সিআই" এর অর্থ "ক্রমাগত সংহতকরণ"।

এটি লেন্সিয়েন্ট প্যাকেজ.জসন ফাইল নির্ভরতার পরিবর্তে প্যাকেজ-লক.জসন ফাইলের ভিত্তিতে প্রকল্প নির্ভরতা ইনস্টল করবে।

এটি আপনার দলের সতীর্থদের জন্য অভিন্ন বিল্ড তৈরি করবে এবং এটি আরও দ্রুত।

আপনি এই ব্লগ পোস্টে এটি সম্পর্কে আরও পড়তে পারেন: https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-fاس ter- আরো- নির্ভরযোগ্য


2
ciডকস এবং ব্লগ পোস্টে উল্লিখিত কমান্ডটি ঘোষিত হিসাবে "অবিচ্ছিন্ন ইন্টিগ্রেশন" বোঝায়: blog.npmjs.org/post/171556855892/…
জো অ্যাটবার্গার

ধন্যবাদ জো। আমি আমার উত্তরটি সঠিক নাম দিয়ে আপডেট করেছি এবং ব্লগ পোস্টের সাথে লিঙ্ক করেছি। 😊 (যারা এটি পড়ছেন তাদের জন্য, আমি আগেই বলেছিলাম যে এটি "ক্লিন ইনস্টল" এর জন্য দাঁড়িয়েছে)
ড্যানিয়েল টনন

"এবং এটি আরও দ্রুত" - এটি মুছবে node_modules ফোল্ডারটি এবং স্ক্র্যাচ থেকে এটি পুনরায় তৈরি করবে। এটা কি খুব দ্রুত? ফোল্ডারটিও কি npm installমুছবে node_modules?
izogfif

আমি মনে করি যে গতি এনপিএম থেকে আসে কোন প্যাকেজগুলি ডাউনলোড করতে হবে তা গণনার দরকার নেই। এটিকে ভেবে দেখুন npm installরান করার সময় সমস্ত প্যাকেজ নির্ভরতা সমাধান করতে হবে। npm ci"এই সঠিক মডিউলগুলি পান" এর একটি শপিং তালিকা।
ড্যানিয়েল টোনন

8

ভবিষ্যতে, আপনি কোনও --from-lock-file(বা অনুরূপ) পতাকাটি পরিবর্তন না করে কেবল ইনস্টল করতে ব্যবহার করতে সক্ষম হবেন package-lock.json

এটি সিআই ইত্যাদির পরিবেশের জন্য দরকারী যেখানে প্রজননযোগ্য বিল্ডগুলি গুরুত্বপূর্ণ।

বৈশিষ্ট্যটি ট্র্যাক করার জন্য https://github.com/npm/npm/issues/18286 দেখুন ।


আমি এটাকে সন্দেহ করি. বিভিন্ন অপারেশন সিস্টেমের জন্য যদি নির্ভরতা আলাদা হয় তবে আপনি কীভাবে এমন কিছু ইনস্টল করতে বাধ্য করতে পারেন যা কাজ করবে না?
ইয়েভেগেনি আফানসিয়েভ

4
@ ইয়েজেগেনিআফানসিয়েভ সেই পতাকাটির পরিবর্তে এটি কার্যকর করা হয়েছে npm ciযা আপনার প্রশ্নকেও পরিচালনা করে।
স্পেকস

8

এটি প্রদর্শিত হচ্ছে এনপিএম v5.4.2 এ স্থির করা হয়েছে

https://github.com/npm/npm/issues/17979

(থ্রেডের শেষ মন্তব্যে স্ক্রোল করুন)

হালনাগাদ

প্রকৃতপক্ষে 5.6.0 এ স্থির। 5.4.2 এ একটি ক্রস প্ল্যাটফর্ম বাগ ছিল যা সমস্যাটি এখনও দেখা দেওয়ার কারণ ছিল।

https://github.com/npm/npm/issues/18712

আপডেট 2

আমার উত্তরটি এখানে দেখুন: https://stackoverflow.com/a/53680257/1611058

npm ci এখন বিদ্যমান প্রকল্পগুলি ইনস্টল করার সময় আপনার যে আদেশটি ব্যবহার করা উচিত তা হ'ল।


5
আমি 5.4.2 ব্যবহার করছি এবং এটি এখনও আমার প্যাকেজ-লক.জসন সংশোধন করে npm i। উদাহরণস্বরূপ, fseventsআমি যখন npm iমেশিনটি সমর্থন করি না তখন মডিউলটি সরিয়ে ফেলা হয় fseventsএবং মডিউলটি npm iআবার যুক্ত করা হয় যখন কোনও মেশিনে আবার কাজ করে।
hrdwdmrbl

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

@hrdwdmrbl ম্যাক ওএস এক্স সহযোগীদের সাথে সহযোগিতা করার সময় fseventsআমার package-lock.jsonসাথে একই ড্রপটি দেখতে পাচ্ছি npm@5.5। আপনি যদি কোনও সমস্যা না খুলে থাকেন তবে আমি করব।
এল এক্স এক্স

@hrdwdmrbl আমি আমার মন্তব্যটি ছেড়ে যাওয়ার পরে এবং আমার মন্তব্য আপডেট করার জন্য এসও-তে ফিরে আসতে ভুলে যাওয়ার পরে আমি খুঁজে পেয়েছি (এবং সম্পর্কিত বিষয়গুলির দীর্ঘ সুতার)। আমার ফিরে আসার জন্য ধন্যবাদ। সবকিছু ঠিক আছে.
এক্স এক্স

4

আপনার কাছে সম্ভবত এমন কিছু রয়েছে:

"typescript":"~2.1.6"

আপনার package.jsonযা সর্বশেষ গৌণ সংস্করণে আপডেট npm, আপনার ক্ষেত্রে হচ্ছে2.4.1

সম্পাদনা: ও.পি. থেকে প্রশ্ন

তবে এটি ব্যাখ্যা করে না যে "এনপিএম ইনস্টল" কেন লক ফাইলটি পরিবর্তন করবে। লক ফাইলটি কি পুনরুত্পাদনযোগ্য বিল্ড তৈরির উদ্দেশ্যে নয়? যদি তা হয় তবে সেমভার মান নির্বিশেষে এটি একই 2.1.6 সংস্করণটি ব্যবহার করা উচিত।

উত্তর:

এটি আপনার সম্পূর্ণ নির্ভরশীলতা গাছটি লক করার উদ্দেশ্যে is এর typescript v2.4.1প্রয়োজন বলা যাক widget ~v1.0.0। আপনি যখন এনপিএম ইনস্টল করেন তখন এটি দখল করে widget v1.0.0। পরবর্তীতে আপনার সহকর্মী ডেভেলপার (অথবা সি আই বিল্ড) একটি npm ইনস্টল এবং পায় না typescript v2.4.1কিন্তু widgetআপডেট করা হয়েছে widget v1.0.1। এখন আপনার নোড মডিউলটি সিঙ্কের বাইরে। এটিই package-lock.jsonবাধা দেয়।

বা আরও সাধারণভাবে:

উদাহরণ হিসাবে বিবেচনা করুন

প্যাকেজ এ:

{"নাম": "এ", "সংস্করণ": "0.1.0", "নির্ভরতা": {"বি": "<0.1.0"}

প্যাকেজ বি:

{"নাম": "বি", "সংস্করণ": "0.0.1", "নির্ভরতা": {"সি": "<0.1.0"}

এবং প্যাকেজ সি:

{"নাম": "সি", "সংস্করণ": "0.0.1"}

এগুলি যদি এ, বি, এবং সি এর একমাত্র সংস্করণগুলি রেজিস্ট্রিতে উপলব্ধ থাকে তবে একটি সাধারণ এনপিএম ইনস্টল এ ইনস্টল করবে:

এ @ ০.০.০ - বি@০.০.১ - সি @ ০.০.১

তবে, যদি B@0.0.2 প্রকাশিত হয়, তবে একটি নতুন এনএমপি ইনস্টল এ ইনস্টল করবে:

A@0.1.0 - B@0.0.2 - C@0.0.1 ধরে নেওয়া নতুন সংস্করণ বি এর নির্ভরতা পরিবর্তন করে নি। অবশ্যই, বি এর নতুন সংস্করণে সি এর নতুন সংস্করণ এবং যে কোনও সংখ্যক নতুন নির্ভরতা অন্তর্ভুক্ত থাকতে পারে। যদি এই ধরনের পরিবর্তনগুলি অনাকাঙ্ক্ষিত হয় তবে A এর লেখক B@0.0.1 এর উপর নির্ভরতা নির্দিষ্ট করতে পারে। তবে, যদি এ এর ​​লেখক এবং বি এর লেখক একই ব্যক্তি না হন তবে এ এর ​​লেখকের পক্ষে বলার উপায় নেই যে বি বা কিছুটা পরিবর্তন না হয়ে গেলে সে সি এর নতুন প্রকাশিত সংস্করণগুলিতে টানতে চায় না।


ওপি প্রশ্ন 2: সুতরাং আমি সঠিকভাবে বুঝতে পারি কিনা তা আমাকে দেখতে দিন। আপনি যা বলছেন তা হ'ল লক ফাইলটি গৌণ নির্ভরতাগুলির সংস্করণগুলি নির্দিষ্ট করে তবে শীর্ষ স্তরের নির্ভরতা নির্ধারণের জন্য প্যাকেজ.জসনের সাথে অস্পষ্ট মিলের উপর নির্ভর করে। এটা কি সঠিক?

উত্তর: নং প্যাকেজ-লকটিতে বর্ণিত মূল প্যাকেজগুলি সহ পুরো প্যাকেজ ট্রিটিকে লক করে package.json। যদি আপনার typescriptলক থাকে তবে এটি পরিবর্তন না হওয়া অবধি এটি থাকা উচিত। এবং আগামীকাল সংস্করণ প্রকাশের সংস্করণ বলতে দিন । আমি যদি আপনার শাখাটি চেকআউট করে চালিত করি , এনপিএম লকফিলকে সম্মান করবে এবং ইনস্টল করবে ।2.4.1package-lock.jsontypescript2.4.2npm install2.4.1

আরও চালু package-lock.json:

প্যাকেজ-লক.জসন স্বয়ংক্রিয়ভাবে এমন কোনও ক্রিয়াকলাপের জন্য উত্পন্ন হয় যেখানে এনপিএম নোড_মডিউল গাছ বা প্যাকেজ.জসনকে সংশোধন করে। এটি সঠিক গাছ যা উত্পন্ন হয়েছিল তা বর্ণনা করে, যেমন পরবর্তী ইনস্টলেশনগুলি মধ্যবর্তী নির্ভরতা আপডেটগুলি নির্বিশেষে অভিন্ন গাছ উত্পন্ন করতে সক্ষম হয়।

এই ফাইলটি উত্স ভাণ্ডারগুলিতে প্রতিশ্রুতিবদ্ধ হওয়ার উদ্দেশ্যে এবং বিভিন্ন উদ্দেশ্যে পরিবেশন করা হয়েছে:

নির্ভরতা গাছের একক উপস্থাপনা বর্ণনা করুন যেমন সতীর্থ, মোতায়েন এবং অবিচ্ছিন্ন একীকরণ ঠিক একই নির্ভরতা ইনস্টল করার গ্যারান্টিযুক্ত।

ব্যবহারকারীদের ডিরেক্টরি নষ্ট না করেই নোড_মডিউলগুলির পূর্ববর্তী রাজ্যে "সময়-ভ্রমণ" করার জন্য একটি সুবিধা সরবরাহ করুন।

পাঠযোগ্য উত্স নিয়ন্ত্রণ নিয়ন্ত্রণের মাধ্যমে গাছের পরিবর্তনের বৃহত্তর দৃশ্যমানতার সুবিধার্থে।

পূর্ববর্তী ইনস্টল করা প্যাকেজগুলির জন্য পুনরাবৃত্ত মেটাডেটা রেজোলিউশনগুলি এড়িয়ে যাওয়ার জন্য এনপিএমকে অনুমতি দিয়ে ইনস্টলেশন প্রক্রিয়াটি অনুকূলকরণ করুন।

https://docs.npmjs.com/files/package-lock.json


29
তবে এটি ব্যাখ্যা করে না যে "এনপিএম ইনস্টল" কেন লক ফাইলটি পরিবর্তন করবে। লক ফাইলটি কি পুনরুত্পাদনযোগ্য বিল্ড তৈরির উদ্দেশ্যে নয়? যদি তা হয় তবে সেমভার মান নির্বিশেষে এটি একই 2.1.6 সংস্করণটি ব্যবহার করা উচিত।
ভাইপার বেইলি

3
এবং এটিই আমি বলছি। আমার প্যাকেজ লক ফাইলটি টাইপস্ক্রিপ্ট @ ২.১..6 বলছে তবে আমি যখন এনপিএম ইনস্টল চালাই, এন্ট্রিটি টাইপস্ক্রিপ্ট @ ২.৪.১ দিয়ে প্রতিস্থাপন করা হয়।
ভাইপার বেইলি

5
আমি এই একই সমস্যা অভিজ্ঞতা পেয়েছি। আমাদের সিআই / সিডিতে, package-lock.jsonএগুলি নীচে টেনে নিয়ে যায় এবং তারপরে আমরা চালিত করি npm installতবে package-lock.jsonফাইলটি সংশোধন করা হয়েছে এবং পরবর্তী পরিবর্তনগুলি টানতে পারার আগে আমাদের একটি পুনরায় সেট করতে হবে।
বায়সমেকানীক

15
আমি পাই না। পরবর্তী ইনস্টলগুলি এখনও আপগ্রেড করতে পারে এটি কীভাবে এটি "লক" ফাইল ?!
রস অ্যালেন

5
আমি মনে করি তারা এই ফাইলটিকে "তথ্য" এবং "লক" হিসাবে রাখার ধারণার সাথে শুরু করেছিলেন এবং তারপরে সিদ্ধান্ত নিয়েছে যে এটি কেবল একটি "তথ্য" ফাইল হবে। আরও ভাল নাম হবে "প্যাকেজ-তথ্য.জসন"। আমি একটি "এনপিএম ইনস্টল-লক" পেতে চাই যা "প্যাকেজ-লক.জসন" থেকে ইনস্টল হবে এবং "প্যাকেজ.জসন" উপেক্ষা করবে
জেরেমি চোন

2

সম্ভবত আপনার এই জাতীয় কিছু ব্যবহার করা উচিত

npm ci

npm install আপনি যদি আপনার প্যাকেজের সংস্করণ পরিবর্তন করতে না চান তা ব্যবহার করার পরিবর্তে ।

সরকারী ডকুমেন্টেশন মতে, উভয় npm installএবং npm ciনির্ভরতা যা প্রকল্পের জন্য প্রয়োজন হয় ইনস্টল করুন।

মূল পার্থক্যটি হ'ল, npm installপ্যাকেজগুলি packge.jsonরেফারেন্স হিসাবে গ্রহণ করে install যেখানে এর ক্ষেত্রে npm ciএটি package-lock.jsonপ্রতিটি সময় সঠিক প্যাকেজ ইনস্টল হওয়ার বিষয়টি নিশ্চিত করে প্যাকেজগুলি রেফারেন্স হিসাবে গ্রহণ করে।


1

তাদের গিথুব পৃষ্ঠায় এটির জন্য একটি উন্মুক্ত সমস্যা রয়েছে: https://github.com/npm/npm/issues/18712

এই সমস্যাটি তখন সবচেয়ে মারাত্মক হয় যখন বিকাশকারীরা বিভিন্ন অপারেটিং সিস্টেম ব্যবহার করেন।



0

সম্পাদনা: "লক" নামটি একটি চতুর, এটির এনপিএম সুতোর সাথে ধরা চেষ্টা করছে। এটি কোনও লক করা ফাইল নয়। package.jsonব্যবহারকারী-ফিক্সড ফাইল, এটি একবার "ইনস্টল" নোড_মডিউলগুলি ফোল্ডার ট্রি তৈরি করবে এবং সেই গাছটি তখন লেখা থাকবে package-lock.json। সুতরাং আপনি দেখুন, এটি অন্য উপায়ে - নির্ভরতা সংস্করণগুলি package.jsonবরাবরের মতো থেকে টানা হবে , এবং কল করা package-lock.jsonউচিতpackage-tree.json

(আশা করি এগুলি আমার উত্তরকে আরও স্পষ্ট করে দিয়েছে, এতগুলি নিম্নগতির পরে)


একটি সরল উত্তর: package.jsonযথারীতি আপনার নির্ভরতা রাখুন, যখন package-lock.json"সঠিক এবং আরও গুরুত্বপূর্ণভাবে পুনরুত্পাদনযোগ্য নোড_মডিউল গাছ" ( এনপিএম ডক্স থেকে নেওয়া ) taken

ছদ্মবেশী নাম হিসাবে, এর এনপিএম সুতোর সাথে ধরা চেষ্টা করছে।


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