2010-08-13 19 views
9

He instalado el módulo de Plantilla a través de CPAN en mi MacBook Pro y parece que se instaló correctamente.Dos versiones de Perl en Mac OS X?

Pero, cuando trato de ejecutar un script que incluye el módulo de plantilla, me sale el siguiente:

No se puede encontrar en Template.pm @INC (@INC contiene:/Users/purinkle/Sites/rob/modules /Library/Perl/Updates/5.10.0/darwin-thread-multi-2level /Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi- 2level /System/Library/Perl/5.10.0 /Library/Perl/5.10.0/darwin-thread-multi-2level /Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread- multi-2level /Network/Library/Perl/5.10.0/Network/Library/Perl /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10. 0) en ./index.pl línea 12.

fallidos de empezar - compilación abortada en la línea ./index.pl 12.

entonces creo que algo debe haber ido mal durante la instalación e intente instalar de nuevo a través de CPAN, pero recibir el siguiente mensaje:

La plantilla está actualizada (2.22).

A continuación, he ejecutado el comando instmodsh para tratar de encontrar dónde está instalado el módulo. instmodsh enumera estos directorios:

/opt/local/bin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level

/opt/local/lib/perl5/site_perl/5.8.9/Darwin-2Level/Plantilla

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Manual

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Namespace

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Plugin

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/ Stash

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/Template/Tools

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/ plantilla/Tutorial

/opt/local/lib/perl5/site_perl/5.8.9/darwin-2level/auto/Template/Stash/XS

/opt/local/share/man/man1

/opt/local/share/man/man3

Parece como si tuviera alguna forma consiguieron instaladas dos versiones diferentes de Perl (5.8.9 y 5.10.0) y esto está causando confusión entre CPAN y otros scripts de Perl.

¿Cómo puedo verificar esto y cómo se puede resolver este problema?

he corrieron los comandos

which perl 
which cpan 

y ambos vuelven/opt/local/bin

Correr

find/-name perl 

vuelve

hallazgo:/dev/fd/3: No es un directorio

hallazgo:/dev/fd/4: No es un directorio

/opt/local/bin/perl

/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/bash-completion/1.2_0/opt/local/etc/bash_completion.d/perl

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/perl

/opt/local/var/macports/sources/rsync.macports.org/releases e/puertos/Perl

/usr/bin/perl

/usr/local/bin/perl

/usr/share/archivo/magia/Perl

y

find/-name cpan 

vuelve

/opt/local/bin/CPAN

/opt/local/var/macports/software/perl5.8/5.8.9_3/opt/local/bin/cpan

/Usuarios/purinkle /. CPAN/build/CPAN-1.9402-KtN827/blib/script/CPAN

/Users/purinkle/.cpan/build/CPAN-1.9402-KtN827/scripts/cpan

/Users/purinkle/.cpan/ build/CPAN-1.9402-zb0AeX/blib/script/cpan

/Users/purinkle/.cpan/build/CPAN-1.9402-zb0AeX/scripts/cpan

/usr/bin/CPAN

Operando

perl -e 'print join "\n", @INC' 

vuelve

/Usuarios/purinkle/Sitios/roban/módulos

/opt/local/lib/perl5/site_perl/5.8.9/Darwin-2Level

/opt/local/lib/perl5/site_perl/5.8.9

/opt/local/lib/perl5/site_perl

/opt/local/lib/perl5/vendor_perl/5.8.9/Darwin-2Level

/opt/local/lib/perl5/vendor_perl/5.8.9

/opt/local/lib/perl5/vendor_perl

/opt/local/lib/perl5/5.8.9/darwin-2level

/opt/local/lib/perl5/5.8.9

+0

consulte editado mi respuesta, también puede publicar la salida de perl -e "@INC impresión \ n" – ennuikiller

Respuesta

16

OS X se envía con dos versiones de Perl. 5.10.0 es el valor predeterminado, por lo que/usr/bin/perl y/usr/bin/cpan deberían hablar con 5.10.0.

El problema es que tiene tres. /opt/local indica una instalación MacPorts que probablemente instaló Perl como una dependencia cuando no estaba buscando. Eso es/opt/local/bin/perl y es probablemente el perl predeterminado en su ruta. Consulte con which perl. Eso también significa que probablemente esté utilizando el cpan de MacPorts, consulte con which cpan y, por lo tanto, instaló Template Toolkit en la versión de MacPorts.

Supongo que está ejecutando un programa con #!/usr/bin/perl en la parte superior o está utilizando el mod_perl integrado o lo está ejecutando como un usuario que no es usted. Todo lo cual hará referencia a la instalación predeterminada de Perl de OS X y no a su MacPorts.

Macports tiene 5.10 y 5.12, pero "perl" en Macports sigue siendo 5.8. Puede instalar 5.10 en Macports.

En cuanto a cómo resolver esto ... si está usando el mod_perl en esa máquina, use Perl de Macports. Será más fácil instalar módulos y se mantendrá actualizado mejor que la versión del sistema operativo.

Para protegerse de futuras confusiones, puede agregar alias en /usr/local/bin o ~/bin para perl, perldoc y cpan para el Perl de su elección. Eso evitará que otra cosa instale Perl en su camino y secuestro.

+0

Esto parece tener sentido. Si ejecuto mis scripts como "perl script.pl", se ejecuta como se esperaba pero simplemente lo ejecuto como "./script.pl" y aparece el mensaje de error. He intentado cambiar la línea de shebang a "#!/Opt/local/bin/perl", pero sigo teniendo el mismo – purinkle

+6

@purinkle => Comienzo mis scripts con '#!/Usr/bin/env perl', que por lo general te da el perl que estás buscando. –

+0

@Eric Storm => ¡Gracias! Eso funcionó muy bien para cuando estoy ejecutando mi script desde la línea de comandos. Parece que ahora Apache es el último que se queja. – purinkle

2

inicio con estos 2 comandos:

which perl 
which cpan 

si obtiene caminos diferentes a los ejecutables, entonces hay una buena probabilidad de que tener 2 versiones o perl instalado. Si son iguales, es probable que tenga perl @ INC configurado incorrectamente. Puede añadir rutas a bny @INC incluir esto en el comienzo de su script (después de que el tinglado):

BEGIN { 

     push @INC,"/path/to/cpan/modules"; 

     } 

En cualquier caso, haga lo siguiente:

find/-name perl 
find/-name cpan 

ver lo que hay. Esto le dirá si tiene múltiples versiones o no.

+0

Estos comandos tanto devolver un directorio de "/ opt/local/bin" – purinkle

+0

publique la salida de perl -e "print @INC \ n" – ennuikiller

3

Pasé por este proceso hace aproximadamente un mes y medio al configurar una nueva MacBook Pro. Obtener el MacPorts perl instalado, cambiar a /usr/bin/env perl, y actualizar mi PATH (que, a partir de los comentarios sobre la respuesta de Schwern, parece que se trata de dónde se encuentra ahora) fue sencillo y razonablemente bien documentado.

Encontrar la manera de obtener el derecho de perl a aparecer por primera vez en PATH de Apache, por el contrario, era infernal y participan manera demasiado googlear intercalados con períodos de golpear mi cabeza contra la pared para el alivio.

Por lo tanto, para evitar eso, la respuesta que finalmente encontré fue que necesita agregar una clave PATH a /System/Library/LaunchDaemons/org.apache.httpd.plist con el PATH que desea utilizar Apache. Suponiendo que usted es tan familiarizados con el formato .Plist como estaba en el momento, aquí está mi actual completa org.apache.httpd.plist, que ha estado trabajando muy bien para mí:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>Disabled</key> 
     <true/> 
     <key>Label</key> 
     <string>org.apache.httpd</string> 
     <key>ProgramArguments</key> 
     <array> 
       <string>/usr/sbin/httpd</string> 
       <string>-D</string> 
       <string>FOREGROUND</string> 
     </array> 
     <key>OnDemand</key> 
     <false/> 
     <key>SHAuthorizationRight</key> 
     <string>system.preferences</string> 
     <key>EnvironmentVariables</key> 
     <dict> 
       <key>PATH</key> 
       <string>/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string> 
     </dict> 
</dict> 
</plist> 

Copiar/pegar que a su sistema (o simplemente agregue la clave EnvironmentVariables y su dict adjunta a su archivo existente), reinicie Apache, y debe configurarlo. (A menos que lo haya olvidado mal y haya sido otra cosa que realmente funcionó para mí, pero estoy bastante seguro de que fue esto.)

3

Hay otra solución que me parece mucho más simple: simplemente instale otra copia del Módulo Perl, e instálelo en la instalación donde desee usarlo. Por ejemplo, si tiene dos instalaciones Perl en su sistema, una en/usr/bin y otra en/opt/local/bin, y su comando cpan instala de manera predeterminada el módulo en la instalación/opt/local/bin, pero su la aplicación (Apache o lo que sea) está buscando el módulo en la instalación/usr/bin en su lugar, entonces solo necesita invocar cpan como "/ usr/bin/cpan" cuando instala el módulo. Eso resuelve el problema sin necesidad de editar su script, o su configuración de Apache, etc.

+0

Esto es lo único que funcionó para mí. Gracias. – joarderm

1

Me encontré con un problema similar; en mi caso, el problema era que había estado ejecutando cpan como yo en vez de como root, por lo que solo estaba instalando los módulos de cpan en mi directorio de usuario, que el @INC global no incluía. Simplemente ejecute 'sudo cpan' en lugar de 'cpan', instale sus módulos, y deberían cargarse correctamente.

0

Tuve el mismo problema, no tengo idea de cómo sucedió. Sospecho que de alguna manera sucedió durante una actualización de XCode. Lo arreglé reinstalando Perl en mi Mac de forma manual. He utilizado la última versión como se describe aquí:

http://search.cpan.org/~shay/perl/README.macosx

curl -O http://www.cpan.org/src/perl-5.26.1.tar.gz 
    tar -xzf perl-5.26.1.tar.gz 
    cd perl-5.26.1 
    ./Configure -des -Dprefix=/usr/local/ 
    make 
    make test 
    sudo make install