<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dagolden &#187; cpan</title>
	<atom:link href="http://www.dagolden.com/index.php/category/cpan/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dagolden.com</link>
	<description>Whatever comes to mind</description>
	<lastBuildDate>Mon, 23 Jan 2012 03:43:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>How to replicate a failure</title>
		<link>http://www.dagolden.com/index.php/1354/how-to-replicate-a-failure/</link>
		<comments>http://www.dagolden.com/index.php/1354/how-to-replicate-a-failure/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 05:27:14 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[cpan-testers]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1354</guid>
		<description><![CDATA[Whenever I get a bug report or a CPAN Testers FAIL report and the issue is not obvious right away, the first thing I try to do is replicate the failure. Without it, I'm left to diagnose with hunches and release new code that I hope fixes that problem. That's not software engineering, it's software [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever I get a bug report or a <a href="http://www.cpantesters.org/">CPAN Testers</a> FAIL report and the issue is not obvious right away, the first thing I try to do is replicate the failure.  Without it, I'm left to diagnose with hunches and release new code that I hope fixes that problem.  <strong>That's not software engineering, it's software faith healing.<br />
</strong><br />
Today, I had <strong>a wonderful experience that I want to hold up as an example</strong> of what makes my life much easier.  For a while now, I've been getting <a href="http://www.cpantesters.org/cpan/report/968bcc16-3b8d-11e0-a0be-13248a2f2f5b">very bizarre FAIL reports</a> for the latest <a href="http://p3rl.org/Module::Build/">Module::Build</a> development releases from one particular CPAN tester, Chad Davis.  The symptom is that an outdated module is picked up in Chad's <a href="http://p3rl.org/local::lib">local::lib</a>, even though <a href="http://p3rl.org/CPAN">CPAN.pm</a> appears to have detected (and satisfied) the missing dependency.  What is particularly weird is that Chad later reported that an explicit "test ..." of the dependency followed by "test ..." of the Module::Build development release then passes all tests.</p>
<p>My first attempts at replication failed, so after a few emails back and forth, <strong>Chad sent me detailed instructions for replication</strong>.  Here is an excerpt from his email (used with his permission):</p>
<pre class="brush: plain; title: ; notranslate">
I setup a new user, and deleted his .bashrc, leaving only the stock
Ubuntu 10.10 /etc/bash.bashrc in the environment. Then I created this
three-line ~/.bashrc :

perl5=/tmp/tmplib
lib=&quot;$perl5/lib/perl5&quot;
eval $(perl -I&quot;$lib&quot; -Mlocal::lib=&quot;$perl5&quot;)

So, the environment now resolves to:

PERL5LIB=/tmp/tmplib/lib/perl5/x86_64-linux-gnu-thread-multi:/tmp/tmplib/lib/perl5
PERL_LOCAL_LIB_ROOT=/tmp/tmplib
PERL_MB_OPT='--install_base /tmp/tmplib'
PERL_MM_OPT=INSTALL_BASE=/tmp/tmplib
</pre>
<p>Notice that Chad describes the setup in detail, and even went to the trouble of <strong>replicating it with a "clean" user</strong>.  This made it very easy to set up exactly the same situation on my development machine.</p>
<p>Next, Chad walked me through how to replicate the issue and even confirmed it on a <strong>fresh virtual machine</strong>!</p>
<pre class="brush: plain; title: ; notranslate">
Then I installed Parse::CPAN::Meta 1.42 (with CPAN 1.9402 and
local::lib 1.008), then I tested MB 0.37_04 which gave the same
errors. Then I quit the cpan shell, restart it, first do an explit
test of PCM 1.4401 before running a test of MB and all tests pass, as
before.

I also verified the same behavior on a virtual machine with a
fresh ubuntu 10.10 (with updates) and the same three-line .bashrc and
got the same behavior. I'm surprised that you cannot reproduce this.
At this point I don't believe there is anything left that is specific
to my environment.
</pre>
<p>With those clear instructions, I was able to replicate the issue.</p>
<p>Chad then took me through variations and outcomes:</p>
<pre class="brush: plain; title: ; notranslate">
I then upgraded CPAN to 1.94_65 but have the same errors on MB 0.37_04
unless I explicitly test PCM 1.4401 first.

And I have the same problems with MB version 0.37_05 as well, which
also works after an explicit test of PCM 1.4401

I tried to start working backwards a bit, MB 0.3624 is fine,
presumably because it doesn't depend on PCM.
However, MB 0.3701 fails, despite the fact that it only depends on PCM
1.42, which is the one that's installed, according to pmvers.  It
looks to be the same issue in each case: the existing PCM is not always detected.
</pre>
<p>Now I have a fact base that I can test and confirm. Finally, Chad did some further digging into the problem:</p>
<pre class="brush: plain; title: ; notranslate">
Then I looked at t/mymeta.t and traced back to CPAN::Meta and looked
at it dependencies in Makefile.PL to find that PCM 1.44 is listed both
as prereq and as a build prereq, which, being a novice, looked a bit
funny to me. Taking out the build prereq and leaving the prereq then
allowed me to test MB without errors.
</pre>
<p>And with that, I've got a decent workaround solution, as well as a hint as to what's going wrong in CPAN.pm.  I haven't <em>fixed</em> CPAN.pm yet, but with this start, it's going to be much, much easier.</p>
<p><strong>I want to thank Chad for his responsiveness and the incredible detail of his report.</strong>  I hope it can be a lesson to anyone reporting bugs or responding to questions about failure:</p>
<ol>
<li><strong>Describe your environment in detail</strong>.  If you can, replicate the error with a "clean" user or even on a clean install of the OS.</li>
<li><strong>Describe the exact steps you took to replicate the failure</strong>.  Take notes as you do it, so you can be as specific as possible.</li>
<li><strong>Describe any variations you tried</strong> that <em>did</em> work, or any workarounds you used to deal with the problem.</li>
</ol>
<p>That seems like common sense, but few bug reports or failure investigations I get are as thorough and constructive as the example above.  Thank you, Chad!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1354/how-to-replicate-a-failure/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CPAN.pm release candidate</title>
		<link>http://www.dagolden.com/index.php/1339/cpan-pm-release-candidate/</link>
		<comments>http://www.dagolden.com/index.php/1339/cpan-pm-release-candidate/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 05:06:02 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1339</guid>
		<description><![CDATA[I recently uploaded CPAN version 1.94_65, which is the 15th development release since 1.9402 and represents almost 18 months of development work. Barring any show-stoppers, a stable release is expected in the next month. Meanwhile, 1.94_65 will be merged into the next Perl core development release and the stable version will be part of Perl [...]]]></description>
			<content:encoded><![CDATA[<p>I recently uploaded <a href="http://search.cpan.org/~dagolden/CPAN-1.94_65/">CPAN version 1.94_65</a>, which is the 15th development release since 1.9402 and represents almost 18 months of development work.  Barring any show-stoppers, a stable release is expected in the next month.  Meanwhile, 1.94_65 will be merged into the next Perl core development release and the stable version will be part of Perl 5.14 this spring.</p>
<p><strong>Please give it a try!</strong>  From the command line:</p>
<pre class="brush: plain; title: ; notranslate">
$ cpan DAGOLDEN/CPAN-1.94_65.tar.gz
</pre>
<p>Thank you to everyone contributing patches or commits (according to the git log): Andreas Koenig, David Golden, Frank Wiegand, Nick Patch, Robert Bohne, Tomas Doran, brian d foy and burak.  Thank you as well to anyone else who contributed to RT tickets or sent in patches outside git.</p>
<p>Here is a summary of major changes and bug fixes since 1.9402.</p>
<p><strong>New features</strong></p>
<ul>
<li>Major simplification of the FirstTime experience for new users, including auto-pick of CPAN mirrors</li>
<li>Added support for bootstrapping local::lib when the user does not have write access to perl's site library directories</li>
<li>Added support for and prerequisite on HTTP::Tiny for pure-perl HTTP bootstrapping</li>
<li>Added support for META/MYMETA.json files if CPAN::Meta is installed</li>
<li>Quieter user interface: made lots of '$module missing' type warnings only warn once; eliminated 'no YAML' warnings for distroprefs if there are no distroprefs.</li>
<li>Allows Foo/Bar.pm on the commandline to mean Foo::Bar</li>
<li>Allows calling make/test/install with regexp if unambiguous</li>
<li>bzip2 support should now be on par with gzip</li>
</ul>
<p><strong>New configuration options</strong></p>
<ul>
<li>added 'atexit' option for scan_cache</li>
<li>new config option prefer_external_tar (RT#64037)</li>
<li>new config variable version_timeout used in CPAN::Module::parse_version()</li>
</ul>
<p><strong>RT Tickets closed</strong></p>
<ul>
<li>RT #63357: use Dumpvalue when dumping potential crap</li>
<li>RT #62986: original config directories will be found even if File::HomeDir is later installed</li>
<li>RT #62064: build_requires_install_policy set to "no" did not work correctly</li>
<li>RT #61607: make the FTP download code more robust</li>
<li>RT #59216: make sure $builddir exists before calling tempdir</li>
<li>RT #57482 and RT #57788 revealed that configure_requires implicitly assumed build_requires instead of normal requires.</li>
<li>RT #55093: no_proxy doesn't work with more then one entries</li>
<li>RT #55091: don't ask the proxy credentials if proxy_user empty</li>
<li>RT #53305: amended lib/App/Cpan.pm because of a regression bugfix: Non-English locales got no diagnostics on a failed locking due to permissions</li>
<li>RT #51018: do not switch to default sites when we have a user-configured urllist</li>
<li>RT #48803: avoid 'unreached' if not following configure_requires bugfix: treat modules correctly that are deprecated in perl 5.12.  improved support for Perl core module deprecation</li>
<li>RT #47774: allow duplicate mention of modules in Makefile prelude</li>
<li>Fixed rt.perl.org#72362: CPAN ignoring configure_requires.  Also fixed (MY)META.yml processing to always prefer Parse::CPAN::Meta, if available.</li>
<li>Fixed rt.perl.org#72348: missing CPAN::HandleConfig::output;</li>
</ul>
<p><strong>Other bug fixes</strong></p>
<ul>
<li>Adds HOMEDRIVE/HOMEPATH or USERPROFILE as home directory options on Windows</li>
<li>Fixed several recent regressions related to external transport tools (ncftp, lynx, curl, etc)</li>
<li>Fixed quoting for downloading into directories containing whitespace</li>
<li>Solaris tar gets more handholding to avoid solaris tar errors</li>
<li>Portability fix: By-pass alarm() calls if we're running under perl 5.6.x &#038;& $OS is Windows.</li>
<li>Work around win32 URI::file volume bug</li>
<li>Prerequisites declared with the string "==" now supported</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1339/cpan-pm-release-candidate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Slimmer CPAN configuration</title>
		<link>http://www.dagolden.com/index.php/1264/slimmer-cpan-configuration/</link>
		<comments>http://www.dagolden.com/index.php/1264/slimmer-cpan-configuration/#comments</comments>
		<pubDate>Fri, 21 Jan 2011 12:01:16 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1264</guid>
		<description><![CDATA[If you ran CPAN.pm configuration years ago, you might recall a long introductory text and screens full of configuration prompts flashing by. Those days are gone. I had already patched CPAN to make autoconfiguration nearly silent and now I've just released CPAN-1.94_64 that includes less introduction for a much slimmer configuration dialog. It's not completely [...]]]></description>
			<content:encoded><![CDATA[<p>If you ran <a href="http://p3rl.org/CPAN">CPAN.pm</a> configuration years ago, you might recall a long introductory text and screens full of configuration prompts flashing by.  Those days are gone.  I had already patched CPAN to make autoconfiguration nearly silent and now I've just released CPAN-1.94_64 that includes less introduction for a much slimmer configuration dialog.</p>
<p>It's not completely silent, so new users of Perl and CPAN.pm aren't entirely mystified, but you can see that it's down to just under 40 lines of text if someone chooses to auto-configure everything.</p>
<pre class="brush: plain; title: ; notranslate">
$ cpan

CPAN.pm requires configuration, but most of it can be done automatically.
If you answer 'no' below, you will enter an interactive dialog for each
configuration option instead.

Would you like to configure as much as possible automatically? [yes] 

Autoconfigured everything but 'urllist'.

Now you need to choose your CPAN mirror sites.  You can let me
pick mirrors for you, you can select them from a list or you
can enter them by hand.

Would you like me to automatically choose some CPAN mirror
sites for you? (This means connecting to the Internet) [yes]
Trying to fetch a mirror list from the Internet
Fetching with HTTP::Tiny:
http://www.perl.org/CPAN/MIRRORED.BY

Looking for CPAN mirrors near you (please be patient)
................................. done!

New urllist
  http://mirrors.24-7-solutions.net/pub/CPAN/
  http://mirrors.ccs.neu.edu/CPAN/
  http://www.stathy.com/CPAN/

Autoconfiguration complete.

commit: wrote '/home/david/.cpan/CPAN/MyConfig.pm'

You can re-run configuration any time with 'o conf init' in the CPAN shell

cpan shell -- CPAN exploration and modules installation (v1.9464)
Enter 'h' for help.

cpan[1]&gt;
</pre>
<p>This change should be part of the next stable release of CPAN and should also be in Perl 5.14, coming in April.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1264/slimmer-cpan-configuration/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Coming soon in Perl: CPAN local::lib bootstrap</title>
		<link>http://www.dagolden.com/index.php/1245/coming-soon-in-perl-cpan-locallib-bootstrap/</link>
		<comments>http://www.dagolden.com/index.php/1245/coming-soon-in-perl-cpan-locallib-bootstrap/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 03:40:05 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1245</guid>
		<description><![CDATA[I've written about my efforts to get CPAN.pm to bootstrap local::lib and about a new HTTP client for CPAN.pm. I'm pleased to say that both have been merged into the development branch of the Perl core. Barring any show-stopping bugs, the forthcoming Perl 5.13.9 will let a non-privileged user bootstrap access to CPAN, even if [...]]]></description>
			<content:encoded><![CDATA[<p>I've written about my efforts to <a href="http://www.dagolden.com/index.php/1186/locallib-for-cpan-pm/">get CPAN.pm to bootstrap local::lib</a> and about a <a href="http://www.dagolden.com/index.php/1212/why-httptiny/">new HTTP client for CPAN.pm</a>.  I'm pleased to say that <strong>both have been merged into the development branch of the Perl core</strong>.</p>
<p>Barring any show-stopping bugs, the forthcoming Perl 5.13.9 will let a non-privileged user bootstrap access to CPAN, even if FTP is blocked and they have no command line HTTP clients installed.  That means that <strong>if you can run perl, and you can use port 80, then you can use CPAN</strong>.</p>
<p>Imagine someday when Perl 5.14 becomes standard in linux distributions.  Log-in to a new machine (or perhaps a shared host), type "cpan", and start installing stuff from CPAN.  Easy!</p>
<p>To show you how it works, I installed a snapshot of Perl from the git repository and then switched to a clean, unprivileged user account to try installing something.  All I typed at the keyboard was this:</p>
<pre class="brush: plain; title: ; notranslate">
/opt/perl/fromgit/bin/cpan5.13.8[ENTER]
[ENTER]
[ENTER]
[ENTER]
[ENTER]
install File::Marker[ENTER]
</pre>
<p>The log below is long and verbose (the way <a href="http://p3rl.org/CPAN">CPAN.pm</a> just is, unfortunately) but you can see how it uses <a href="http://p3rl.org/HTTP::Tiny">HTTP::Tiny</a>, bootstraps <a href="http://p3rl.org/local::lib">local::lib</a>, updates my <code>.bashrc</code>, installs File::Marker in the local library and even <strong>reminds me to restart my shell</strong>.  Isn't that user-friendly?</p>
<pre class="brush: plain; title: ; notranslate">
$ /opt/perl/fromgit/bin/cpan5.13.8 

CPAN is the world-wide archive of perl resources. It consists of about
300 sites that all replicate the same contents around the globe. Many
countries have at least one CPAN site already. The resources found on
CPAN are easily accessible with the CPAN.pm module. If you want to use
CPAN.pm, lots of things have to be configured. Fortunately, most of
them can be determined automatically. If you prefer the automatic
configuration, answer 'yes' below.

If you prefer to enter a dialog instead, you can answer 'no' to this
question and I'll let you configure in small steps one thing after the
other. (Note: you can revisit this dialog anytime later by typing 'o
conf init' at the cpan prompt.)

Would you like me to configure as much as possible automatically? [yes] 

 &lt;install_help&gt;

Warning: You do not have write permission for Perl library directories.

To install modules, you need to configure a local Perl library directory or
escalate your privileges.  CPAN can help you by bootstrapping the local::lib
module or by configuring itself to use 'sudo' (if available).  You may also
resolve this problem manually if you need to customize your setup.

What approach do you want?  (Choose 'local::lib', 'sudo' or 'manual')
 [local::lib] 

Autoconfigured everything but 'urllist'.

Now you need to choose your CPAN mirror sites.  You can let me
pick mirrors for you, you can select them from a list or you
can enter them by hand.

Would you like me to automatically choose some CPAN mirror
sites for you? (This means connecting to the Internet) [yes] 

Trying to fetch a mirror list from the Internet
Fetching with HTTP::Tiny:
http://www.perl.org/CPAN/MIRRORED.BY

Looking for CPAN mirrors near you (please be patient)
..............................................................
..............................................................
..............................................................
..................................... done!

New urllist
  http://cpan.erlbaum.net/
  http://cpan.mirror.clemson.edu/
  http://mirrors.servercentral.net/CPAN/

Autoconfiguration complete.

Attempting to bootstrap local::lib...

Writing /home/cleanroom/.cpan/CPAN/MyConfig.pm for bootstrap...
commit: wrote '/home/cleanroom/.cpan/CPAN/MyConfig.pm'
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/01mailrc.txt.gz
Going to read '/home/cleanroom/.cpan/sources/authors/01mailrc.txt.gz'
............................................................................DONE
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/modules/02packages.details.txt.gz
Going to read '/home/cleanroom/.cpan/sources/modules/02packages.details.txt.gz'
  Database was generated on Sat, 15 Jan 2011 20:57:19 GMT
  HTTP::Date not available
............................................................................DONE
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/modules/03modlist.data.gz
Going to read '/home/cleanroom/.cpan/sources/modules/03modlist.data.gz'
............................................................................DONE
Going to write /home/cleanroom/.cpan/Metadata
Running make for A/AP/APEIRON/local-lib-1.008001.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/A/AP/APEIRON/local-lib-1.008001.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/A/AP/APEIRON/CHECKSUMS
Checksum for /home/cleanroom/.cpan/sources/authors/id/A/AP/APEIRON/local-lib-1.008001.tar.gz ok

  CPAN.pm: Going to build A/AP/APEIRON/local-lib-1.008001.tar.gz

Attempting to create directory /home/cleanroom/perl5

*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
*** Since we're running under CPAN, I'll just let it take care
    of the dependency's installation later.
[Core Features]
- ExtUtils::MakeMaker ...loaded. (6.57_05 &gt;= 6.31)
- ExtUtils::Install   ...loaded. (1.55 &gt;= 1.43)
- Module::Build       ...loaded. (0.3607 &gt;= 0.36)
- CPAN                ...loaded. (1.9463 &gt;= 1.82)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for local::lib
Writing MYMETA.yml
cp lib/POD2/PT_BR/local/lib.pod blib/lib/POD2/PT_BR/local/lib.pod
cp lib/lib/core/only.pm blib/lib/lib/core/only.pm
cp lib/local/lib.pm blib/lib/local/lib.pm
cp lib/POD2/DE/local/lib.pod blib/lib/POD2/DE/local/lib.pod
Manifying blib/man3/POD2::PT_BR::local::lib.3
Manifying blib/man3/lib::core::only.3
Manifying blib/man3/local::lib.3
Manifying blib/man3/POD2::DE::local::lib.3
  APEIRON/local-lib-1.008001.tar.gz
  /usr/bin/make -- OK
'YAML' not installed, will not store persistent state
Running make test
PERL_DL_NONLAZY=1 /opt/perl/fromgit/bin/perl5.13.8 -I/home/cleanroom/perl5/lib/perl5/x86_64-linux-thread-multi -I/home/cleanroom/perl5/lib/perl5 &quot;-MExtUtils::Command::MM&quot; &quot;-e&quot; &quot;test_harness(0, 'inc', 'blib/lib', 'blib/arch')&quot; t/classmethod.t t/coderefs_in_inc.t t/de-dup.t t/install.t t/lib-core-only.t t/pipeline.t
t/classmethod.t ...... Name &quot;File::Spec::rel2abs&quot; used only once: possible typo at t/classmethod.t line 20.
t/classmethod.t ...... 1/? Attempting to create directory t/var/splat
t/classmethod.t ...... ok
t/coderefs_in_inc.t .. ok
t/de-dup.t ........... ok
t/install.t .......... skipped: Install Capture::Tiny to test installation
t/lib-core-only.t .... ok
t/pipeline.t ......... ok
All tests successful.
Files=6, Tests=10,  1 wallclock secs ( 0.04 usr  0.01 sys +  0.19 cusr  0.01 csys =  0.25 CPU)
Result: PASS
  APEIRON/local-lib-1.008001.tar.gz
  /usr/bin/make test -- OK
Running make install
Manifying blib/man3/POD2::PT_BR::local::lib.3
Manifying blib/man3/lib::core::only.3
Manifying blib/man3/local::lib.3
Manifying blib/man3/POD2::DE::local::lib.3
Installing /home/cleanroom/perl5/lib/perl5/local/lib.pm
Installing /home/cleanroom/perl5/lib/perl5/POD2/PT_BR/local/lib.pod
Installing /home/cleanroom/perl5/lib/perl5/POD2/DE/local/lib.pod
Installing /home/cleanroom/perl5/lib/perl5/lib/core/only.pm
Installing /home/cleanroom/perl5/man/man3/POD2::PT_BR::local::lib.3
Installing /home/cleanroom/perl5/man/man3/lib::core::only.3
Installing /home/cleanroom/perl5/man/man3/local::lib.3
Installing /home/cleanroom/perl5/man/man3/POD2::DE::local::lib.3
Appending installation info to /home/cleanroom/perl5/lib/perl5/x86_64-linux-thread-multi/perllocal.pod
  APEIRON/local-lib-1.008001.tar.gz
  /usr/bin/make install  -- OK

local::lib is installed. You must now add the following environment variables
to your shell configuration files (or registry, if you are on Windows) and
then restart your command line shell and CPAN before installing modules:

export PERL_LOCAL_LIB_ROOT=&quot;/home/cleanroom/perl5&quot;
export PERL_MB_OPT=&quot;--install_base /home/cleanroom/perl5&quot;
export PERL_MM_OPT=&quot;INSTALL_BASE=/home/cleanroom/perl5&quot;
export PERL5LIB=&quot;/home/cleanroom/perl5/lib/perl5/x86_64-linux-thread-multi:/home/cleanroom/perl5/lib/perl5:$PERL5LIB&quot;
export PATH=&quot;/home/cleanroom/perl5/bin:$PATH&quot;

Would you like me to append that to /home/cleanroom/.bashrc now? [yes] 

commit: wrote '/home/cleanroom/.cpan/CPAN/MyConfig.pm'
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9463)
Enter 'h' for help.

cpan[1]&gt; install File::Marker
Running install for module 'File::Marker'
Running make for D/DA/DAGOLDEN/File-Marker-0.13.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/D/DA/DAGOLDEN/File-Marker-0.13.tar.gz
Fetching with HTTP::Tiny:
http://cpan.erlbaum.net/authors/id/D/DA/DAGOLDEN/CHECKSUMS
Checksum for /home/cleanroom/.cpan/sources/authors/id/D/DA/DAGOLDEN/File-Marker-0.13.tar.gz ok

  CPAN.pm: Going to build D/DA/DAGOLDEN/File-Marker-0.13.tar.gz

Creating new 'MYMETA.yml' with configuration results
Creating new 'Build' script for 'File-Marker' version '0.13'
Building File-Marker
  DAGOLDEN/File-Marker-0.13.tar.gz
  ./Build -- OK
Running Build test
t/01_File_Marker.t ... ok
t/02_fork.t .......... ok
t/03_thread.t ........ ok
t/04_save_load.t ..... ok
t/98_pod.t ........... skipped: Skipping author tests
t/99_pod_coverage.t .. skipped: Skipping author tests
All tests successful.
Files=6, Tests=58,  1 wallclock secs ( 0.04 usr  0.02 sys +  0.22 cusr  0.02 csys =  0.30 CPU)
Result: PASS
  DAGOLDEN/File-Marker-0.13.tar.gz
  ./Build test -- OK
Running Build install
Building File-Marker
Installing /home/cleanroom/perl5/lib/perl5/File/Marker.pm
Installing /home/cleanroom/perl5/man/man3/File::Marker.3
  DAGOLDEN/File-Marker-0.13.tar.gz
  ./Build install  -- OK

cpan[2]&gt; q
Terminal does not support GetHistory.
Lockfile removed.

*** Remember to restart your shell before running cpan again ***
</pre>
<p>I want to thank Andreas Koenig (CPAN.pm) and Chris Nehren (local::lib) for quickly turning around new releases of their modules to make this work.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1245/coming-soon-in-perl-cpan-locallib-bootstrap/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Why HTTP::Tiny?</title>
		<link>http://www.dagolden.com/index.php/1212/why-httptiny/</link>
		<comments>http://www.dagolden.com/index.php/1212/why-httptiny/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 01:14:01 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1212</guid>
		<description><![CDATA[I've recently been collaborating with Christian Hansen on HTTP::Tiny, a minimalist, HTTP/1.1 client library for Perl. For basic web client tasks like grabbing a single page or mirroring a file, it does the job in a fraction of the code that would be needed to install LWP::UserAgent. Because it has no non-core dependencies, it is [...]]]></description>
			<content:encoded><![CDATA[<p>I've recently been collaborating with Christian Hansen on <a href="http://p3rl.org/HTTP::Tiny">HTTP::Tiny</a>, a minimalist, HTTP/1.1 client library for Perl.  For basic web client tasks like grabbing a single page or mirroring a file, it does the job in a fraction of the code that would be needed to install <a href="http://p3rl.org/LWP::UserAgent">LWP::UserAgent</a>.  Because it has no non-core dependencies, it is ideal for what I need to get CPAN.pm to bootstrap itself with pure Perl.</p>
<p>Here's a quick look at how you would use it for the two common tasks I mentioned:</p>
<pre class="brush: perl; title: ; notranslate">
    use HTTP::Tiny;
    my $http = HTTP::Tiny-&gt;new;
    my $response;

    # get a single page
    $response = $http-&gt;get('http://example.com/');
    die &quot;Failed!\n&quot; unless $response-&gt;{success};
    print $response-&gt;{content};

    # mirror a file
    $response = $http-&gt;mirror('http://example.com/file.tar.gz', 'file.tar.gz');
    die &quot;Failed!\n&quot; unless $response-&gt;{success};
    print &quot;Unchanged!\n&quot; if $reponse-&gt;{status} eq '304';
</pre>
<p>The example above is almost the same as you'd get using LWP::UserAgent with one big exception.  HTTP::Tiny returns the response as a hash reference rather than as an object.  Just like LWP::UserAgent, the mirror method will send an <code>If-Modified-Since</code> header for an existing file to skip downloading if the file is unchanged.  HTTP::Tiny doesn't (yet) handle query parameters -- you have to prepare those yourself, but for simple downloads, you don't generally need those anyway.</p>
<p>Where did HTTP::Tiny come from? When I was working on getting CPAN.pm to <a href="http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/">support a pure-Perl HTTP bootstrap</a>, I started with <a href="http://p3rl.org/HTTP::Lite">HTTP::Lite</a>.  When I discussed it on #p5p, Christian Hansen pointed out a number of serious shortcomings and decided that it would be easier for him to write a new, lightweight HTTP/1.1 client from scratch rather than try to redo the plumbing in HTTP::Lite.  </p>
<p>The result is HTTP::Tiny and I've been collaborating with Christian to get it ready for use by CPAN.pm and ready for the Perl core.  Unlike HTTP::Lite, HTTP::Tiny is a conditionally conforming HTTP/1.1 client.  It supports both redirection and mirroring, which HTTP::Lite does not, both of which are important features for a CPAN client.</p>
<p>As a "Tiny" module, HTTP::Tiny achieves its HTTP/1.1 conformance in a just a fraction the code required for LWP::UserAgent and its non-core dependents.  Don't get me wrong -- LWP::UserAgent is a great piece of software.  But sometimes -- like for the Perl core or for a <a href="http://p3rl.org/App::FatPacker">fatpacked</a> application --  something much smaller and simpler will do just as well.</p>
<p>Let's see what a difference there is.  <a href="http://deps.cpantesters.org/">CPANdeps</a> shows us all of LWP::UserAgent's <a href="http://deps.cpantesters.org/?module=LWP%3A%3AUserAgent&#038;perl=5.10.1&#038;os=any+OS">dependencies</a> and highlights the ones that are non-core (as of Perl 5.10.1):</p>
<ul>
<li><a href="http://p3rl.org/URI">URI</a></li>
<li><a href="http://p3rl.org/HTML::Parser">HTML::Parser</a></li>
<li><a href="http://p3rl.org/HTML::Tagset">HTML::Tagset</a></li>
</ul>
<p>I used David A. Wheeler's <a href="http://www.dwheeler.com/sloccount/">SLOCCOUNT</a> to count lines of code in each of the distributions containing these modules as well as for HTTP::Lite and HTTP::Tiny (based on the "soon-to-be" 0.007 release).  In all cases, I excluded files in t/ and examples directories.  (Lines of Perl includes any programs distributed with the distribution.)</p>
<p>Here are the results:</p>
<pre class="brush: plain; title: ; notranslate">
Distribution        .pm files Lines (Perl) Lines (C)  Total Lines
-----------------   --------- ------------ ----------  -----------
libwww-perl-5.837       52        10258          0       10258
HTML-Parser-3.68         7          883       1972        2855
HTML-Tagset-3.20         1          139          0         139
URI-1.56                52         2715          0        2715
                     -----        -----      -----       -----
TOTAL LWP &amp; friends    112        13995       1972       15967

versus

Distribution        .pm files Lines (Perl) Lines (C)  Total Lines
-----------------   --------- ------------ ----------  -----------
HTTP-Lite-2.3            1          634          0         634
HTTP-Tiny-0.007          1          603          0         603
</pre>
<p>Wow!  Both HTTP::Lite and HTTP::Tiny accomplish simple HTTP tasks with <strong>less than 4%</strong> of the SLOC of LWP and its non-core dependencies.</p>
<p>What about memory usage?  Here's the "null" case that shows memory usage of just loading the three client modules:</p>
<pre class="brush: plain; title: ; notranslate">
  VSZ   RSS COMMAND
30440  5512 perl -MLWP::UserAgent -e 1 while 1
26700  3960 perl -MHTTP::Tiny -e 1 while 1
26040  3168 perl -MHTTP::Lite -e 1 while 1
</pre>
<p>HTTP::Lite is smallest, but it also doesn't have the features or conformance I need.</p>
<p>That's not much of a real-world test, so let's try something else -- downloading the 950K CPAN 02packages.details.txt.gz file.  Here is the test code for HTTP::Tiny and LWP::UserAgent side by side:</p>
<pre class="brush: perl; title: ; notranslate">
# http-tiny-mirror.pl                  # lwp-useragent-mirror.pl
#!/usr/bin/env perl                    #!/usr/bin/env perl
use strict;                            use strict;
use warnings;                          use warnings;
use HTTP::Tiny;                        use LWP::UserAgent;                                 

my ($url, $file) = @ARGV;              my ($url, $file) = @ARGV;
die unless $url &amp; $file;               die unless $url &amp; $file;                            

my $http = HTTP::Tiny-&gt;new;            my $http = LWP::UserAgent-&gt;new;
my $res = $http-&gt;mirror($url, $file);  my $res = $http-&gt;mirror($url, $file);
die &quot;Failed!\n&quot;                        die &quot;Failed!\n&quot;
  unless $res-&gt;{success};                unless $res-&gt;is_success;                          

1 while 1;                             1 while 1;
</pre>
<p>What about HTTP::Lite?  It doesn't have a <code>mirror</code> method and doesn't do redirection, which I get for free with HTTP::Tiny and LWP::UserAgent.  I'd have to write dozens of lines of code to emulate that for a "fair" test, so I skipped it.</p>
<p>Let's add those two programs (after downloading the 02packages file to files with different names) to our memory benchmarks:</p>
<pre class="brush: plain; title: ; notranslate">
  VSZ   RSS COMMAND
50916  9824 perl ./lwp-useragent-mirror.pl [...]
35376  4348 perl ./http-tiny-mirror.pl [...]
30440  5512 perl -MLWP::UserAgent -e 1 while 1
26700  3960 perl -MHTTP::Tiny -e 1 while 1
26040  3168 perl -MHTTP::Lite -e 1 while 1
</pre>
<p>HTTP::Tiny wins -- not by a huge amount in absolute terms, admittedly, but if you don't need the extra features that LWP::UserAgent offers, HTTP::Tiny might just be all you need.</p>
<p>Thank you, Christian, for <a href="http://p3rl.org/HTTP::Tiny">HTTP::Tiny</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1212/why-httptiny/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Creating a YAML::Tiny doppelgaenger</title>
		<link>http://www.dagolden.com/index.php/1195/creating-a-yamltiny-doppelgaenger/</link>
		<comments>http://www.dagolden.com/index.php/1195/creating-a-yamltiny-doppelgaenger/#comments</comments>
		<pubDate>Wed, 22 Dec 2010 04:24:09 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[cpan-meta-spec]]></category>
		<category><![CDATA[dzil]]></category>
		<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1195</guid>
		<description><![CDATA[Recently, I needed to clone a distribution on CPAN and release it under a new name. I also need to keep it in sync with the original distribution. Rather than do any of that by hand, I decided to whip up a Dist::Zilla plugin (two, actually) to do the job for me. The background for [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I needed to clone a distribution on CPAN and release it under a new name.  I also need to keep it in sync with the original distribution. Rather than do any of that by hand, I decided to whip up a <a href="http://p3rl.org/Dist::Zilla">Dist::Zilla</a> plugin (two, actually) to do the job for me.</p>
<p>The background for this particular situation involves the role that YAML plays in the Perl 5 module toolchain.  For many years, now, CPAN distributions have included META.yml files containing distribution metadata.  For CPAN clients to read this metadata, the <a href="http://p3rl.org/Parse::CPAN::Meta">Parse::CPAN::Meta</a> module (P::C::M) was added to the Perl 5 core in Perl 5.10.1.  P::C::M is (unfortunately) a read-only copy of <a href="http://p3rl.org/YAML::Tiny">YAML::Tiny</a>.  </p>
<p>The situation became more complex after the <a href="http://use.perl.org/~Alias/journal/36128">Oslo Consensus</a>, which agreed on using the META.yml format as a standard way for module toolchain components to communicate post-configuration dependencies. This means module builders like Module::Build and ExtUtils::MakeMaker need to be able to write metadata files, not just read them.  Thus, Module::Build::YAML was added, which is a full-fledged copy of YAML::Tiny that allows Module::Build to bootstrap if YAML::Tiny is not installed.  Likewise, ExtUtils::MakeMaker needs ExtUtils::MakeMaker::YAML for its own bootstrap.</p>
<p>Thus, we seemed destined for three copies of YAML::TIny of various degrees of fidelity to be tucked away in the Perl 5 core under alternate names.</p>
<p>This situation is, frankly, nuts.  Fortunately, the Perl 5 pumpking <a href="http://www.nntp.perl.org/group/perl.perl5.porters/2010/12/msg166950.html">agrees</a>.</p>
<p>Thus, it seemed that YAML::Tiny was destined for the Perl 5 core, instead.  But a wrinkle emerged.  YAML::Tiny is not really YAML, but only a subset.  It is sufficient for META.yml files, but whatever goes is core to support that should not be considered a 'preferred' YAML library.  A compromise was struck, to call it CPAN::Meta::YAML instead.</p>
<p>Now, I needed to create CPAN::Meta::YAML and make it easy to track YAML::Tiny.</p>
<p>The first Dist::Zilla plugin I wrote was <a href="http://p3rl.org/Dist::Zilla::Plugin::Doppelgaenger">Doppelgaenger</a>, which downloads the latest stable release of a module and uses it as the basis for a new, renamed distribution.  It also strips the Pod and version number from the source.  The second plugin is <a href="http://p3rl.org/Dist::Zilla::Plugin::AppendExternalData 	">AppendExternalData</a>, which I use to add new Pod that is specific to CPAN::Meta::YAML.</p>
<p>The final CPAN::Meta::YAML repository contains only four files:</p>
<pre class="brush: plain; title: ; notranslate">
Changes
dist.ini
pod/lib/CPAN/Meta/YAML.pm
MANIFEST.SKIP
</pre>
<p>And here is the dist.ini file:</p>
<pre class="brush: plain; title: ; notranslate">
name = CPAN-Meta-YAML
author = Adam Kennedy &lt;adamk@cpan.org&gt;
author = David Golden &lt;dagolden@cpan.org&gt;
license = Perl_5
copyright_holder = Adam Kennedy
copyright_year = 2010

[Doppelgaenger]
source_module = YAML::Tiny
strip_pod = 1
strip_version = 1

[AppendExternalData]
source_dir = pod

[MetaResources]
;repository.url = git://github.com/dagolden/cpan-meta-yaml.git
;repository.web = http://github.com/dagolden/cpan-meta-yaml/
;bugtracker.web = http://rt.cpan.org/NoAuth/Bugs.html?Dist=CPAN-Meta-YAML

[@Filter]
-bundle = @DAGOLDEN
-remove = Prepender
-remove = PodCoverageTests
-remove = PortabilityTests
git_remote = github

[RemovePrereqs]
remove = YAML
remove = YAML::Perl
remove = YAML::Syck
remove = YAML::XS
remove = t::lib::Test
</pre>
<p>With that, all I need to do is run <code>dzil release</code> and -- tada! -- a new <a href="http://p3rl.org/CPAN::Meta::YAML">CPAN::Meta::YAML</a> is created, tested and released to CPAN.  And whenever a new YAML::Tiny is released, I just run <code>dzil release</code> again.  It's that easy.</p>
<p>Hooray for Dist::Zilla!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1195/creating-a-yamltiny-doppelgaenger/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>local::lib for CPAN.pm</title>
		<link>http://www.dagolden.com/index.php/1186/locallib-for-cpan-pm/</link>
		<comments>http://www.dagolden.com/index.php/1186/locallib-for-cpan-pm/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 02:41:58 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1186</guid>
		<description><![CDATA[I've got too much going on this week to do much blogging, but I'm happy to say that my experiments teaching CPAN.pm to bootstrap local::lib look promising. During CPAN auto-configuration, when CPAN recognizes that the user doesn't have write access to the Perl library directories, my experimental CPAN.pm offers to bootstrap local::lib after configuration is [...]]]></description>
			<content:encoded><![CDATA[<p>I've got too much going on this week to do much blogging, but I'm happy to say that my experiments teaching <a href="http://p3rl.org/CPAN">CPAN.pm</a> to bootstrap <a href="http://p3rl.org/local::lib">local::lib</a> look promising.  During CPAN auto-configuration, when CPAN recognizes that the user doesn't have write access to the Perl library directories, my experimental CPAN.pm offers to bootstrap local::lib after configuration is completed.</p>
<p>Once this is done and released as part of CPAN and core Perl (hopefully for 5.14 if I can get it done quickly), it will be possible to have a working CPAN setup for an ordinary user with a system Perl with about this much effort:</p>
<pre class="brush: plain; title: ; notranslate">
$ cpan
[... welcome blah blah ... do you want automatic configuration? ]
y
[... do you want local::lib? ]
y
[... auto config ... ]
[... auto mirror detection ... ]
[... bootstrapping local::lib ... ]
[... fixing up your shell config with PERL_* variables ... ]

cpan[1]&gt; install Whatever::Module::You::Want
</pre>
<p>And done!  A non-privileged user could have a working CPAN and local::lib with "cpan\n", "y\n", "y\n".  Spiffy!</p>
<p>Keep your fingers crossed and I'll report back when I have it done.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1186/locallib-for-cpan-pm/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>What tools should you use to create a CPAN distribution?</title>
		<link>http://www.dagolden.com/index.php/1173/what-tools-should-you-use-to-create-a-cpan-distribution/</link>
		<comments>http://www.dagolden.com/index.php/1173/what-tools-should-you-use-to-create-a-cpan-distribution/#comments</comments>
		<pubDate>Tue, 07 Dec 2010 03:59:57 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[dzil]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1173</guid>
		<description><![CDATA[Recently, I answered a question on the module-authors mailing list about the best tool for building a CPAN distribution. Whole generations of tools have come and gone since I first read Writing Perl Modules for CPAN and the state of the art slash best practices slash fads have changed. Since I first released a distribution [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I answered a <a href="http://www.nntp.perl.org/group/perl.module-authors/2010/12/msg9035.html">question</a> on the module-authors mailing list about the best tool for building a CPAN distribution.  Whole generations of tools have come and gone since I first read <a href="http://amzn.com/159059018X">Writing Perl Modules for CPAN</a> and the state of the art slash best practices slash fads have changed.</p>
<p>Since I first released a distribution to CPAN in the early 2000's, I've gotten familiar with the gory details of most of the toolchain.  I maintain Module::Build, I've contributed to Dist::Zilla, and I know the guts of ExtUtils::MakeMaker (pretty well) and Module::Install (at least a little).  Based on that experience, I think I can offer a (hopefully) objective view of the tradeoffs in using these different tools.</p>
<ul>
<li><a href="http://p3rl.org/ExtUtils::MakeMaker">ExtUtils::MakeMaker</a> (aka EU::MM) -- this is the "standard" but it is annoying to work with and tricky to customize (unless you are a Makefile expert).  Prolific CPAN authors seem to prefer Module::Install or Dist::Zilla to avoid dealing with EU::MM directly.</li>
<li><a href="http://p3rl.org/Module::Build">Module::Build</a> (aka M::B) -- this is the 'pure perl' alternative.  It is very easy to customize compared to EU::MM but you can't always rely on users having a new enough M::B for any given feature unless you target Perl 5.10.1 (which added the ability for CPAN/CPANPLUS to bootstrap tools you need *before* running Build.PL)</li>
<li><a href="http://p3rl.org/Module::Install">Module::Install</a> (aka M::I) -- this gives a nicer API than EU::MM, but it uses EU::MM behind the scenes to do the work.  It is different in that it bundles itself with the distribution, avoiding bootstrap problems.  This is viewed as a benefit by some and as a burden or design defect by others.  If existing M::I plugins don't meet your needs, it is a bit harder to understand how to customize M::I compared to M::B.</li>
<li><a href="http://p3rl.org/Dist::Zilla">Dist::Zilla</a> (aka D::Z) -- this is a complete distribution management tool, not just a builder.  It tries to let authors write as little repetitive scaffolding and documentation as possible and then generates a "release ready" distribution from templates and other configuration.  Think of it as a "distribution compiler".  In the generation process, it will create your Makefile.PL (EU::MM) or your Build.PL (M::B) for you.  (It's your choice which one you prefer.)</li>
</ul>
<p>The original question was about "creating CPAN packages".  All four tools will let you "create" a distribution tarball that you can upload to CPAN.  For the first three, you have to create a Makefile.PL or Build.PL and then use the tool you select to create the tarball.  With D::Z, you create a "dist.ini" file and D::Z creates the tarball itself (generating the Makefile.PL or Build.PL) without relying on EU::MM or M::B to do the work.</p>
<p>D::Z also can create a new "boilerplate" distribution, similar to <a href="http://p3rl.org/Module::Starter">Module::Starter</a> or <a href="http://perldoc.perl.org/h2xs.html">h2xs</a> (or any of various other distribution boilerplate tools on CPAN).  The other three do not.</p>
<p>I have switched to Dist::Zilla and many other prolific CPAN authors have as well.  (It was written by <a href="http://search.cpan.org/~rjbs/">RJBS</a>, the <a href="http://thegestalt.org/simon/perl/wholecpan.html">most prolific CPAN author</a> of all, so he has some perspective on what is the easiest thing for managing CPAN distributions).  If you are interested in learning Dist::Zilla, the <a href="http://dzil.org/tutorial/start.html">online tutorial</a> is the way to go.</p>
<p>If you don't want a complete solution, the question is how much customization do you need (to the test process, distribution packaging process, etc.)?  If the answer is "a lot", then I would recommend M::B.  If the answer is "very little", then I would recommend M::I.  Avoid direct use of EU::MM entirely.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1173/what-tools-should-you-use-to-create-a-cpan-distribution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bootstrapping CPAN.pm using HTTP::Lite</title>
		<link>http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/</link>
		<comments>http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 16:25:33 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[p5p]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1148</guid>
		<description><![CDATA[One of my goals for Perl 5.14 that I've discussed with Jesse Vincent and Andreas Koenig is getting CPAN.pm to be able to bootstrap itself in a fresh perl installation without relying on external command line tools or FTP. LWP is too big a distribution to bundle into the core, but HTTP::Lite is a focused [...]]]></description>
			<content:encoded><![CDATA[<p>One of my goals for Perl 5.14 that I've discussed with Jesse Vincent and Andreas Koenig is getting <a href="http://p3rl.org/CPAN">CPAN.pm</a> to be able to bootstrap itself in a fresh perl installation without relying on external command line tools or FTP.  <a href="http://p3rl.org/LWP">LWP </a>is too big a distribution to bundle into the core, but <a href="http://p3rl.org/HTTP::Lite">HTTP::Lite</a> is a focused little module that provides everything needed.  (cpanm bundles HTTP::Lite already)</p>
<p>I've just finished some work to add HTTP::Lite support to CPAN.pm and Andreas has merged it into the master branch.  The next step will be to test it out in a development release.  If all goes well, the plan is to merge the latest CPAN.pm into the Perl core and bring in HTTP::Lite as well.  Then, finally, a mere 20 years after the invention of HTTP, Perl 5.14 will be able to speak HTTP out of the box and bootstrap access to all of CPAN.</p>
<p>Keep your fingers crossed.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1148/bootstrapping-cpan-pm-using-httplite/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Please help test Module::Build 0.36_17</title>
		<link>http://www.dagolden.com/index.php/1144/please-help-test-modulebuild-0-36_17/</link>
		<comments>http://www.dagolden.com/index.php/1144/please-help-test-modulebuild-0-36_17/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 01:53:51 +0000</pubDate>
		<dc:creator>dagolden</dc:creator>
				<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl programming]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[ironman]]></category>

		<guid isPermaLink="false">http://www.dagolden.com/?p=1144</guid>
		<description><![CDATA[There have been ten development releases of Module::Build in the last six months. It's time to do final testing and get ready to merge Module::Build into the Perl core in preparation for Perl 5.14 in April. If you use Module::Build for your CPAN distributions, please test your distributions with 0.36_17. Even if you don't, please [...]]]></description>
			<content:encoded><![CDATA[<p>There have been ten development releases of <a href="http://p3rl.org/Module::Build">Module::Build</a> in the last six months.  It's time to do final testing and get ready to merge Module::Build into the Perl core in preparation for Perl 5.14 in April.  If you use Module::Build for your CPAN distributions, please test your distributions with 0.36_17.  Even if you don't, please consider installing 0.36_17 on your everyday development machine so you can help test it with anything you happen to install from CPAN.</p>
<p>Here's how you can install the development release from the command line with cpan, cpanm or cpanp:</p>
<pre class="brush: plain; title: ; notranslate">
$ cpan DAGOLDEN/Module-Build-0.36_17.tar.gz
$ cpanm DAGOLDEN/Module-Build-0.36_17.tar.gz
$ cpanp -i DAGOLDEN/Module-Build-0.36_17.tar.gz
</pre>
<p>Thank you very much!</p>
<p>A summary of changes since 0.3607 follows:</p>
<pre class="brush: plain; title: ; notranslate">
0.36_17 - Wed Oct 27 18:08:36 EDT 2010

  Enhancements:

  - Added 'distinstall' action to run 'Build install' inside the
    generated distribution directory [Jeff Thalhammer]

0.36_16 - Thu Aug 26 12:44:07 EDT 2010

  Bug fixes:

  - Better error message in case package declaration is not found
    when searching for version. [Alexandr Ciornii]

  - Skips 'release_status' tests on perl &lt; 5.8.1 due to buggy
    treatment of dotted-decimal version numbers [David Golden]

0.36_15 - Wed Aug 25 10:41:28 EDT 2010

  Bug fixes:

  - Added a mock Software::License to prevent t/properties/license.t
    from failing.

0.36_14 - Sun Aug 22 22:56:50 EDT 2010

  Enhancements:

  - Adds 'release_status' and 'dist_suffix' properties in preparation
    for adding CPAN Meta Spec 2 support.  'dist_suffix' will be set
    to 'TRIAL' automatically when necessary. [David Golden]

  - Makes 'license' more liberal.  You can now specify either a license
    key from the approved list (c.f. Module::Build::API) or just a
    Software::License subclass name (e.g. 'Perl_5').  This should
    provide better support for custom or proprietary licenses.
    [David Golden]

0.36_13 - Wed Jul 28 22:40:25 EDT 2010

 Bug-fixes:

 - Bundled Module::Build::Version updated to bring into sync with CPAN
   version.pm 0.82 [David Golden]

0.36_12 - Tue Jul 27 00:08:51 EDT 2010

  Enhancements:

  - Module::Build::Compat will now convert dotted-decimal prereqs into
    decimal rather than dying (and will warn about this). [Apocalypse]

  Bug fixes:

  - Caches case-sensitivity checks to boost performance, fixes
    RT#55162 and RT#56513 [Reini Urban]

  - Won't try to use ActivePerl doc generation tools without confirming
    that they are indeed installed. [David Golden]

  - Sets temporary $ENV{HOME} in testing to an absolute path, which fixes
    some issues when tested as part of the Perl core [Nicholas Clark]

  - Module::Build::ModuleInfo now warns instead of dying when a module
    has an invalid version.  -&gt;version now just returns undef
    (RT#59593) [David Golden]

  Changes:

  - When authors do not specify Module::Build in configure_requires and
    Module::Build is automatically added, a warning will be issued
    showing the added prerequisite [David Golden]

  - Moved automatic configure_requires generation into get_metadata()
    and added an 'auto' argument to toggle it (on for META and off
    for MYMETA) [David Golden]

0.36_11 - Thu May 27 09:41:23 EDT 2010

  Bug fixes:

  - Handle META/MYMETA reading and writing within Module::Build to ensure
    utf8 mode on filehandles.  Now passes/gets only strings to YAML::Tiny
    or Module::Build::YAML

0.36_10 - Wed May 19 18:36:06 EDT 2010

  Bug fixes:

  - Fix failing t/manifypods.t on Windows from 0.36_09 changes [Klaus
    Eichner]

0.36_09 - Tue May 11 09:19:12 EDT 2010

  Bug fixes:

  - Improve HTML documentation generation on ActivePerl (RT#53478)
    [Scott Renner and Klaus Eichner]

0.36_08 - Mon Apr 26 08:00:15 EDT 2010

 Enhancements:

 - Give a list of valid licenses when given one we don't recognize
   (RT#55951) [Yanick Champoux]

 - Added 'Build manifest_skip' action to generate a default MANIFEST.SKIP
   [David Golden]

 Changes:

 - When temporarily generating a MANIFEST.SKIP when none exists, it will
   be removed on exit instead of hanging around until 'Build clean'.  This
   is less surprising/confusing and the 'Build manifest_skip' action
   is now available instead to bootstrap the file [David Golden]

 Bug fixes:

 - Fixed runtime error on cygwin when searching for an executable command
   during installdeps testing [David Golden]
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.dagolden.com/index.php/1144/please-help-test-modulebuild-0-36_17/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

