كيف يمكنني تحديد CPAN تبعيات قبل نشر بيرل المشروع ؟

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

سؤال

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

هل لدى أحدكم أي رؤى المشكلة.

شكرا

بيتر

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

المحلول

ولقد كان لي هذه المشكلة نفسي. جمعة :: Modlist (وعلى النحو الذي اقترحه <لأ href = "HTTPS: // stackoverflow.com/questions/240704/how-can-i-determine-cpan-dependencies-before-i-deploy-a-perl-project#240723">this الجواب ) نهجا الحيوية. فإنه تقارير الوحدات التي تم تحميلها بالفعل خلال تشغيل معين من السيناريو الخاص بك. هذا يمسك الوحدات النمطية التي تم تحميلها من قبل بأي وسيلة، ولكن قد لا قبض متطلبات المشروطة. وهذا هو، إذا كان لديك رمز مثل هذا:

if ($some_condition) { require Some::Module }

وو$some_condition يحدث أن تكون كاذبة، وDevel::Modlist لا تسرد Some::Module كشرط.

وقررت استخدام وحدة :: ExtractUse بدلا من ذلك. انه يقوم التحليل ثابت، مما يعني أنه سوف يمسك دائما Some::Module في المثال أعلاه. من ناحية أخرى، فإنه لا يمكن فعل أي شيء حيال كود مثل:

my $module = "Other::Module";
eval "use $module;";

وبطبيعة الحال، هل يمكن استخدام كلا النهجين ثم الجمع بين القائمتين.

وعلى أي حال، وهنا يكمن حل خطرت لي:

#! /usr/bin/perl
#---------------------------------------------------------------------
# Copyright 2008 Christopher J. Madsen <perl at cjmweb.net>
#
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See either the
# GNU General Public License or the Artistic License for more details.
#
# Recursively collect dependencies of Perl scripts
#---------------------------------------------------------------------

use strict;
use warnings;
use File::Spec ();
use Module::CoreList ();
use Module::ExtractUse ();

my %need;
my $core = $Module::CoreList::version{'5.008'};

# These modules have lots of dependencies.  I don't need to see them now.
my %noRecurse = map { $_ => 1 } qw(
  Log::Log4perl
  XML::Twig
);

foreach my $file (@ARGV) {
  findDeps($file);
}

foreach my $module (sort keys %need) {
  print "  $module\n";
}

#---------------------------------------------------------------------
sub findDeps
{
  my ($file) = @_;

  my $p = Module::ExtractUse->new;

  $p->extract_use($file);

  foreach my $module ($p->array) {
    next if exists $core->{$module};
    next if $module =~ /^5[._\d]+/; # Ignore "use MIN-PERL-VERSION"
    next if $module =~ /\$/;        # Run-time specified module

    if (++$need{$module} == 1 and not $noRecurse{$module}) {
      my $path = findModule($module);
      if ($path) { findDeps($path) }
      else       { warn "WARNING: Can't find $module\n" }
    } # end if first use of $module
  } # end foreach $module used
} # end findDeps

#---------------------------------------------------------------------
sub findModule
{
  my ($module) = @_;

  $module =~ s!::|\'!/!g;
  $module .= '.pm';

  foreach my $dir (@INC) {
    my $path = File::Spec->catfile($dir, $module);
    return $path if -f $path;
  }

  return;
} # end findModule

وتريد تشغيل هذا مثل:

perl finddeps.pl scriptToCheck.pl otherScriptToCheck.pl

وويطبع قائمة بجميع الوحدات غير الأساسية اللازمة لتشغيل البرامج النصية المدرجة. (ما لم يفعلوا الحيل يتوهم مع وحدة التحميل التي تحول دون وحدة :: ExtractUse من رؤيتهم.)

نصائح أخرى

ويمكنك استخدام الانترنت على شبكة الإنترنت خدمة في deps.cpantesters.org من شأنها أن توفر لك العديد من التبعية مفيدة البيانات. جميع الوحدات على كبان لديها بالفعل وصلة الى موقع التبعية (على الجانب الأيمن من الصفحة وحدة).

في الماضي كنت قد استخدمت جمعة :: Modlist وهو أمر جيد معقول السماح لك أن تذهب

perl -d:Modlist script.pl

للحصول على قائمة من الوحدات المطلوبة.

يجب أن يستند إلى بناء نظام ل كل ما عندي من C/C++ التطبيقات (سواء المستندة إلى الكمبيوتر المختلفة جزءا لا يتجزأ من المشروع) ، بينما أنا أحب أن تكون قادرة على القيام المستوى الأعلى بناء على آلة الطازجة و التحقق من كل التبعيات في مكان (يمكنني التحقق من toolchains في تنقيح التحكم :D) كنت تشعر بالإحباط لا تفعل الشيء نفسه بالنسبة تفسير اللغات التي لديها حاليا أي makefile في بناء النظام.

أنا يميل إلى كتابة السيناريو:

  • البحث بلدي مراجعة التحكم في مستودع الملفات .رر او .مساء امتداد
  • يعمل perl -d:Modlist عليها (شكرا Vagnerr!)
  • وصل إلى قائمة من الوحدات المطلوبة
  • وأخيرا مقارنتها قائمة وحدات مثبتة.

أود ثم تنفيذ هذا السيناريو كجزء من بلدي أعلى مستوى بناء ، حيث أن أي شخص بناء أي شيء سوف تعرف إذا كان لديهم كل ما يحتاجون إلى تشغيل كل perl لديهم من مراجعة مراقبة.إذا كان هناك بعض perl أنها لا تهرب و لا أريد أن CPAN تثبيت ما هو مطلوب لتشغيل ذلك ، يجب أن إزالة غير المرغوب فيها البرنامج النصي من طوة ، وبالتالي فإن الاعتماد على المدقق لا يمكن العثور عليها.أنا أعرف كيفية تعديل بالضرورة العميل إلى ترك بعض الدلائل عند القيام بعملية متزامنة ' ، يجب أن معرفة ذلك من أجل التخريب...

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

كما قلت أنا لم تنفذ أعلاه بعد ، ولكن هذا السؤال دفعني إلى محاولة القيام بذلك.أنا ما بعد الظهر مع تجربتي بعد أن انتهيت.

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

والنظر في تشغيل الخاص بك مستودع المحلي الخاص من وحدات CPAN - بحيث لا يكون لديك دائما لتحميل الشفرة. ضع في اعتبارك أيضا كيف تنظيف من وحدات الآن.

use Acme::Magic::Pony;

وعلى محمل الجد. وسوف صناعة السيارات في تركيب وحدات بيرل إن رفض في عداد المفقودين. انظر أكمي :: السحر: : الصفحة المهر في CPAN

عن "حصان وهذا ما انسحب" الجواب ولكن أنا عندي في العادة من إنشاء ملف حزمة بكل ما أوتيت من التبعيات. وهكذا عندما أذهب إلى بيئة جديدة أنا فقط انسخها وتثبيته.

لعلى سبيل المثال. لدي Baz.pm

package Bundle::Baz;
$VERSION = '0.1';
1;
__END__
=head1 NAME
Bundle::Baz
=head1 SYNOPSIS
perl -MCPAN -e 'install Bundle::Baz'
=head1 CONTENTS
# Baz's modules
XML::Twig
XML::Writer
Perl6::Say
Moose

ووضع هذا في ~ / .cpan / حزمة / (أو في أي مكان حياة .cpan الخاص بك) ومن ثم تثبيت "حزمة :: باز 'مثل وحدة نمطية CPAN العادية. هذا ثم يقوم بتثبيت جميع الوحدات المدرجة تحت عنوان "المحتويات = head1".

وهنا هي وظيفة ضربة سريعة باش (باستخدام ACK ):

# find-perl-module-use <directory> (lib/ by default)
function find-perl-module-use() {
    dir=${1:-lib}
    ack '^\s*use\s+.*;\s*$' $dir | awk '{ print $2 }' | sed 's/();\?$\|;$//' | sort | uniq
    ack '^\s*use\s+base\s+.*;\s*$' $dir | awk '{ print $3 }' | sed 's/();\?$\|;$//' | sort | uniq
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top