Can I have dist-zilla fill in arbitrary fields in a template file?

Is there any way to have a user defined parameter in a file and then have the dist.ini set the value for the parameter. For example, a file might contain {{$THE_ANSWER}} and the dist.ini file would provide a value like THE_ANSWER = 42? I'm pretty new to using dist::zilla to work with perl distributions, and I'm having problems understanding how it treats files as templates. There seem to be only a couple of hard-codeed parameters, varying by plugin, that can be used for any file. One such parameter is the {{$NEXT}} variable made available by [NextRelease] in the Changes file.

I read through the tutorials and searched the modules on CPAN and can't figure out if this is even possible. It is not an acceptable work-around to use the [GenerateFile] plugin to put the whole file in the dist.ini file. Besides a lack of flexibility and just plain ugliness, it doesn't seem possible to add lines with leading white-space that way.

Answers


What I would do is use a stash or plugin to store the variables. Stashes are like plugins, but they don't do anything but store data, and they can be put into your global configuration as well as your dist.ini.

[%Vars]
favorite_pie = pumpkin

Then you can get at them like this:

$zilla->stash_named('%Vars')->favorite_pie

This assumes that you've made Dist::Zilla::Stash::Vars and given it a favorite_pie attribute.

You could make a totally generic stash, though, which accepts anything as a key. For that, I'd look at the source of Dist::Zilla::Plugin::Prereqs, which allows arbitrary configuration options and shoves them into a hash attribute in its BUILDSARGS method.

You could make that Dist::Zilla::Stash::Generic, and then register it as many times as you want for different reasons:

[%Generic / Pies]
favorite  = pumpkin
hated     = rhubarb
firstever = quince

[%Generic / Passwords]
pause  = PeasAreDelicious
google = secret
reddit = SecretPeasAreDelicious

...then, as needed, say in templates...

{{ $zilla->stash_named('Passwords')->get_var('pause' }}

If I was making a lot of files that used this sort of generic thing, I'd pass their Text::Template instance a closure called get_password like this:

get_password => sub { $zilla->stash_named('Passwords')->get_var($_[0]) }

Then your template could include:

Login with: {{ get_password("pause") }}

This answer obviously leaves some source digging for you, but I think it should point at all the pieces I'd use to do what you want.


Need Your Help

Releasing Connections back to MongoDB Connection Pool

c# mongodb insert threadpool connection-pooling

I have a C# application that performs multi-threaded inserts via the C# ThreadPool into MongoDB. However, I have been getting a TimeoutException: Timeout waiting for a MongoConnection. I'm using the

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.