Comment gérer les modules Perl en utilisant un gestionnaire de paquets?

Un récente de la question ici DONC, m'a fait réfléchir.

sur la plupart des distributions Linux que j'ai essayées, certains modules Perl seraient disponibles via le gestionnaire de paquets. D'autres, bien sûr, pas. Pendant un certain temps, j'utilisais mon gestionnaire de paquets chaque fois que j'avais besoin d'installer un module CPAN pour savoir si un paquet était disponible ou non et pour l'installer quand il l'était.

L'avantage évident est que vous obtenez votre modules mis à jour chaque fois qu'une nouvelle version du paquet est disponible.

cependant, vous avez des problèmes lorsque le module n'est pas disponible sous forme préemballée et qu'il y a des dépendances pour ce module. Démarrer votre gestionnaire de paquets à chaque fois que le shell cpan demande s'il doit suivre une dépendance peut être assez fatiguant.

souvent, un autre inconvénient est la version du module préemballé. Si vous utilisez Debian ou Ubuntu, vous bientôt découvrez que vous ne serez pas en mesure de vivre sur le bord du saignement, comme de nombreux auteurs de module CPAN semblent le faire.

comment les autres Perl sur Linux gèrent-ils ce problème? Avez-vous juste ignorer ce que vos gestionnaires de paquets ont à offrir? Existe-il des outils qui permettent d'apt (par exemple) et cpan mieux coéquipiers? Ou est-ce que vous n'installez rien via le shell cpan?

30
demandé sur Community 2008-12-29 21:01:21

10 réponses

depuis que cette question a été posée, perlbrew a été publié. Il rend l'installation Perl personnalisé, autonome installe trivial. Et passer d'une version à l'autre est tout aussi facile:

perlbrew switch $version
8
répondu Drew Taylor 2015-09-28 14:42:23

pour le développement, j'installe mon propre Perl et je laisse le système Perl tranquille. Si je veux mettre à jour le système Perl, j'utilise le gestionnaire de paquets système. Pour mon développement Perl,j'utilise l'outil cpan.

puisque je les garde séparés, Je ne devrais jamais gâcher le Perl dont le système a besoin pour ses tâches de maintenance et ainsi de suite, mais je n'ai pas à me fier aux décisions du système pour le développement.

il est très facile d'installer des perles séparées. Lorsque vous exécutez Configure à partir de la distribution source, il vous demandera où vous voulez tout installer. Donner n'importe quel chemin que vous le souhaitez. J'ai beaucoup de Perls installé dans /usr/local/perl , par exemple, et tout pour chaque installation vit séparément. Je fais ensuite des liens symboliques dans /usr/local / bin pour eux (par exemple perl5.8.9, perl.5.10.0, perl5.10.0-filetés). Quand je veux une version particulière, j'utilise juste celle que je veux:

$ perl5.10.0 program.pl

le binaire particulier assure que le programme prend le bon chemin de recherche de module et ainsi de suite (c'est la même chose dans la configuration.module pm pour ce binaire).

Voici un script que j'utilise pour créer les liens symboliques. Il regarde dans le répertoire bin, trouve la version Perl, et fait des liens comme cpan5.10.1 et ainsi de suite. Chaque programme connaît déjà le bon perl à appeler:

#!perl

use 5.010;

use strict;
use warnings;

use File::Basename;
use File::Spec::Functions;

my $perls_directory = catfile(
    $ARGV[0] // '/usr/local/perls', 
    'perl*'
);
die "$perls_directory does not exist!\n" 
    unless -d dirname $perls_directory;

my $links_directory = $ARGV[1] // catfile( $ENV{HOME}, 'bin' ); #/
die "$links_directory does not exist!\n" unless -d $links_directory;

foreach my $directory ( glob( $perls_directory ) )
{
    say "Processing $directory...";

    unless( -e catfile( $directory, 'bin' ) )
    {
        say "\tNo bin/ directory. Skipping!";
        next;
    }

    my @perls = glob( catfile( $directory, qw( bin perl5* ) ) );    

    my( $perl_version ) = $perls[0] =~ m/(5\.\d+\.\d+)\z/;
    say "\tperl version is $perl_version";

    foreach my $bin ( glob( catfile( $directory, 'bin', '*' ) ) )
    {
        say "\tFound $bin";
        my $basename = basename( $bin );

        my $link_basename = do {
            if( $basename =~ m/5\.\d+\.\d+\z/) { $basename }
            else                               { "$basename$perl_version" }
        };

        my $link = catfile( $links_directory, $link_basename );
        next if -e $link;
        say "\t\tlinking $bin => $link";
        symlink $bin => $link or
            warn "\t\tCould not create symlink [$!]: $bin => $link!";
    }
}

tout est installé à la bonne place pour que particulier Perl.

j'ai aussi pensé que je devrais mettre ces répertoires Perl sous une sorte de contrôle source. Si j'ajoute un module que je n'aime pas, je reviens à une révision antérieure. Je commence seulement à le faire et je n'ai pas beaucoup joué avec.

j'ai écrit plus sur ce genre de chose dans le blog Perler efficace:

35
répondu brian d foy 2015-09-28 14:41:14

nous installons tout via le shell CPAN. Cela ne tient pas compte de ce que les gestionnaires de paquets ont à offrir, mais cela évite les maux de tête que vous mentionnez lorsque vous essayez de travailler avec eux (tirer pour des dépendances, utiliser des versions correctes).

en outre, cela signifie que nos paquets peuvent être construits programmatiquement (ou manuellement via le shell) sur n'importe quelle plate-forme où CPAN fonctionne. Avoir une dépendance sur un gestionnaire de paquets affecterait votre capacité à distribuer votre logiciel aux plateformes qui n'utilisent pas / ne supportent pas ce gestionnaire de paquets.

12
répondu Adam Bellaire 2008-12-29 18:06:23

je fais ce qui suit sur toutes mes boîtes:

  • j'ai compilé mon propre perl: j'utilise toujours 5.8.[89] la plupart du temps, le stock 5.10.0 a une régression de performance qui me frappe beaucoup, en attendant 5.10.1 pour essayer à nouveau;
  • j'utilise (et recommande fortement) le module local::lib pour garder un répertoire de modules par projet. En ce moment, ce répertoire est rsync'ed à tous les serveurs où le projet est installé, mais je teste en utilisant git à la place;
  • je crée une tâche:: module pour chaque projet, de sorte que je puisse installer toutes les dépendances avec une seule commande.
6
répondu melo 2008-12-30 01:42:36

j'utilise Debian pour le développement et la production, et je me fie aux paquets Perl de debian qui sont fournis avec la distro.

dans les cas où j'ai besoin d'un module Perl qui n'est pas disponible dans debian, je crée habituellement mon propre paquet debian et je l'installe.

bien sûr, cette méthode n'est pas sans défauts, car beaucoup de modules perl debian sont dépassés (au moins dans la version stable actuelle de debian - etch), et rétroporter quelque chose comme catalyseur qui a beaucoup de dépendances n'est pas pratique.

Cependant, en m'appuyant sur le gestionnaire de paquets OS, je retiens toutes les grandes fonctionnalités de celui-ci, qui apportent une maintenance facile, surtout pour les serveurs déployés, car vous savez exactement quels paquets sont installés, et un simple apt-get update;apt-get upgrade (de debian, ou d'un dépôt local) met à niveau tous les serveurs dans le même état, y compris les modules Perl.

6
répondu Tom Feiner 2009-02-14 18:22:19

j'utilise aussi le shell cpan et local::lib.

Vous ne devriez pas avoir besoin d'une Tâche:: pour chaque projet. Il suffit D'utiliser Module::Install (J'aime utiliser Module:: Starter like this:

$ module-starter --mi --module=Module::Name --author="Me" --email=me@cpan.org

et ensuite pop vos dépendances dans requires 'module::dependency'; dans le Makefile.PL. Enfin quand il est temps d'installer, vous juste perl Makefile.PL (Réponse Oui) puis make installdeps

[modifier 5 ans quand j'ai donné cette réponse à l'origine]

de nos jours perlbrew et cpanm sont les choses à utiliser. local:: lib a toujours un cas d'utilisation, mais la combinaison de perlbrew et cpanm résout un super-ensemble de ces cas. Utilisez local:: lib lorsque vous n'êtes pas prêt à compiler votre propre perl.

4
répondu singingfish 2014-03-29 05:55:18

je recommande l'utilisation uniquement de cpan. Les modules inclus dans Linux distro est seulement pour couvrir la dépendance du paquet. Quand vous installez linux sans accès à internet avec seulement des CD, il ne peut pas utiliser cpan, donc certains modules sont inclus comme paquets, mais pour un développeur Perl c'est mauvais.

aussi j'avais l'habitude d'avoir un cpan configuré pour installer des modules dans ma maison, (.perl) sans connexion root nécessaire.

0
répondu brian d foy 2008-12-29 19:23:28

pour la production:

en développement, choisissez une version du module perl qui semble adaptée aux besoins; si possible, choisissez la version livrée du système d'exploitation cible (ce qui rend la plupart des éléments suivants superflus), sinon, choisissez une autre. Créez un fichier RPM spec pour lui. Utilisez la VM clean build pour construire le RPM d'une manière reproductible (à partir d'un fichier / source vérifié sur la branche appropriée).

quand la construction finale peut être construite (après la fusion), faites la même Compilation à partir de la branche de publication, propagez les RPM générés dans le dépôt de déploiement. Cette information sera utilisée lors de la validation finale et sera ensuite envoyée à la production en étant copiée dans le dépôt de production.

tous les serveurs en production utilisent le même binaire qui a été entièrement testé; ils utilisent le même fichier spec et la même source que le développeur prévu.

Les modules Perl

ne sont pas mis à jour par un processus qui ne suit pas cette procédure modèle. Ni tout autre logiciel de production.

0
répondu MarkR 2009-02-14 21:28:28

j'utilise les ports FreeBSD et j'emballe toutes les dépendances CPAN dans un" meta port "comme une sorte de port local . FreeBSD a un assez grand nombre de modules CPAN et leur système de construction est suffisamment accessible pour que vous puissiez facilement écrire votre propre port s'il n'existe pas-n'oubliez pas simplement de soumettre le port pour qu'il soit inclus dans l'arborescence des ports. Si le port n'a pas la version actuelle en stock, vous pouvez toujours éditez le Makefile du port pour qu'il utilise la nouvelle version, encore une fois n'oubliez pas de soumettre la modification :-).

enfin, j'utilise Tinderbox pour construire l'ensemble du mess sous forme de paquets binaires que j'installe ensuite sur toutes les machines de production et de développement.

en bref--une fois passée votre phobie de l'édition des Makefiles, les ports de FreeBSD sont un excellent moyen de maintenir votre application perl et son dépendance.

0
répondu Cory R. King 2009-03-02 21:54:43

j'ai commencé à utiliser Gentoo récemment et Gentoo a quelques avantages très importants dans ce domaine. La première est que g-cpan est capable habituellement d'installer beaucoup (mais pas tous) de modules de CPAN comme paquets Gentoo nativement, bien que la mise à jour devienne un peu un problème.

habituellement sur Gentoo, mon approche est d'utiliser g-cpan pour créer un fichier ebuild, puis installer à partir de cela, peaufiner si nécessaire. L'avantage est que la mise à niveau devient vraiment facile. Je déplace alors le fichier de G-cpan/perl à dev-perl et le mets dans une superposition pour que d'autres puissent l'utiliser. Cela me permet de gérer rapidement les cas g-cpan ne fait pas et Gentoo emballage est une brise de toute façon/

0
répondu Chris Travers 2017-09-28 08:06:15