it-swarm.asia

هل ألزم ملف package-lock.json الذي أنشأته npm 5؟

تم إصدار npm 5 اليوم وتتضمن إحدى الميزات الجديدة عمليات التثبيت الحتمية مع إنشاء ملف package-lock.json.

هل من المفترض أن يتم حفظ هذا الملف في التحكم بالمصادر؟

أفترض أنه مشابه لـ yarn.lock و composer.lock ، وكلاهما يفترض أن يتم الاحتفاظ بهما في التحكم بالمصادر.

944
rink.attendant.6

نعم ، package-lock.json يهدف إلى التحقق من التحكم بالمصادر. إذا كنت تستخدم npm 5 ، فقد ترى ذلك في سطر الأوامر: created a lockfile as package-lock.json. You should commit this file. وفقًا لـ npm help package-lock.json :

يتم إنشاء package-lock.json تلقائيًا لأي عمليات يقوم فيها npm بتعديل شجرة node_modules أو package.json. وهي تصف الشجرة التي تم إنشاؤها بدقة ، بحيث تكون عمليات التثبيت اللاحقة قادرة على إنشاء أشجار متطابقة ، بغض النظر عن تحديثات التبعية المتوسطة.

يهدف هذا الملف إلى الالتزام به في مستودعات المصدر ، ويخدم أغراضًا متعددة:

  • قم بوصف تمثيل واحد لشجرة التبعية بحيث يضمن لزملاء الفريق وعمليات النشر والتكامل المستمر تثبيت نفس التبعيات تمامًا.

  • توفير وسيلة للمستخدمين "للسفر عبر الزمن" إلى حالات node_modules السابقة دون الحاجة إلى الالتزام بالدليل نفسه.

  • لتسهيل رؤية أكبر للتغييرات الشجرية من خلال فرق التحكم في المصادر القابلة للقراءة.

  • وحسن عملية التثبيت من خلال السماح لـ npm بتخطي دقة بيانات التعريف المتكررة للحزم المثبتة مسبقًا.

أحد التفاصيل الرئيسية حول package-lock.json هو أنه لا يمكن نشره ، وسيتم تجاهله في أي مكان بخلاف حزمة toplevel. تشترك في تنسيق مع npm-shrinkwrap.json (5) ، والذي هو في الأساس نفس الملف ، ولكنه يسمح بالنشر. لا ينصح بهذا ما لم يتم نشر أداة CLI أو بطريقة أخرى باستخدام عملية النشر لإنتاج حزم الإنتاج.

إذا كان كل من package-lock.json و npm-shrinkwrap.json موجودين في جذر الحزمة ، فسيتم تجاهل package-lock.json بالكامل.

1148
vine77

نعم ، الغرض منه هو تسجيل الوصول. أريد أن أقترح أنه يحصل على التزام فريد من نوعه. نجد أنه يضيف الكثير من الضوضاء إلى فرقنا.

89
xer0x

نعم ، أفضل ممارسة هي تسجيل الوصول

أوافق على أنه سيتسبب في كثير من الضجيج أو الصراع عند رؤية الفرق. لكن الفوائد هي:

  1. ضمان نفس الإصدار بالضبط من كل حزمة . هذا الجزء هو الأكثر أهمية عند البناء في بيئات مختلفة في أوقات مختلفة. يمكنك استخدام ^1.2.3 في package.json الخاص بك ، ولكن كيف يمكنك أن تضمن في كل مرة npm install ستلتقط نفس الإصدار في جهاز dev وفي خادم الإنشاء ، وخاصة حزم التبعية غير المباشرة؟ حسنًا ، package-lock.json سوف يضمن ذلك. (بمساعدة npm ci الذي يقوم بتثبيت الحزم على أساس ملف القفل)
  2. أنه يحسن عملية التثبيت.
  3. أنه يساعد مع ميزة التدقيق الجديدة npm audit fix (أعتقد أن ميزة التدقيق هي من npm الإصدار 6).
36
Xin

أنا لا ألزم هذا الملف في مشاريعي. ما هي النقطة ؟

  1. لقد ولدت
  2. إنه سبب تكامل كود SHA1 يخطئ في gitlab مع تصميمات gitlab-ci.yml

على الرغم من أنه صحيح أنني لم أستخدم ^ في ملف package.json الخاص بـ libs لأنني واجهت تجارب سيئة معه :)

مع تحياتي.

28
Deunz

للناس الذين يشتكون من الضوضاء عند القيام بالفرق:

git diff -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'

ما فعلته هو استخدام اسم مستعار:

alias Gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json' -- . ':(exclude)*yarn.lock'"

لتجاهل package-lock.json في الفوارق لمستودع التخزين بأكمله (كل من يستخدمه) ، يمكنك إضافة هذا إلى .gitattributes:

package-lock.json binary
yarn.lock binary

سيؤدي ذلك إلى ظهور فروق تظهر "الملفات الثنائية a/package-lock.json و b/package-lock.json تختلف كلما تم تغيير ملف قفل الحزمة. بالإضافة إلى ذلك ، ستستبعد بعض خدمات Git (لا سيما GitLab ، ولكن لا GitHub) هذه الملفات (لم يتم تغيير خطوط 10k!) من الاختلافات عند المشاهدة عبر الإنترنت عند القيام بذلك.

24
Raza

نعم ، يمكنك الالتزام بهذا الملف. من مستندات npm الرسمية :

يتم إنشاء package-lock.json تلقائيًا لأي عمليات يقوم فيها npm بتعديل شجرة node_modules أو package.json. وهي تصف الشجرة التي تم إنشاؤها بدقة ، بحيث تكون عمليات التثبيت اللاحقة قادرة على إنشاء أشجار متطابقة ، بغض النظر عن تحديثات التبعية المتوسطة.

الغرض من هذا الملف هو الالتزام بمستودعات المصدر [.]

15
Bablu Singh

استخدامي npm هو إنشاء css/js minified/uglified ولإنشاء javascript اللازمة في الصفحات التي يخدمها تطبيق Django. في التطبيقات الخاصة بي ، يتم تشغيل Javascript على الصفحة لإنشاء رسوم متحركة ، وفي بعض الأحيان إجراء مكالمات ajax ، والعمل ضمن إطار VUE و/أو العمل مع css. إذا كان package-lock.json لديه بعض التحكم الفائق لما يوجد في package.json ، فقد يكون من الضروري وجود إصدار واحد من هذا الملف. في تجربتي ، إما أنه لا يؤثر على ما تم تثبيته بواسطة تثبيت npm ، أو إذا كان كذلك ، فهو لم يؤثر سلبًا حتى الآن على التطبيقات التي نشرها على حد علمي. أنا لا أستخدم mongodb أو التطبيقات الأخرى التي تعتبر عميلاً تقليدياً رفيع المستوى.

يمكنني إزالة package-lock.json من repo لأن تثبيت npm ينشئ هذا الملف ، ويعد تثبيت npm جزءًا من عملية النشر على كل خادم يقوم بتشغيل التطبيق. تتم التحكم في إصدار العقدة و npm يدويًا على كل خادم ، لكنني حريص على أن تكون هي نفسها.

عندما يتم تشغيل npm install على الخادم ، فإنه يتغير package-lock.json ، وإذا كانت هناك تغييرات على ملف يتم تسجيله بواسطة الريبو على الخادم ، فإن نشر التالي لن يسمح لك بسحب تغييرات جديدة من Origin. هذا لا يمكنك نشره لأن السحب سيحل محل التغييرات التي تم إجراؤها على package-lock.json.

لا يمكنك حتى الكتابة فوق حزمة lock.json التي تم إنشاؤها محليًا باستخدام ما هو موجود في الريبو (إعادة تعيين برنامج Origin Origin الثابت) ، حيث إن npm ستشكو عندما تصدر أمرًا في أي وقت إذا لم يعكس package-lock.json ما هو موجود في node_modules بسبب تثبيت npm ، وبالتالي كسر النشر. الآن إذا كان هذا يشير إلى أنه تم تثبيت إصدارات مختلفة قليلاً في node_modules ، لم يتسبب ذلك مرة أخرى في حدوث لي مشاكل.

إذا لم تكن node_modules موجودة على الريبو الخاص بك (ويجب ألا تكون كذلك) ، فيجب تجاهل الحزمة-lock.json.

إذا كنت أفتقد شيئًا ما ، فالرجاء تصحيحه في التعليقات ، لكن النقطة التي تؤخذ من الإصدار من هذا الملف لا معنى لها. يحتوي ملف package.json على أرقام الإصدارات فيه ، وأفترض أن هذا الملف هو المستخدم المستخدم في إنشاء الحزم عند حدوث تثبيت npm ، كما هو الحال عند إزالته ، يشكو تثبيت npm كما يلي:

[email protected]:introcart_wagtail$ rm package.json
[email protected]:introcart_wagtail$ npm install
npm WARN saveError ENOENT: no such file or directory, open '/home/jason/webapps/introcart_devtools/introcart_wagtail/package.json'

وفشل الإنشاء ، ولكن عند تثبيت node_modules أو تطبيق npm لإنشاء js/css ، لن يتم تقديم أي شكوى إذا قمت بإزالة package-lock.json

[email protected]:introcart_wagtail$ rm package-lock.json 
[email protected]:introcart_wagtail$ npm run dev

> [email protected] dev /home/jason/webapps/introcart_devtools/introcart_wagtail
> NODE_ENV=development webpack --progress --colors --watch --mode=development

 10% building 0/1 modules 1 active ...
2
MagicLAMP

نعم ، يجب عليك الالتزام بـ package-lock.json.

كما أوصي بشدة باستخدام npm ci بدلاً من npm install عند إنشاء التطبيقات الخاصة بك على CI وجهاز التطوير المحلي الخاص بك وسير العمل يتطلب وجود package-lock.json.

أحد أكبر الجوانب السلبية في أمر npm install هو أنه قد يؤدي إلى تغيير package-lock.json ، في حين أن npm ci يستخدم فقط الإصدارات المحددة في lockfile وينتج خطأ إذا كان package-lock.json و package.json خارج المزامنة.

وبالتالي ، تشغيل npm install محليًا ، esp. في فرق أكبر مع عدة مطورين ، قد يؤدي ذلك إلى الكثير من التعارضات داخل package-lock.json والمطورين لاتخاذ قرار بحذف package-lock.json تمامًا بدلاً من ذلك.

ومع ذلك ، فهناك حالة استخدام قوية لتكون قادرًا على الثقة في أن تبعيات المشروع تتحلل بشكل متكرر بطريقة موثوقة عبر أجهزة مختلفة.

من package-lock.json ، تحصل على ذلك بالضبط: حالة معروفة للعمل.

في الماضي ، كان لدي مشاريع بدون ملفات package-lock.json/npm-shrinkwrap.json/yarn.lock التي ستفشل بنيتها يومًا واحدًا لأن التبعية العشوائية حصلت على تحديث عاجل.

يصعب حل هذه المشكلة ، حيث يتعين عليك في بعض الأحيان تخمين الإصدار الأخير من العمل.

إذا كنت ترغب في إضافة تبعية جديدة ، فلا تزال تقوم بتشغيل npm install {dependency}. إذا كنت ترغب في الترقية ، استخدم npm update {dependency} وارتكب package-lock.json الذي تم تغييره. (في حالة فشل الترقية ، يمكنك الرجوع إلى آخر package-lock.json).


إلى اقتباس npm doc :

يوصى بشدة بالالتزام بقفل الحزمة الذي تم إنشاؤه للتحكم في المصدر: سيسمح هذا لأي شخص آخر في فريقك ، وعمليات النشر الخاصة بك ، وتكامل CI/المستمر لديك ، وأي شخص آخر يقوم بتشغيل تثبيت npm في مصدر الحزمة الخاص بك للحصول على شجرة التبعية ذاتها أن كنت تتطور على. بالإضافة إلى ذلك ، فإن الفروق بين هذه التغييرات قابلة للقراءة البشرية وستُعلمك بأي تغييرات قام بها npm على وحدات node_modules الخاصة بك ، حتى تتمكن من ملاحظة ما إذا كان قد تم تحديث أي تبعيات متعدية أو رفعها وما إلى ذلك.

وفيما يتعلق بـ الفرق بين npm ci vs npm install :

  • يجب أن يحتوي المشروع على حزمة lock.json موجودة أو npm-shrinkwrap.json.
  • إذا كانت التبعيات الموجودة في قفل الحزمة لا تتطابق مع تلك الموجودة في package.json ، فسيخرج npm ci مع وجود خطأ ، بدلاً من تحديث قفل الحزمة.
  • npm ci يمكن فقط تثبيت مشاريع بأكملها في وقت واحد: لا يمكن إضافة التبعيات الفردية مع هذا الأمر.
  • إذا كان node_modules موجودًا بالفعل ، فستتم إزالته تلقائيًا قبل أن يبدأ npm ci في التثبيت.
  • لن يكتب أبدًا إلى package.json أو أي من أقفال الحزمة: عمليات التثبيت مجمّدة بشكل أساسي.

ملاحظة: نشرت إجابة مماثلة هنا

1
k0pernikus

تعطيل package-lock.json على مستوى العالم

اكتب ما يلي في الجهاز:

npm config set package-lock false

هذا العمل حقا بالنسبة لي مثل السحر

0
Balogun Ridwan Ridbay

نعم ، من الممارسات المعتادة الالتزام بـ package-lock.json

السبب الرئيسي لارتكاب package-lock.json هو أن كل شخص في المشروع على نفس إصدار الحزمة.

الإيجابيات: -

  • سيكون الجميع في المشروع على نفس إصدار الحزمة ، كل ما عليك فعله هو القيام به

    تثبيت npm

  • إذا كنت تتبع إصدارًا صارمًا ولا تسمح بالتحديث إلى الإصدارات الرئيسية تلقائيًا لإنقاذ نفسك من التغييرات غير المتوافقة مع الإصدارات السابقة في حزم الطرف الثالث التي ترتكب قفل الحزمة ، فهذا يساعد كثيرًا.

سلبيات:-

  • يمكن أن تجعلك سحب طلبات تبدو قبيحة :)
0
Nikhil Mohadikar