sintaxis - ¿Cómo encuentro las dependencias del módulo de mi script de Perl?
perl pdf (5)
Quiero que otro desarrollador ejecute un script de Perl que he escrito. La secuencia de comandos utiliza muchos módulos de CPAN que deben instalarse antes de ejecutar la secuencia de comandos. ¿Es posible hacer que el script (o el binario de perl
) descargue una lista de todos los módulos faltantes? Perl imprime los nombres de los módulos que faltan cuando intento ejecutar el script, pero esto es detallado y no muestra todos los módulos que faltan a la vez. Me gustaría hacer algo como:
$ cpan -i `said-script --list-deps`
O incluso:
$ list-deps said-script > required-modules # on my machine
$ cpan -i `cat required-modules` # on his machine
¿Hay una manera simple de hacerlo? Esto no es un impedimento para el espectáculo, pero me gustaría hacer la vida del otro desarrollador más fácil. (Los módulos requeridos están salpicados en varios archivos, por lo que no es fácil para mí hacer la lista a mano sin perder nada. Sé acerca de PAR , pero parece demasiado complicado para lo que quiero).
Actualización: Gracias, Manni, eso servirá. No sabía sobre %INC
, solo sabía sobre @INC
. Me conformé con algo como esto:
print join("/n", map { s|/|::|g; s|/.pm$||; $_ } keys %INC);
Que imprime:
Moose::Meta::TypeConstraint::Registry
Moose::Meta::Role::Application::ToClass
Class::C3
List::Util
Imager::Color
…
Parece que esto funcionará.
Consulte Module::ScanDeps y la utilidad "scandeps.pl" que viene con él. Puede realizar un análisis estático (y recursivo) de su código para las dependencias, así como también el% INC dump después de compilar o ejecutar el programa.
Tenga en cuenta que la exploración de fuente estática siempre se equivoca al incluir muchas dependencias. (Es el escáner de dependencia utilizado por PAR y tiene como objetivo ser más fácil para el usuario final).
Finalmente, puede optar por distribuir su script como una distribución de CPAN. Eso suena mucho más complicado de lo que realmente es. Puede usar algo como Module::Starter para configurar un esqueleto básico de una distribución tentativa de App :: YourScript. Coloque su secuencia de comandos en el subdirectorio bin / y edite Makefile.PL para hacer referencia a todas sus dependencias directas . Luego, para la distribución, usted hace:
- perl Makefile.PL
- hacer
- hacer dist
El último paso genera una buena aplicación-YourScript-VERSION.tar.gz Ahora, cuando el cliente desea instalar todas las dependencias, hace lo siguiente:
- Configure el cliente de CPAN correctamente. Simplemente ejecútalo y responde las preguntas. Pero ya lo estás requiriendo de todos modos.
- "tar -xz App-YourScript-VERSION.tar.gz && cd App-YourScript-VERSION"
- Ejecute "cpan".
El cliente de CPAN ahora instalará todas las dependencias directas y las dependencias de esas distribuciones automáticamente. Dependiendo de cómo lo configure, seguirá los requisitos previos de forma recursiva o automáticamente con ay / n cada vez.
Como ejemplo de esto, puede ver algunas de las distribuciones de la aplicación :: * en CPAN. Creo que la aplicación :: Ack es un buen ejemplo. Tal vez una de las distribuciones App :: * de mi directorio CPAN (SMUELLER).
Hoy desarrollo mis aplicaciones Perl como distribuciones tipo CPAN utilizando Dist::Zilla que puede encargarse de las dependencias a través del complemento AutoPrereq . Otra pieza interesante de código en esta área es el carton .
Otra herramienta en esta área, que es utilizada por Dist :: Zilla y su complemento AutoPrereqs, es Perl::PrereqScanner . Instala un programa scan-perl-prereqs
que usará PPI y algunos complementos para buscar la mayoría de los tipos de declaración previa, utilizando las versiones mínimas que defina. En general, sugiero esto en vez de escanear %INC
, lo que puede generar requisitos falsos e ignorar las versiones.
Para un uso rápido, sucio e infrecuente, el %INC
es la mejor manera de hacerlo. Si tiene que hacer esto con pruebas de integración continua o algo más sólido, existen otras herramientas para ayudar.
Steffen ya mencionó el Módulo :: ScanDeps.
El código en Test::Prereq hace esto, pero tiene una capa adicional que garantiza que su Makefile.PL o Build.PL los liste como una dependencia. Si haces que tus scripts se vean como una distribución normal de Perl , eso hace que sea bastante fácil verificar nuevas dependencias; solo ejecuta el banco de pruebas nuevamente.
Aparte de eso, puede usar una herramienta como Module::Extract::Use , que analiza el código estático buscando instrucciones de uso y requiere (aunque no las encontrará en las evaluaciones de cadena). Eso le proporciona los módulos que le indicó a su script que cargue. Además, una vez que sepa qué módulos ha cargado, puede combinarlos con la herramienta CPANdeps David Cantrell que ya ha creado el árbol de dependencias para la mayoría de los módulos de CPAN.
Tenga en cuenta que también debe pensar en las características opcionales también. Tu código en este caso no los tengo, pero a veces no cargas un módulo hasta que lo necesites:
sub foo { require Bar; # don''t load until we need to use it .... }
Si no ejerce esa función en su ejecución de prueba o prueba, no verá que necesita Bar para esa función. Un problema similar aparece cuando un módulo carga un conjunto diferente de módulos de dependencia en un entorno diferente (por ejemplo, mod_perl o Windows, y así sucesivamente).
No hay una buena manera automática de probar características opcionales como esa para que pueda obtener sus dependencias. Sin embargo, creo que debería estar en mi lista de tareas, ya que parece un problema interesante.
Puede volcar %INC
al final de su secuencia de comandos. Contendrá todos los módulos usados y requeridos. Pero, por supuesto, esto solo será útil si no requiere módulos condicionalmente (requiere Foo si $ bar).