Je suis actuellement dans un projet qui développe à l'aide d'un cadre développé par un autre ministère comme base. Nous introduisons actuellement des normes de qualité (enfin, YAY!) Dans notre département, mais il est actuellement impossible de présenter celles à l'autre département. En conséquence, nous travaillons contre une cible mobile constante sans stabilité de l'API ni des versions stables, ce qui est stressant à tout le moins. P>
Étant donné que nous essayons de réparer les choses à notre fin, nous aimerions nous assurer de nous-mêmes dans la mesure où cela augmente les changements dans le code de l'A.K.A. amont ". Nous avions envisagé des dépendances du module dur: p>
C'est le plan jusqu'à présent. Maintenant les questions: p>
Utiliser le module code> Nous ne pouvons que définir que le code de version le plus bas est censé fonctionner avec. Li>
ol>
7 Réponses :
Bien que j'espère que CPAN est plus stable que les modules que vous comptez, permettez-moi de poser une question similaire: comment vous protégeriez-vous contre des changements inattendus dans un module CPAN? P>
Une réponse: vous téléchargeriez le module et régressez votre code dans un environnement de test. P>
La même chose peut-elle être utilisée ici? Devez-vous indiquer les copies «en direct» de leurs modules ou pourriez-vous indiquer vos propres copies? P>
CPAN est instable dans le sens où vous ne pouvez pas empêcher personne de faire quoi que ce soit. Un module particulier peut être totalement exempt de bugs, mais même un changement d'interface peut casser le code qui en dépend. Le grand coupable est la conception de la boîte à outils CPAN dans laquelle la version la plus récente est celle que les clients essaient d'installer.
J'irais cela en faisant une copie privée des bibliothèques mon code dépend et de les mettre dans le répertoire lib code> de mon projet avec la compréhension que je ne modifierai jamais ces copies sauf à la commande périodique nouvelle versions comme des jalons sont atteints. P>
C'est un plan très sensible et je le mettez en train de le mettre en œuvre à travers un référentiel privé en forme de cpanier que j'appelle 'dpan'. Vous sélectionnez les distributions et les versions que vous souhaitez dans le vrai CPAN (ou Backpan) et créez votre propre référentiel à partir de celui-ci. Vos clients CPAN ne font que pointer sur ce référentiel, gelant efficacement versions à exactement ce que vous voulez. Vous ne mettez à niveau que lorsque vous le souhaitez. P>
En outre, le DPAN vous permet d'ajouter facilement non seulement votre propre code local, votre code privé, mais également de modifier des forfaits tiers pour résoudre leurs problèmes avec leurs installations, etc. Je suis une justification complète de l'idée au cours de la question de l'été 2009 de L'examen PERL . Vous pouvez également voir mes diapositives de mon Créer votre propre CPAN Talk à YAPC :: Russie. P>
Si vous êtes intéressé par ce type de solution, consultez mon myCPAN :: app :: Dpan module. Il faut un répertoire de distributions et le reste pour vous. Vous pointez votre client CPLAN (et assurez-vous qu'il ne se connecte pas à Internet) et c'est ça. P>
Une fois que vous pouvez créer votre propre référentiel, vous pouvez facilement effectuer un référentiel de test. Déchargez les versions que vous pensez que vous souhaitez effectuer une mise à niveau, déployez le code sur votre serveur de test et collectez les résultats. Si vous n'aimez pas les résultats, vous pouvez facilement changer le référentiel. P>
La prochaine grande étape de mon DPAN Travailler consiste à adopter une installation Perl existante, avec tous les modules que vous auriez pu installer et créer le référentiel qui vous donnerait cet état d'installation. J'ai toutes les principales pièces dont j'ai besoin pour faire le travail, mais j'ai été un peu occupé à obtenir quelques clients qui courent avec les premiers bits. P>
Si vous souhaitez en savoir plus sur ce genre de choses, faites le moi savoir. :) p>
Dpan sonne bien. Une fois que j'expose mes modules, comment cela souligne-je mon client CPAN?
Si vous utilisez cpan.pm, vous pouvez modifier le paramètre Urllist dans un fichier: /// URL. C'est la même chose que vous feriez pour un minicot. Je pars pour travailler maintenant, mais je tire moi un email (brian.d.foy@gmail.com) si vous rencontrez des problèmes.
Jetez un coup d'œil à par . Il vous permet d'incliner un ensemble de dépendances dans un seul fichier. Vous pouvez prendre les modules qu'ils libèrent, les jeter dans un fichier par et seulement mettre à niveau le fichier PAR lorsque vous souhaitez accepter leurs modifications. P>
Cela a cependant un problème de portabilité. Par hasard a des problèmes avec le code compilé et les bibliothèques dynamiques. Peut-être que cela n'a pas d'importance dans ce cas, mais cela a occupé certains des clients.
Pourquoi n'avez-vous pas signalé ces choses comme des bugs? Ce n'est pas comme si tu ne sais pas comment me joindre. De plus, comment a-t-il des problèmes avec le code compilé? Autant que je sache, cela signifie simplement que vous devrez créer un .par pour chaque plate-forme cible: c'est un format binaire après tout. En principe, il devrait gérer correctement les bibliothèques partagées.
Si vous souhaitez vérifier la version de modules externes, vous pouvez (au moins qu'elles signalent leur version $ correctement) utilisent quelque chose comme ceci:
BEGIN { use foo; use bar; die "Ghaaaa" if $foo::VERSION < 2.1; die "Aaaargh" if $foo::VERSION > 3.12; }
En pratique, cela ne fonctionne pas parce que vous devez le faire pour chaque module. Peut-être que vous pouvez restreindre foo, mais cela ne protège pas contre les mises à jour des dépendances de FOO.
Même: utilisez FOO 2.1; (minimum seulement)
Quelqu'un a souligné par déjà. Permettez-moi de mentionner Par :: Responsentiel et son module de compagnon Par :: Réposity :: Client . Ils implémentent une infrastructure client / serveur pouvant charger automatiquement toutes les dépendances qui ne sont pas trouvées localement (ou qui peuvent même préférer les packages du serveur). En tant qu'administrateur, vous pouvez simplement ajouter ou supprimer des packages vers ou depuis votre référentiel. La portion réelle de paquets est effectuée avec des serveurs totalement normaux: tout serveur HTTP (S) ou simplement fichier: // va faire. D'autres protocoles doivent être assez simples à mettre en œuvre. P>
Il comporte le mécanisme de chargement automatique de la magie de la magie susmentionnée, l'installation de l'emballage et la mise à niveau automatique du paquet. Outre la documentation du module, vous pouvez consulter un Présentation sur Par de YAPC :: Europe 2008 < / a> qui couvre cela à certains étendues. P>
Je dois admettre que la mise à niveau automatique est une technologie suffisamment avancée pouvant manger un bébé ou deux si elle fonctionne tout de chatons à ronger. p>