[ERR_PNPM_UNEXPECTED_STORE] موقع مخزن غير متوقع عند إضافة حزم npm إلى Task Runners

مرحبًا بالجميع،

واجهت هذه المشكلة مؤخرًا وتمكنت من حلها. أردت نشر نتائجي هنا في حالة عدم كون هذا السلوك مقصودًا، أو في حالة أنه قد يساعد شخصًا آخر.

المشكلة

بعد آخر نسخة “تجريبية” [2.29.5] من مشغلات المهام، بدأت أتلقى هذا الخطأ عند محاولة بناء صورة مشغل مخصصة:

#13 [stage-1 7/8] RUN cd /opt/runners/task-runner-javascript && pnpm add moment uuid
#13 0.829 ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.10.0.tgz
#13 2.407 [ERR_PNPM_UNEXPECTED_STORE] Unexpected store location
#13 2.407 
#13 2.407 The dependencies at "/opt/runners/task-runner-javascript/node_modules" are currently linked from the store at "/root/.local/share/pnpm/store/v10".
#13 2.407 
#13 2.407 pnpm now wants to use the store at "/root/.local/share/pnpm/store/v11" to link dependencies.
#13 2.407 
#13 2.407 If you want to use the new store location, reinstall your dependencies with "pnpm install".
#13 2.407 
#13 2.407 You may change the global store location by running "pnpm config set store-dir <dir> --global".
#13 2.407 (This error may happen if the node_modules was installed with a different major version of pnpm)
#13 ERROR: process "/bin/sh -c cd /opt/runners/task-runner-javascript && pnpm add moment uuid" did not complete successfully: exit code: 1

الأعراض

  1. خطأ المتجر: عند تشغيل أمر pnpm add قياسي في ملف Dockerfile المخصص، حصلت على [ERR_PNPM_UNEXPECTED_STORE]. كانت node_modules في الصورة الأساسية مرتبطة بمتجر v10، لكن خطوة البناء كانت تحاول استخدام متجر v11.
  2. خطأ npx: حاولت فرض pnpm v10 باستخدام npx -y pnpm@10 add ...، لكن الصورة الأساسية مبنية على python:alpine وتنسخ فقط ملف node و corepack. لا تتضمن npm أو npx، مما أدى إلى /bin/sh: npx: not found.

السبب الجذري

بالنظر إلى كود مصدر n8n، قاموا مؤخرًا بتحديث ملفات Dockerfile لمشغلات الخادم لتثبيت صريح PNPM_VERSION=10.32.1 أثناء عملية البناء (Commit 25d0d12).

فعلوا ذلك لأن pnpm deploy يسقط حقل packageManager، لذا فإن corepack enable pnpm العادي يتم حله إلى pnpm 11.x. يعين pnpm 11 minimumReleaseAge بشكل افتراضي إلى 24 ساعة، مما يرفض المزايا المنشورة قبل يوم واحد.

ومع ذلك، إذا قمت بتشغيل pnpm add عادي فقط في ملف Dockerfile المخصص، يتجاهل corepack هذه النسخة المثبتة وينزل تلقائيًا أحدث إصدار (v11). يستخدم pnpm 11 تنسيق متجر مختلف ويرفض التفاعل مع متجر v10 الذي تركته الصورة الأساسية.

الحل

لإصلاح هذا، يجب عليك استخدام corepack لتفعيل pnpm v10 بشكل صريح قبل تشغيل أمر pnpm add.

بدلاً من القيام بهذا:

RUN cd /opt/runners/task-runner-javascript && \
    pnpm add moment uuid

قم بتغيير خطوة Dockerfile إلى هذا:

# Activate pnpm 10.32.1 to match the base image's v10 store (npx is not available in this image)
RUN corepack prepare pnpm@10.32.1 --activate && \
    cd /opt/runners/task-runner-javascript && \
    pnpm add \
    moment \
    uuid

أتمنى أن يوفر هذا على شخص آخر ساعات قليلة من تصحيح الأخطاء! سأقدر أيضًا إذا تمكن شخص ما من تأكيد ما إذا كان التثبيت على v10 سلوكًا متوقعًا للمضي قدمًا.

مشاركة رائعة، @mohamed3nan !!

شكراً لك على هذا، لقد أنشأت CAT-3666 كتذكرة تطوير داخلية لإصلاح هذا الأمر.

شكراً لك على إيجاد هذا الحل @mohamed3nan. لقد وفّر عليّ الكثير من التحقيقات!. إنه هش قليلاً إذا غيّروا الإصدار، لذا قمت بتحديثه للقراءة الصريحة للإصدار الحالي بهذه الطريقة:

RUN PNPM_VER=$(sed -n 's/.*"packageManager": "pnpm@\([^"]*\)".*/\1/p' /opt/runners/task-runner-javascript/node_modules/.modules.yaml) && \
    corepack prepare pnpm@${PNPM_VER} --activate && \
    cd /opt/runners/task-runner-javascript && \
    pnpm add \
        <list-of-packages>

آمل أن يكون هناك حل مناسب قبل تغيير الإصدار، لكن من الأفضل أن نكون حذرين.