Question

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.

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top