Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

"Embarquer" des perlmods dans une application.

5 réponses
Avatar
xavier
Bonjour, je dois écrire une petite appli sous MacOSX pour traiter des
fichiers MBox

Pour cela, je pars d'un petit outil quis s'appelle DropScript
(http://www.wsanchez.net/software/). Je l'ai utilisé pliseurs fois avec
satisfaction pour des scripts shell.

On fait tout simplement glisser le script perl desus, et on obtien un
droplet qui fait le boulot requis.

Problème,la suite Mail::MBox::Whatever n'est pas présente sur tous les
postes où de dois intervenir. En phase de dev, il suffit de mettre les
modules à côté du script, puisque "." appartient à @INC

Par contre, dans le cadre de l'application, elle est lancée avec un
pwd=/ Et donc ça ne marche plus.

J'ai donc copié les modules dans les ressource de l'application :

MyAp.app
Contents
MacOSX
runtime
Resources
monscript.pl
Mail
MIME

Bon, comme dit précédemment, l'appli se lance dans / et ça ne marche
toujours pas.

Je voulais donc faire un chdir *avant* les use Mail::MBox

> my $dir = `dirname $0`;
> chomp($dir);
> $dir .= "/";
> chdir ($dir) or die "Can't chdir $! to $dir\n";
>
> use Mail::Box::Mbox;
> use Mail::Box::Mbox::Message;

Or ça foire avant l'appel à chdir en me faisant remarque que les modules
ne sont pas dans @INC :

> BEGIN failed--compilation aborted at
> /Development/EudoraOutBox/DropEudoraOutBox.app/Contents/Resources/script
> line 19.

De plus,
use lib $dir;
revient strictement au même problème, puisque c'est appelé à la
compilation, avant que $dir ait une valeur

Il n'y a pas moyen de modifier ça avec des BEGIN, précisément ? il me
semble avoir lu un truc là-dessus.

En dernier recours, je peux me débrouiller pour que l'application soit
située au même endroits sur les postes (dans /var/root/bin, beuuuh)
auquel cas use lib marcherait. Mais le cas d'un paquet d'applis perl
installables n'importe où doit bien se poser, non ?


Merci,

--
XAv
Disponible au 01/06/2010
<http://www.xavierhumbert.net/perso/CV2.html>

5 réponses

Avatar
Paul Gaborit
À (at) Tue, 9 Feb 2010 16:21:29 +0100,
(Xavier) écrivait (wrote):

Problème,la suite Mail::MBox::Whatever n'est pas présente sur tous les
postes où de dois intervenir. En phase de dev, il suffit de mettre les
modules à côté du script, puisque "." appartient à @INC

Par contre, dans le cadre de l'application, elle est lancée avec un
pwd=/ Et donc ça ne marche plus.


[...]

Je voulais donc faire un chdir *avant* les use Mail::MBox

my $dir = `dirname $0`;
chomp($dir);
$dir .= "/";
chdir ($dir) or die "Can't chdir $! to $dirn";

use Mail::Box::Mbox;
use Mail::Box::Mbox::Message;



Or ça foire avant l'appel à chdir en me faisant remarque que les modules
ne sont pas dans @INC :

BEGIN failed--compilation aborted at
/Development/EudoraOutBox/DropEudoraOutBox.app/Contents/Resources/script
line 19.



De plus,
use lib $dir;
revient strictement au même problème, puisque c'est appelé à la
compilation, avant que $dir ait une valeur

Il n'y a pas moyen de modifier ça avec des BEGIN, précisément ? il me
semble avoir lu un truc là-dessus.



Il y a un module spécifique pour retrouver le répertoire du script :
FindBin. À ma connaissance, il est disponible dans la distribution
perl présente dans Mac OS X.

On peut donc écrire un truc du genre :

use FindBin;
use lib $FindBin::Bin;
use Mail::Box::Mbox;

Sinon, on peut tout faire à la main dans un bloc BEGIN pour que ce
soit pris en compte lors de la compilation :

BEGIN {
my $dir = `dirname $0`; # C'est moche ! ;-)
use lib $dir;
}
use Mail::Box::Mbox;

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
xavier
Paul Gaborit wrote:

Il y a un module spécifique pour retrouver le répertoire du script :
FindBin. À ma connaissance, il est disponible dans la distribution
perl présente dans Mac OS X.



Exact. Je vais donc essayer ceci.

Merci,

--
XAv
Disponible au 01/06/2010
<http://www.xavierhumbert.net/perso/CV2.html>
Avatar
Manuel Pégourié-Gonnard
Paul Gaborit scripsit :

Sinon, on peut tout faire à la main dans un bloc BEGIN pour que ce
soit pris en compte lors de la compilation :

BEGIN {
my $dir = `dirname $0`; # C'est moche ! ;-)
use lib $dir;
}
use Mail::Box::Mbox;



Il me semble aussi avoir vu __FILE__ utilisé pour éviter le recours à la
ligne que tu qualifies de moche. J'imagine que si tu utilises quand même
dirname, c'est que __FILE__ peut poser problème ?

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Avatar
xavier
Paul Gaborit wrote:

On peut donc écrire un truc du genre :

use FindBin;
use lib $FindBin::Bin;
use Mail::Box::Mbox;



Ca marche parfaitement !
Et c'est dispo dans toutes les versions de 10.4.x à 10.6.x

Merci Paul !

--
XAv
Disponible au 01/06/2010
<http://www.xavierhumbert.net/perso/CV2.html>
Avatar
Paul Gaborit
À (at) Tue, 9 Feb 2010 20:16:58 +0100 (CET),
Manuel Pégourié-Gonnard écrivait (wrote):

Paul Gaborit scripsit :

Sinon, on peut tout faire à la main dans un bloc BEGIN pour que ce
soit pris en compte lors de la compilation :

BEGIN {
my $dir = `dirname $0`; # C'est moche ! ;-)
use lib $dir;
}
use Mail::Box::Mbox;



Il me semble aussi avoir vu __FILE__ utilisé pour éviter le recours à la
ligne que tu qualifies de moche. J'imagine que si tu utilises quand même
dirname, c'est que __FILE__ peut poser problème ?



__FILE__ est un peu spécial : c'est le nom du fichier courant. Mais
uniquement si c'est pris seul (ça ne marche pas dans une chaîne de
caractères). C'est documenté dans perldata. Le premier problème est
que le fichier courant n'est peut-être pas le script lui-même (par
exemple, dans un module)... Sinon, ça doit donner un résultat
sensiblement équivalent à $0. On pourrait donc écrire dans le script
principal :

BEGIN {
my $curfile = __FILE__;
my $dir = `dirname $curfile`; # C'est moche ! ;-)
use lib $dir;
}
use Mail::Box::Mbox;

Mais cela ne supprime le besoin d'un équivalent de dirname : il faut
bien récupérer le répertoire du script. Et là, soit on fait confiance
à la plateforme (si elle fournit 'dirname') soit on fait appel au
module File::Basename (et à sa fonction dirname). Mais dans ce cas, on
commence peu à peu à réécrire FindBin. ;-)

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>