Как я могу определить зависимости CPAN, прежде чем я разверну проект Perl?

Например, в задаче машинного перевода, интуитивно это эквивалентно выводу переведенного слова, а затем повторению всей вашей внутренней памяти текста, чтобы решить, какое слово создавать следующим. Это кажется пустой тратой, а вовсе не тем, что делают люди. На самом деле, это больше похоже на доступ к памяти, а не на внимание, что, на мой взгляд, несколько неправильно (подробнее об этом ниже). Тем не менее, это не помешало механизмам внимания стать достаточно популярными и хорошо выполнять многие задачи.

13
задан brian d foy 27 October 2008 в 20:10
поделиться

8 ответов

У меня была эта проблема самого. Devel:: Modlist (как предложено этим ответом) проявляет динамический подход. Это сообщает о модулях, которые были на самом деле загружены во время конкретного выполнения Вашего сценария. Это ловит модули, которые загружаются каким-либо образом, но это не может поймать условные требования. Таким образом, если у Вас есть код как это:

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 от наблюдения их.)

14
ответ дан 1 December 2019 в 17:42
поделиться

Можно использовать веб-сервис онлайн в deps.cpantesters.org , который предоставит Вам много полезных данных зависимости. Все модули на CPAN уже имеют ссылку на сайт зависимости (на правой стороне страницы модуля).

11
ответ дан 1 December 2019 в 17:42
поделиться

У меня есть Делание - базирующаяся система сборки для всех моих приложений C/C++ (и основанный на ПК и для различных встроенных проектов), и в то время как я люблю способность сделать, верхний уровень основывается на новой машине и проверяет, что все зависимости существуют (я регистрирую свои наборы инструментальных средств к управлению версиями :D), я был расстроен при не выполнении того же для интерпретируемых языков, которые в настоящее время не имеют никакого make-файла в моей системе сборки.

я испытываю желание записать сценарий что:

  • поиски мой репозиторий управления версиями для файлов с .pl или .pm расширением
  • выполнения perl -d:Modlist на них (благодарит Vagnerr!)
  • конкатенация его к списку необходимых модулей
  • и наконец сравнение его к списку установленных модулей.

я затем выполнил бы тот сценарий как часть моей сборки верхнего уровня, так, чтобы любой создающий что-либо знал, есть ли у них все, что они должны запустить каждый скрипт жемчуга, который они получили от управления версиями. Если существует некоторый сценарий жемчуга, они никогда не выполняют и не хотят к установке CPAN, что требуется выполнить его, они должны были бы удалить нежелательный сценарий из своего жесткого диска, таким образом, средство проверки зависимости не может найти их. Я знаю, как изменить по необходимости клиент для игнорирования определенных подкаталогов, когда Вы делаете 'синхронизацию', я должен буду понять это для подверсии...

я предложил бы заставить зависимость разнообразить единственный сценарий, который ищет мн файлы, в противоположность отдельному make-файлу для проверки зависимостей на каждый сценарий, или на основе трудно кодированного списка названий сценария. Если Вы выберете метод, который требует, чтобы пользовательское действие проверило сценарий на зависимости, то люди забудут выполнять то действие, так как они смогут запустить скрипт, даже если они не сделают проверки зависимости.

Как я сказал, я еще не реализовал вышеупомянутое, но этот вопрос предложил мне пытаться сделать так. Я отправлю назад с моим опытом после того, как я буду сделан.

5
ответ дан 1 December 2019 в 17:42
поделиться

В прошлом я использовал Devel:: Modlist, который является довольно хорошим разрешением Вам пойти

perl -d:Modlist script.pl

Для получения списка необходимых модулей.

10
ответ дан 1 December 2019 в 17:42
поделиться

'Очевидный' путь - болезненный, но умеренно эффективный - состоит в том, чтобы установить совершенно новую сборку основного Perl в некоторых из пути местоположение (Вы не собираетесь использовать это в производстве), и затем попытайтесь установить свой модуль с помощью этой 'девственной' версии Perl. Вы найдете все недостающие зависимости. В первый раз это могло быть болезненно. После первого раза у Вас уже будет большинство зависимостей охваченным, и это будет значительно менее болезненно.

Рассматривают выполнение Вашего собственного локального репозитория модулей CPAN - так, чтобы необходимо было не всегда загружать код. Также рассмотрите, как Вы очищаете устаревшее модули.

3
ответ дан 1 December 2019 в 17:42
поделиться
use Acme::Magic::Pony;

Серьезно. Это автоустановит модули Perl, если они поднимут пропавших без вести. Посмотрите Высшая точка:: Волшебство:: страница Pony в CPAN.

3
ответ дан 1 December 2019 в 17:42
поделиться

Вот беглая функция удара (использование превосходного 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
}
1
ответ дан 1 December 2019 в 17:42
поделиться

"Лошадь это соединяется болтом" ответ, но я выработал привычку создания файла Пакета со всеми моими зависимостями. Таким образом, когда я перехожу к новой среде, я просто копирую ее и устанавливаю ее.

Для, например, у Меня есть 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/Bundle/(или везде, где Ваш .cpan живет), и затем установите 'Пакет:: Baz' как нормальный модуль CPAN. Это затем устанавливает все модули, перечисленные под "=head1 СОДЕРЖАНИЕ".

2
ответ дан 1 December 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: