كيف يمكنني تثبيت وحدات CPAN محليًا دون الوصول إلى الجذر (خطأ DynaLoader.pm السطر 229)؟

StackOverflow https://stackoverflow.com/questions/102850

  •  01-07-2019
  •  | 
  •  

سؤال

لا يعمل مع وحدات أخرى، ولكن لإعطاء مثال.لقد قمت بتثبيت Text::CSV_XS بإعداد CPAN:

'makepl_arg' => q[PREFIX=~/lib],

عندما أحاول تشغيل البرنامج النصي test.pl:

$ بيرل test.pl

#!/usr/bin/perl

use lib "/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi";

use Text::CSV_XS;

print "test";

انا حصلت

Can't load '/homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so' for module Text::CSV_XS: /homes/foobar/lib/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/Text/CSV_XS/CSV_XS.so: cannot open shared object file: No such file or directory at /www/common/perl/lib/5.8.2/i686-linux/DynaLoader.pm line 229.
at test.pl line 6
Compilation failed in require at test.pl line 6.
BEGIN failed--compilation aborted at test.pl line 6.

لقد قمت بتتبع الخطأ مرة أخرى إلى DynaLoader.pm ويحدث على هذا السطر:

# Many dynamic extension loading problems will appear to come from
# this section of code: XYZ failed at line 123 of DynaLoader.pm.
# Often these errors are actually occurring in the initialisation
# C code of the extension XS file. Perl reports the error as being
# in this perl code simply because this was the last perl code
# it executed.

my $libref = dl_load_file($file, $module->dl_load_flags) or
    croak("Can't load '$file' for module $module: ".dl_error());

CSV_XS.so موجود في الدليل أعلاه

هل كانت مفيدة؟

المحلول

أنا شخصياً أقترح استخدامه محلي :: ليب. :)

نصائح أخرى

عندما قمت بتثبيت الوحدة، هل شاهدت الإخراج؟أين قال أنه تم تثبيت الوحدة؟إنظر في ليب.هل ترى الدليل التالي الذي تتوقعه؟

ابحث في ~/lib لمعرفة أين انتهى كل شيء للتحقق من أن لديك اسم الدليل الصحيح في ملف use lib إفادة:

% find ~/lib -name CSV_XS.so

بمجرد معرفة مكان تثبيته، استخدم اسم الدليل هذا في ملف use lib (أو PERL5LIB أو أيًا كان).

أتوقع أن يكون لديك lib/lib هناك بطريقة أو بأخرى.ال PREFIX هي مجرد بادئة، ويقوم المثبت بإلحاق أجزاء الدليل الأخرى بهذا المسار الأساسي.يتضمن ذلك lib، وman، وbin، إلخ.

جرب هذا بدلاً من ذلك:

'makepl_arg' => q[PREFIX=~/]

تقوم PREFIX بتعيين الأساس لجميع الدلائل التي سيتم تثبيتها فيها (bin، وlib، وما إلى ذلك.)

ربما تواجه أيضًا مشكلات في توسيع الصدفة مع "~".يمكنك محاولة توسيعه بنفسك:

'makepl_arg' => q[PREFIX=/home/users/foobar]

سيكون من المفيد أيضًا تضمين الأوامر التي استخدمتها للحصول على الخطأ الذي تسأل عنه.

يبدو من رسالة الخطأ ("في /www/common ...") أن البرنامج النصي الخاص بك هو برنامج نصي CGI أو mod_perl.ربما لا يعمل خادم الويب باسم المستخدم "foo"، الذي قمت بتثبيت الوحدة ضمن دليله الرئيسي - مما قد يؤدي إلى عدم قدرة خادم الويب على قراءة هذا الدليل.

وقد يتم تشغيله أيضًا في "سجن كروت"، مما يعني أن الدليل الذي قمت بتثبيت الوحدة فيه قد لا يكون مرئيًا للبرنامج النصي.

بمعنى آخر، فقط لأنه أنت القدرة على رؤية الوحدة، لا يعني أن خادم الويب، وبالتالي البرنامج النصي الخاص بك، يمكنه القيام بذلك.يجب عليك التحقق من أذونات الملفات ذات الصلة، وما إذا كان الخادم قد تم تجذيره، وما إذا كان دليل الوحدة الخاص بك مثبتًا داخل نظام الملفات الظاهري.

هل الملف المعني (CSV_XS.so) موجود؟

هل هو موجود في المكان المذكور؟

اذا فعلت:

set |grep PERL

ما هو الناتج؟

هل نجحت في تثبيت وحدات بيرل المحلية الأخرى؟

أقترح بشدة تثبيت لغة Perl الخاصة بك في الدليل الرئيسي الخاص بك، إذا كان لديك مساحة.بعد ذلك، يمكنك إبقاء كل شيء تحت سيطرتك والاحتفاظ بمجموعة الوحدة النمطية الخاصة بك، بالإضافة إلى الهروب إذا كان المسؤولون يبقونك على إصدار أقدم من Perl.(ناهيك عن الحفاظ على نفسك إذا قاموا بالترقية يومًا ما وتركوا جميع الوحدات التي تعتمد عليها.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top