2010-11-30 7 views
7

Tengo varios módulos CPAN que hacen un uso extensivo de la metaprogramación para reducir la placa de la caldera y facilitar la refactorización.¿Cómo decirle a CPAN (Perl) sobre los paquetes creados con meta-programación?

La consecuencia de esto sin embargo es que hay muchos paquetes que se crean programáticamente, por lo tanto nunca hay una línea package X::Y::Z; en el código fuente para encontrar CPAN (y luego usar para agregar el espacio de nombres a su lista de espacios de nombres reservados).

Así que mi pregunta es si hay una forma preferida de dejar que CPAN sepa sobre estos paquetes creados en tiempo de ejecución. Estas son las opciones que estoy considerando actualmente:

  • buscar manualmente todos los paquetes y crear un archivo ficticio pm de CPAN para indexar.
  • Busque manualmente y luego actualice Build.PL para incluirlos en la lista provides.
  • Añadir algo de código para las rutinas de los meta-programación para realizar un seguimiento de los cuales se utilizan paquetes, y añadir un gancho en al build dist para actualizar el provides o alguna otra sección del META.yaml

La última opción es actualmente lo Me estoy inclinando hacia. Me gustaría saber si hay algún problema con este enfoque, o alguna forma mejor de mantener actualizado CPAN con la lista completa de paquetes.

Respuesta

4

Si le leo correctamente esto no es un problema, siempre que no bloquee otros espacios de nombres. No hay requisitos previos para declarar cada espacio de nombres creado, solo el espacio de nombres base de su distribución y los archivos asociados con la distribución. Si desea "reservar" ciertos espacios de nombres, en lugar de crear archivos .pm en blanco, consulte crear archivos .pod y documentos en su lugar.

+0

Al menos en el caso de mi peor delincuente 'List :: Gen', ninguno de los paquetes creados en tiempo de ejecución contiene funciones que un usuario final debería llamar directamente. Por lo tanto, no tiene sentido proporcionarles la documentación del usuario final. Sé que no es necesario declarar todos los nombres de los paquetes, pero calculé que permitir que PAUSE los conozca es la "mejor" práctica. –

+0

Todo lo que PAUSE se preocupa es que los archivos apropiados (META.yml/.json, MANIFEST, etc.) estén presentes y formateados correctamente. Una vez que tiene un espacio de nombre, lo que hace en él es su preocupación y no a otros a menos que tengan permiso en su espacio de nombre para contribuir. Mientras explique en su documentación que los espacios de nombres se generan automágicamente, ha cumplido con su parte. – squeeks

+0

=> ¿estás seguro de eso? Según la publicación de blog de brian d foy (http://www.effectiveperlprogramming.com/blog/884): cuando PAUSE le asigna un espacio de nombres como mantenedor primario, usted solo "posee" exactamente ese espacio de nombres. Aunque los espacios de nombres Perl parecen jerárquicos, no lo son. Es decir, no hay nada en Perl que se preocupe por el espacio de nombre que usa o de cuál hereda su paquete. El XML :: Simple namespaces no hereda de XML en virtud de su nombre. De la misma manera, no tiene ningún permiso en Foo :: Bar :: Baz simplemente porque PAUSE le asignó permisos en Foo :: Bar. –

Cuestiones relacionadas