Yesterday, I talked about a quick hack to add the SSH protocol using the scp URI scheme feature to cpanminus. At the end of the article, I added a technical note to explain how I saw the things to handle more protocols.
With this version, cpanm can now handle scp:// and sftp:// URI schemes.
For scp://, it first tries to use the scp command then curl (hoping that curl is linked with libssh2).
For sftp://, it first tries to use the sftp command then curl (still hoping that curl is linked with libssh2).
It seems to work well.
I added the ability to develop external URI scheme backends. Imagine you want to add a new URI scheme, say foo://, without modifying App::cpanminus package.
To achieve this goal, create a module in the namespace App::cpanminus::backend::foo that will return a hash ref with two keys: get and mirror.
For each key, you have to provide an anonymous function to handle the action, like this:
package App::cpanminus::backend::foo;
{
get => sub
{
my($self, $uri) = @_;
# retrieve the content of the resource pointed by $uri (foo://...)
# then return it
return $content;
},
mirror => sub
{
my($self, $uri, $path) = @_;
# retrieve the content of the resource pointed by $uri (foo://...)
# and copy it to the file $path
return $wathever_you_want;
},
};
__END__
That’s all…
UPDATE 2011/10/2: As Paweł Murias suggested in comments below, I changed the “API” to a more standard one:
package App::cpanminus::backend::foo;
sub get
{
my($self, $uri) = @_;
# retrieve the content of the resource pointed by $uri (foo://...)
# then return it
return $content;
}
sub mirror
{
my($self, $uri, $path) = @_;
# retrieve the content of the resource pointed by $uri (foo://...)
# and copy it to the file $path
return $wathever_you_want;
}
1;
__END__
The hash ref old one in not available anymore.