Index: tol/stdlib/general/TolPackage/client.tol
===================================================================
--- tol/stdlib/general/TolPackage/client.tol	(revision c13253cdb685d5ba0d5cfa7fe939a0cd3c0faa47)
+++ tol/stdlib/general/TolPackage/client.tol	(revision 95edff5809e1143e110799a4b6541d9da4d8f221)
@@ -66,4 +66,22 @@
   @Repository r = @Repository::Get(repository, True);
   r::Exist(package.version)
+};
+
+//////////////////////////////////////////////////////////////////////////////
+Text _.autodoc.member.InstallFromUrl = 
+"Instala desde una URL arbitraria un paquete determinado para que esté "
+"disponible llamando a #Require. \n"
+"La URL puede ser en realidad un directorio local para "
+"facilitar proceso de instalación cerrada. Para ello la URL comenzará por "
+"file:// seguido del path local donde se ubica el repositorio.\n"
+"Si la URL empieza por http:// https:// ftp:// o cualquier otro protocolo"
+"reconocible por el sistema operativo se realizará la correspondiente "
+"descarga remota. \n";
+//////////////////////////////////////////////////////////////////////////////
+Real InstallFromUrl(Text url, Text package.version)
+//////////////////////////////////////////////////////////////////////////////
+{
+  Text pack = package.version+".zip";
+  @Repository::DownloadPackageFromUrl(url,package.version)
 };
 
Index: tol/stdlib/general/TolPackage/repository.tol
===================================================================
--- tol/stdlib/general/TolPackage/repository.tol	(revision c13253cdb685d5ba0d5cfa7fe939a0cd3c0faa47)
+++ tol/stdlib/general/TolPackage/repository.tol	(revision 95edff5809e1143e110799a4b6541d9da4d8f221)
@@ -191,4 +191,43 @@
 //////////////////////////////////////////////////////////////////////////////
 //Copia un fichero del repositorio remoto al directorio local de paquetes
+  Static Real DownloadPackageFromUrl(Text url, Text packageName)
+//////////////////////////////////////////////////////////////////////////////
+{
+  Real prtPos = TextFind(url,"://")+2;
+  Text protocol = Sub(url,1,prtPos);
+  //Resto de la URL tras el protocolo
+  Real isRemote =  protocol!="file://";
+
+  Text pack = packageName+".zip";
+  Text oza = packageName+"/"+packageName+".oza";
+  Text localPack = TolPackage::Client::_.localRoot+pack;
+  Text localOza = TolPackage::Client::_.localRoot+oza;
+  Text localDir = TolPackage::Client::_.localRoot+packageName;
+  
+  If(FileExist(localPack), OSFilRemove(localPack));
+//WriteLn("TRACE DownloadPackage localPack="<<localPack);
+  If(!isRemote,
+  {
+    Text address =  Sub(url,prtPos+1,TextLength(url));
+  //WriteLn("TRACE DownloadPackage  cp \""+_.address+@Repository::_.platform+"/"+pack+"\" \""+localPack+"\"");
+    OSFilCopy(address+"/"+pack,localPack)
+  },
+  {
+    Set CurlApi::GetUrl([[
+      Text url  = url+"/"+pack, 
+      Text file = localPack ]]) 
+  });
+  If(!FileExist(localPack), False,
+  {
+  //WriteLn("TRACE DownloadPackage UnpackFull("<<localDir+")");
+    Real PackArchive::UnpackFull("ZipArchive", localDir);
+    OSFilRemove(localPack);
+    True
+  });
+  FileExist(localOza)
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//Copia un fichero del repositorio remoto al directorio local de paquetes
   Real DownloadPackage(Text packageName)
 //////////////////////////////////////////////////////////////////////////////
