NAME
Footprintless::Overlay - An overlay manager
VERSION
version 1.29
SYNOPSIS
# Standard way of getting an overlay
use Footprintless;
my $overlay = Footprintless->new()->overlay('overlay');
$overlay->clean();
$overlay->initialize();
$overlay->update();
DESCRIPTION
Overlays are a combination of a directory of static files and a directory of templated files that will be merged to an output directory. This is implemented in Template::Overlay.
Additionally, any folder under the template_dir
can contain a .footprintless
file containing a clean
and/or resources
entities:
return {
clean => [
'foo.jar',
'bar.jar',
'ext/'
],
resources => {
foo => 'com.pastdev:foo:1.0.0',
bar => 'com.pastdev:bar:1.0.0'
}
};
The clean
entity is an arrayref containing a list of paths to clean out. These paths will be added to the path of the directory containing the .footprintless
file. The resources
entity is a list of resources to download into the same directory as the .footprintless
file.
ENTITIES
A simple overlay:
overlay => {
base_dir => "/home/me/foo/base",
clean => [
"/opt/tomcat/"
],
hostname => 'localhost',
key => 'T',
os => 'linux',
template_dir => "/home/me/foo/template",
to_dir => '/opt/foo/tomcat'
}
A more complex example:
foo => {
hostname => 'test.pastdev.com',
overlay => {
'Config::Entities::inherit' => ['hostname', 'sudo_username'],
base_dir => '/home/me/foo/base',
clean => [
'/opt/foo/tomcat/'
],
key => 'T',
os => 'linux',
resolver_coordinate => 'foo',
template_dir => '/home/me/foo/template',
to_dir => '/opt/foo/tomcat'
},
sudo_username => 'developer',
tomcat => {
'Config::Entities::inherit' => ['hostname', 'sudo_username'],
catalina_base => '/opt/foo/tomcat',
http => {
port => 20080
},
service => {
action => {
'kill' => { command_args => 'stop -force' },
'status' => { use_pid => 1 }
},
command => '/opt/foo/tomcat/bin/catalina.sh',
pid_file => '/opt/foo/tomcat/bin/.catalina.pid',
},
shutdown => {
port => 8505,
password => $properties->{'foo.tomcat.shutdown.password'},
},
trust_store => {
'Config::Entities::inherit' => ['hostname', 'sudo_username'],
file => '/opt/foo/tomcat/certs/truststore.jks',
include_java_home_cacerts => 1,
password => $properties->{'foo.tomcat.trust_store.password'},
}
}
}
An overlay can obtain base/template content from a resource. When initialize or update are called, the resource will be downloaded (if not already local) and extracted to a temp folder. The base_dir
and template_dir
paths will be appended to the extract temp folder:
overlay => {
base_dir => 'base',
clean => [
'/opt/tomcat/'
],
hostname => 'localhost',
key => 'T',
os => 'linux',
resource => 'com.pastdev:app-overlay:zip:package:1.0.0',
template_dir => 'template',
to_dir => '/opt/foo/tomcat'
}
An overlay can have multiple template folders. If it does, they will be processed in the order they are listed:
overlay => {
base_dir => 'base',
clean => [
'/opt/tomcat/'
],
hostname => 'localhost',
key => 'T',
os => 'linux',
template_dir => [
'first/template_dir',
'second/template_dir',
],
to_dir => '/opt/foo/tomcat'
}
CONSTRUCTORS
new($entity, $coordinate)
Constructs a new overlay configured by $entities
at $coordinate
.
METHODS
clean()
Cleans the overlay. Each path in the clean
entity, will be removed from the destination. If the path ends in a /
, then after being removed, the directory will be recreated.
initialize()
Will call clean
, then overlay
on an instance of Template::Overlay configured to this entity.
update()
Will overlay ONLY the templated files. It will not clean
, nor copy any files from base_dir
like initialize
does.
AUTHOR
Lucas Theisen <lucastheisen@pastdev.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Lucas Theisen.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
SEE ALSO
Please see those modules/websites for more information related to this module.
CONFIGURATION
This module can optionally be configured to use a customized resolver. To do so, configure a resolver factory in your entities:
footprintless => {
overlay => {
resolver_factory => 'My::ResolverFactory'
}
}
The resolver factory must have a new_resolver
method that takes a spec and a list of options and returns a Template::Resolver
, for example:
sub new_resolver {
my ($self, $resolver_spec, %resolver_opts) = @_;
return Template::Resolver->new(
$resolver_spec,
%resolver_opts,
additional_transforms => {
random => sub {
my ($resolver_self, $value) = @_;
return $value . rand();
}
});
}