Packaging Perl Modules

40
Packaging Perl Modules Kirrily Robert

description

A talk from the Open Source Developers' Conference 2007. How to package Perl modules for CPAN, why it's a great format, and why you should use it even outside of CPAN itself.

Transcript of Packaging Perl Modules

Page 1: Packaging Perl Modules

Packaging Perl ModulesKirrily Robert

Page 2: Packaging Perl Modules

Look familiar?

~skud/.cpan/build/Archive-Any-0.093 $ lsBuild.PL META.yml README pm_to_blibChanges Makefile blib tMANIFEST Makefile.PL lib

Page 3: Packaging Perl Modules

Today...

• How CPAN modules are packaged

• Why it rocks

• Why you should use it everywhere

• How to integrate it with release mgt

Page 4: Packaging Perl Modules

Creating CPAN modules

• Always use h2xs

• Always use h2xs

• ALWAYS use h2xs

Page 5: Packaging Perl Modules

Wrong.

Page 6: Packaging Perl Modules

Two main options

• h2xs

• module-starter

Page 7: Packaging Perl Modules

h2xs

• Old-school

• Comes with Perl

• Few modern features

• Good XS stubs, though

Page 8: Packaging Perl Modules

module-starter

• Module::Starter on CPAN

• Modern features

• Better stubs

• Higher Kwalitee

Page 9: Packaging Perl Modules

module-starter

$ module-starter --module Gift::BasketCreated starter directories and files

$ ls Gift-Basket/Build.PL MANIFEST libChanges README t

Page 10: Packaging Perl Modules

Configuration

$ cat ~/.module-starter/configbuilder: Module::Buildauthor: Kirrily Robertemail: [email protected]

Page 11: Packaging Perl Modules

Module layout

Build.PL MANIFEST libChanges README t

Page 12: Packaging Perl Modules

Build.PLuse strict;use warnings;use Module::Build;

my $builder = Module::Build->new( module_name => 'Gift::Basket', license => 'perl', dist_author => 'Kirrily Robert <[email protected]>', dist_version_from => 'lib/Gift/Basket.pm', build_requires => { 'Test::More' => 0, }, add_to_cleanup => [ 'Gift-Basket-*' ],);

$builder->create_build_script();

Page 13: Packaging Perl Modules

Changes

Revision history for Gift-Basket

0.03 2007-11-20 Added support for shipping gift baskets to addresses within Australia and NZ.

0.02 2007-11-05 Fixed a bug with adding chocolates to the basket.

0.01 2007-11-01 Initial release. Includes methods for building a gift basket and calculating prices. Not ready for production.

Page 14: Packaging Perl Modules

MANIFEST

Build.PLChangesMANIFESTMETA.yml # Will be created by "make dist"READMElib/Gift/Basket.pmt/00-load.tt/boilerplate.tt/pod-coverage.tt/pod.t

Page 15: Packaging Perl Modules

README

• Description

• Installation

• Support

• License

Page 16: Packaging Perl Modules

lib/

$ find libliblib/Giftlib/Gift/Basket.pm

Page 17: Packaging Perl Modules

t/

$ find ttt/00-load.tt/boilerplate.tt/pod-coverage.tt/pod.t

Page 18: Packaging Perl Modules

Building modules

• ./Build dist

• ./Build disttest

• Upload to PAUSE

• http://pause.perl.org

• cpaninject

Page 19: Packaging Perl Modules

Why this rocks

• Standard build/install tools

• Metadata and tests included by default

• Encourages modularity

Page 20: Packaging Perl Modules

Non-CPAN CPAN Modules

Page 21: Packaging Perl Modules

Standard build tools

• Save time and effort

• Already familiar to many developers

• Easy release path to CPAN

Page 22: Packaging Perl Modules

Metadata and tests

• Encourage testing

• Specify dependencies

Page 23: Packaging Perl Modules

Modularity

• Reduce spaghetti

• Share code between projects

• Easy release path to CPAN

Page 24: Packaging Perl Modules

Example

$ ls code/GiftCo-CoreGiftCo-DBGiftCo-MailTools

GiftCo-Payments GiftCo-ReportingGiftCo-Website

Page 25: Packaging Perl Modules

Web Server

GiftCo::Website

GiftCo::Core

GiftCo::DB

GiftCo::Payments

Page 26: Packaging Perl Modules

Backend

GiftCo::Core

GiftCo::DB

GiftCo::Payments

GiftCo::Reporting

GiftCo::MailTools

Page 27: Packaging Perl Modules

Installation

• Local CPAN

• Distro packages

Page 28: Packaging Perl Modules

Local CPAN

• MiniCPAN

• Add local packages

• Configure CPAN.pm

Page 29: Packaging Perl Modules

MiniCPAN

• perl -MCPAN -e ‘install CPAN::Mini’

• minicpan -l $LOCAL -r $REMOTE

Page 30: Packaging Perl Modules

Inject

• perl -MCPAN -e ‘install CPAN::Mini::Inject’

• mcpani --add --module GiftCo::DB --authorid SKUD --modversion 0.01--file GiftCo::DB-0.01.tar.gz

Page 31: Packaging Perl Modules

Configure

cpan[1]> o conf urllist urllist 0 [file:///Users/skud/mirrors/cpan/] 1 [ftp://cpan.pair.com/pub/CPAN/] 2 [ftp://cpan.hexten.net/]

Page 32: Packaging Perl Modules

Distro packages

• Integrates with non-Perl packages

• Standardised install procedure

• Sysadmins like them

Page 33: Packaging Perl Modules

DependenciesGiftCo::DB

DBD::mysql

DBI

mysql-lib

Page 34: Packaging Perl Modules

Packaging

• cpan2rpm

• dh-make-perl

Page 35: Packaging Perl Modules

cpan2rpm

• Creates RPMs from CPAN modules

• Redhat-derived distros

• cpan2rpm -U GiftCo::DB

• Creates full RPM package

Page 36: Packaging Perl Modules

dh-make-perl

• Comes with Debian/Ubuntu

• Creates .deb packages

• dh-make-perl GiftCo-DB-0.01/

• Creates debian/ directory

Page 37: Packaging Perl Modules

Issues

• Neither follows CPAN dependencies

• You must walk the dep tree (once)

• Can specify deps thereafter

Page 38: Packaging Perl Modules

Example

GiftCo::Website

libgiftco-website-perl

GiftCo::DB

libgiftco-db-perl

becomes becomes

requires

requires

Page 39: Packaging Perl Modules

apt-get install

$ sudo apt-get install giftco-websiteReading package lists... DoneBuilding dependency tree... DoneThe following extra packages will be installed: libgiftco-website-perl libgiftco-db-perl libgiftco-core-perl libgiftco-payments-perl libdbi-perl libdbd-mysql-perl libmysqlThe following NEW packages will be installed: giftco-website libgiftco-website-perl libgiftco-db-perl libgiftco-core-perl libgiftco-payments-perl libdbi-perl libdbd-mysql-perl libmysql0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.Need to get 8.3MB of archives.After unpacking 25MB of additional disk space will be used.Do you want to continue [Y/n]?