32 votes

Comment gérez-VOUS les modules Perl lorsque vous utilisez un gestionnaire de packages?

Une récente question ici DONC ça m'a fait réfléchir.

Sur la plupart des distributions Linux que j'ai essayé, certains modules Perl serait disponible via le gestionnaire de paquets. D'autres, bien sûr, pas. Pendant très longtemps, je voudrais utiliser mon gestionnaire de paquets chaque fois que je besoin d'installer le module CPAN pour savoir si un paquet est disponible ou non, et de l'installer quand il a été.

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

Cependant, vous obtenez en difficulté lorsque le module n'est pas disponible en pré-emballés et il y a des dépendances pour ce module. Tir jusqu'à votre gestionnaire de paquet à chaque fois que le shell cpan demande si elle doit suivre une dépendance peut être très fatigant.

Souvent, un autre inconvénient est la version de la pré-emballés module. Si vous utilisez Debian ou Ubuntu, vous allez bientôt découvrir que vous ne serez pas en mesure de vivre sur le bord de saignement, comme beaucoup d'module CPAN auteurs semblent le faire.

Comment d'autres gens de Perl sous Linux gérer 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 avez-vous simplement de ne pas installer quoi que ce soit via le shell cpan?

35voto

brian d foy Points 71781

Pour le développement, j'ai installer mon propre Perl et de laisser le système de Perl seul. Si je veux mettre à jour le système de Perl, j'utilise le système du gestionnaire de package. Pour mon développement en Perl, j'utilise le cpan outil.

Depuis que j'ai garder des personnes distinctes, il ne faut jamais gâcher le Perl que le système a besoin pour ses tâches d'entretien et ainsi de suite, mais je n'ai pas compter sur le système de décisions pour le développement.

Il est très facile à installer séparé Perls. Lorsque vous exécutez le Configurer à partir de la distribution de la source, il va vous demander où vous voulez installer le tout. Donner n'importe quel chemin que vous le souhaitez. J'ai beaucoup de Perls installé dans /usr/local/perls, par exemple, et tout pour chaque installation vit séparément. J'ai ensuite faire des liens symboliques dans /usr/local/bin pour eux (par exemple, perl5.8.9, perl.5.10.0, perl5.10.0-thread). Quand je veux une version particulière, je viens d'utiliser celui que je veux:

$ perl5.10.0 program.pl

Le binaire particulier s'assure que le programme choisit le droit du module de chemin de recherche et ainsi de suite (c'est la même chose dans la Config.module pm pour que le binaire).

Voici un script que j'utilise pour créer les liens symboliques. Il se regarde dans le répertoire bin, les chiffres de la version en Perl, et établit des liens comme cpan5.10.1 et ainsi de suite. Chaque programme connaît déjà le droit de perl à l'appel:

#!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 se installer dans le bon endroit pour Perl.

J'ai aussi pensé que je devrais mettre ces Perl répertoires sous une certaine forme de contrôle de code source. Si j'ajoute un module que je n'aime pas, j'ai juste de retour d'une révision antérieure. Je suis le seul à commencer à le faire bien et n'ai pas joué à beaucoup.

J'ai écrit plus sur ce genre de chose dans l'efficacité de l'Perler blog:

12voto

Adam Bellaire Points 42797

Nous avons tout installer via le shell CPAN. Ce n'est d'ignorer ce que les gestionnaires de paquets ont à offrir, mais il évite les maux de tête que vous mentionnez en essayant de travailler avec eux (tir pour les dépendances, à l'aide de versions correctes).

En outre, il signifie que nos forfaits peuvent être construits par programmation (ou manuellement via le shell) sur n'importe quelle plate-forme où CPAN s'exécute. Ayant une dépendance sur un gestionnaire de paquets aurait une incidence sur votre capacité à distribuer votre logiciel de plates-formes qui ne l'utilisez pas/soutien que le gestionnaire de package.

9voto

Drew Taylor Points 196

Depuis que cette question a été posée à l'origine, perlbrew [1] a été publié. Cela rend l'installation de perl autonomes et personnalisées triviales. Et basculer entre ces versions est tout aussi simple: commutateur perlbrew $ version

[1] https://metacpan.org/module/App::perlbrew

7voto

Tom Feiner Points 4087

J'utilise Debian pour le développement et la production, et de s'appuyer sur debian des paquets Perl qui sont fournis avec la distribution.

Pour les cas où j'ai besoin d'un module Perl qui n'est pas disponible dans debian, j'ai l'habitude de créer mon propre paquet debian et de l'installer.

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

Toutefois, en s'appuyant sur le système d'exploitation le gestionnaire de package, je conserve toutes les fonctionnalités de celui-ci, qui apportent un entretien facile, surtout pour les serveurs déployés, comme vous le savez exactement ce que les paquets sont installés, et un simple apt-get update;apt-get upgrade (à partir de debian, ou à partir d'un référentiel local) met à niveau tous les serveurs dans le même état, y compris les modules Perl.

6voto

melo Points 155

Je ne le suit sur tous mes cartons:

  • J'ai compiler mon propre perl: - je encore utiliser 5.8.[89] surtout, le stock 5.10.0 a une régression de la performance qui me frappe beaucoup, en attendant 5.10.1 d'essayer de nouveau;
  • J'utilise (et fortement recommandé) local::lib module de garder un module répertoire par projet. Maintenant, ce répertoire est rsync ed sur tous les serveurs où le projet est installé, mais je suis en essais à l'aide de git au lieu;
  • J'ai créer une Tâche:: module pour chaque projet, de sorte que je peux installer toutes les dépendances avec une seule commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X