2011-07-20 1 views
4

J'ai rencontré un scénario dans lequel je construisais un module Perl dans le cadre d'un autre système de construction sur une machine Windows. J'utilise l'option --install_base de Module :: Build pour spécifier un répertoire temporaire pour mettre les fichiers de module jusqu'à ce que le système de construction global puisse les utiliser. Malheureusement, cet autre système de construction a un problème si l'un des fichiers dont il dépend est en lecture seule - il essaie de supprimer les fichiers générés avant de les reconstruire, et il ne peut pas nettoyer les fichiers en lecture seule (il essaie de le supprimer , et il est en lecture seule, ce qui donne une erreur.) Par défaut, Module::Build installe ses bibliothèques avec le bit en lecture seule activé. Une option serait de faire une nouvelle étape dans le processus de construction qui supprime le bit en lecture seule des fichiers installés, mais en raison de la nature de l'outil de construction qui nécessitera un second répertoire temporaire ... ugh.Comment puis-je configurer Module :: Build pour NE PAS installer les fichiers en lecture seule?

Est-il possible de configurer un programme d'installation basé sur Module::Build pour ne PAS activer ce bit en lecture seule lorsque les fichiers sont installés dans le répertoire --install_base? Si c'est le cas, comment?

+0

J'ai eu de graves problèmes avec cela aussi, et je devrais fouiller en arrière pour voir ce que nous avons fait à ce sujet. Si vous voulez en parler en privé, puisque je ne peux pas divulguer tous les détails publiquement, faites le moi savoir. –

+0

@brian: Merci pour l'offre; Je ne vais pas vous prendre au courant maintenant (trouvé une solution de rechange: je force l'outil à ne pas les supprimer sur un nettoyage), mais peut-être un peu de temps si cette solution échoue. –

Répondre

4

Non, ce n'est pas une option configurable. Il est fait dans la méthode copy_if_modified dans Module::Build::Base:

# mode is read-only + (executable if source is executable) 
my $mode = oct(444) | ($self->is_executable($file) ? oct(111) : 0); 
chmod($mode, $to_path); 

Si vous contrôliez le Build.PL, vous pouvez sous-classe Module::Build et passer outre copy_if_modified appeler la classe de base puis chmod le fichier inscriptible. Mais j'ai l'impression que vous essayez juste d'installer le module de quelqu'un d'autre.

Probablement la chose la plus facile à faire serait d'installer une copie de Module::Build dans un répertoire privé, puis modifiez-le pour utiliser oct(666) (ou quel que soit le mode que vous voulez). Puis appelez perl -I /path/to/customized/Module/Build Build.PL. Ou, (comme vous l'avez dit) il suffit d'utiliser la norme Module::Build et ajouter une étape distincte pour marquer tout ce qui est inscriptible par la suite.

Mise à jour: ysth a raison; c'est ExtUtils::Install qui fait la copie finale. copy_if_modified est pour peupler blib. Mais ExtUtils :: Install aussi hardcode le mode en lecture seule. Vous pouvez utiliser une version personnalisée de ExtUtils :: Install, mais il est probablement plus facile d'avoir une étape séparée.

+0

êtes-vous sûr que copy_if_modified n'est pas seulement utilisé pour copier dans blib /? Je pense que l'installation réelle est faite avec ExtUtils :: Install (quels sont les codes 0444 (+0111 si un bit d'exécution est défini sur la source)), mais j'ai renoncé à regarder le code avant de déterminer avec certitude. – ysth

+0

C'est exactement là que ma recherche a mené, merci pour la confirmation! –

Questions connexes