Dist::Zilla
   raaaaaaaaar!
you @ cpan . org


This talk is about your life as a CPAN author.
CPAN == Dists

The CPAN is just a bunch of dists (distributions).
YourApp-1.0.tar.gz
                      isa Dist


and a distribution is just an archive file
dists contain files
~/code/YourApp$ find .
          ./Changes
          ./LICENSE
          ./MANIFEST.SKIP
          ./Makefile.PL
         ...
being a dist author is hard!
          let’s go gemming!
Module::Starter
C  K S  !
   U
Module::Starter
 S
only gets you to a
 starting point
can’t rebuild from
templates post facto
can’t add files to your dist
no good for files that
need to be rebuilt a lot
Module::Install
generates some files
when running ‘make’
Makefile.PL


takes the usually short Makefile.PL
Makefile.PL




makes it slightly smaller
Module::Install
C K  S !
   U
Module::Install
 S
relies on
ExtUtils::MakeMaker
relies on
ExtUtils::MakeMaker
                 CK S!
              SU
puts insane complexity
 on user’s computer
bundles scary, versioned
   code in the dist
when bugs are fixed,
everybody re-releases
...to review...
writing code == fun
writing
=head1 LICENSE
   NOT FUN
Dist::Zilla
   raaaaaaaaar!
~/code/YourApp$ find .
           ./Changes
           ./LICENSE
           ./MANIFEST.SKIP
           ./Makefile.PL
     ...
~/code/YourApp$ find .




           ./lib/YourApp.pm
           ./lib/YourApp/Reticulator.pm
           ./lib/YourApp/Ut...
~/code/YourApp$ find .


           dist.conf


           ./lib/YourApp.pm
           ./lib/YourApp/Reticulator.pm
      ...
package YourApp;

          =head1 NAME

          YourApp - my awesome app

          =head1 VERSION

          version 1...
package YourApp;

         =head1 NAME

         YourApp - my awesome app

         =head1 VERSION

         version 1.001...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 VERSION

          version 1.001

          =cut

...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 VERSION

          version 1.001

          =cut

...
package YourApp;
           # ABSTRACT: my awesome app

           our $VERSION = 0.001;

           =head1 DESCRIPTION

 ...
package YourApp;
          # ABSTRACT: my awesome app

          our $VERSION = 0.001;

          =head1 DESCRIPTION

    ...
package YourApp;
         # ABSTRACT: my awesome app

         =head1 DESCRIPTION

         This app is awesome.

        ...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 DESCRIPTION

          This app is awesome.

     ...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 DESCRIPTION

          This app is awesome.

     ...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 DESCRIPTION

          This app is awesome.

     ...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 DESCRIPTION

          This app is awesome.

     ...
package YourApp;
           # ABSTRACT: my awesome app

           =head1 DESCRIPTION

           This app is awesome.

  ...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 DESCRIPTION

          This app is awesome.

     ...
package YourApp;
          # ABSTRACT: my awesome app

          =head1 DESCRIPTION

          This app is awesome.

     ...
the CLI interface
dzil new




the CLI interface
dzil new

          dzil test




the CLI interface
dzil new

          dzil test

          dzil build




the CLI interface
dzil new

          dzil test

          dzil build

          dzil release



the CLI interface
spin-off modules

                   CPAN::Uploader            String::RewritePrefix


                       Pod::Eventua...
lots of prereqs
...but that’s okay...
dzil replaces “make dist”
...and the dist is boring
plain old Makefile.PL
    (or Build.PL)
users don’t notice that
 you used Dist::Zilla
they just notice how
 productive you are
Dist::Zilla
   raaaaaaaaar!
Upcoming SlideShare
Loading in...5
×

Dist::Zilla

4,692

Published on

Dist::Zilla is a tool for writing less crap and more code when building CPAN distributions.

Published in: Technology, Health & Medicine
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,692
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
42
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Dist::Zilla

  1. 1. Dist::Zilla raaaaaaaaar!
  2. 2. you @ cpan . org This talk is about your life as a CPAN author.
  3. 3. CPAN == Dists The CPAN is just a bunch of dists (distributions).
  4. 4. YourApp-1.0.tar.gz isa Dist and a distribution is just an archive file
  5. 5. dists contain files
  6. 6. ~/code/YourApp$ find . ./Changes ./LICENSE ./MANIFEST.SKIP ./Makefile.PL ./README ./lib/YourApp.pm ./lib/YourApp/Reticulator.pm ./lib/YourApp/Util/mtfnpy.pm ./lib/YourApp/Xyzzy.pm ./t/unit-tests.t ./t/pod-coverage.t ./t/pod.t this is all the crap in your working copy where you write this dist making all these is a boring pain in the ass
  7. 7. being a dist author is hard! let’s go gemming!
  8. 8. Module::Starter
  9. 9. C K S ! U Module::Starter S
  10. 10. only gets you to a starting point
  11. 11. can’t rebuild from templates post facto
  12. 12. can’t add files to your dist
  13. 13. no good for files that need to be rebuilt a lot
  14. 14. Module::Install
  15. 15. generates some files when running ‘make’
  16. 16. Makefile.PL takes the usually short Makefile.PL
  17. 17. Makefile.PL makes it slightly smaller
  18. 18. Module::Install
  19. 19. C K S ! U Module::Install S
  20. 20. relies on ExtUtils::MakeMaker
  21. 21. relies on ExtUtils::MakeMaker CK S! SU
  22. 22. puts insane complexity on user’s computer
  23. 23. bundles scary, versioned code in the dist
  24. 24. when bugs are fixed, everybody re-releases
  25. 25. ...to review...
  26. 26. writing code == fun
  27. 27. writing =head1 LICENSE NOT FUN
  28. 28. Dist::Zilla raaaaaaaaar!
  29. 29. ~/code/YourApp$ find . ./Changes ./LICENSE ./MANIFEST.SKIP ./Makefile.PL ./README ./lib/YourApp.pm ./lib/YourApp/Reticulator.pm ./lib/YourApp/Util/mtfnpy.pm ./lib/YourApp/Xyzzy.pm ./t/unit-tests.t ./t/pod-coverage.t ./t/pod.t So, back to this list of files....
  30. 30. ~/code/YourApp$ find . ./lib/YourApp.pm ./lib/YourApp/Reticulator.pm ./lib/YourApp/Util/mtfnpy.pm ./lib/YourApp/Xyzzy.pm ./t/unit-tests.t Let’s get rid of all the crap
  31. 31. ~/code/YourApp$ find . dist.conf ./lib/YourApp.pm ./lib/YourApp/Reticulator.pm ./lib/YourApp/Util/mtfnpy.pm ./lib/YourApp/Xyzzy.pm ./t/unit-tests.t and replace it with a little config for Dist::Zilla
  32. 32. package YourApp; =head1 NAME YourApp - my awesome app =head1 VERSION version 1.001 =cut our $VERSION = 0.001; =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; Here’s a .pm file
  33. 33. package YourApp; =head1 NAME YourApp - my awesome app =head1 VERSION version 1.001 =cut our $VERSION = 0.001; =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; The =name section is annoying.
  34. 34. package YourApp; # ABSTRACT: my awesome app =head1 VERSION version 1.001 =cut our $VERSION = 0.001; =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; We’ll replace it with a comment.
  35. 35. package YourApp; # ABSTRACT: my awesome app =head1 VERSION version 1.001 =cut our $VERSION = 0.001; =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; The =version section is redundant.
  36. 36. package YourApp; # ABSTRACT: my awesome app our $VERSION = 0.001; =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; Drop it.
  37. 37. package YourApp; # ABSTRACT: my awesome app our $VERSION = 0.001; =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; Even the $VERSION is redundant, since we want it constant across the dist.
  38. 38. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =head1 METHODS =head2 this_method This method does stuff. =cut method this_method { ... } =head2 that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; our overarching METHOD section is dumb
  39. 39. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; let’s just use =method for them all
  40. 40. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } =head1 AUTHOR Margo Yapp <myapp@example.com> =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; Repeating the author everywhere is annoying, too.
  41. 41. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; Drop it, use author info found in DZ config.
  42. 42. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } =head1 LICENSE Copyright (C) 2008, Margo Yapp. This is distributed under the terms of the accidental death and dismemberment license and if you redistribuet this document you will be “accidentally” deathed or dismembered. You have been told. =cut 1; The license is gigantic! Ugh!
  43. 43. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } 1; Drop it.
  44. 44. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } 1; Now our file is simple, just the unique docs and code it needs. It fits on one legible slide!
  45. 45. package YourApp; # ABSTRACT: my awesome app =head1 DESCRIPTION This app is awesome. =method this_method This method does stuff. =cut method this_method { ... } =method that_method Also stuff. method that_method { ... } 1; And is about half Perl.
  46. 46. the CLI interface
  47. 47. dzil new the CLI interface
  48. 48. dzil new dzil test the CLI interface
  49. 49. dzil new dzil test dzil build the CLI interface
  50. 50. dzil new dzil test dzil build dzil release the CLI interface
  51. 51. spin-off modules CPAN::Uploader String::RewritePrefix Pod::Eventual Config::INI::MVP::Reader Pod::Weaver Mixin::Linewise Software::License Data::Section String::Flogger Pod::Elemental lots of spin-off modules
  52. 52. lots of prereqs
  53. 53. ...but that’s okay...
  54. 54. dzil replaces “make dist”
  55. 55. ...and the dist is boring
  56. 56. plain old Makefile.PL (or Build.PL)
  57. 57. users don’t notice that you used Dist::Zilla
  58. 58. they just notice how productive you are
  59. 59. Dist::Zilla raaaaaaaaar!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×