2017-04-13 3 views
1

Au moment où j'ai fait quelques scripts LUA qui sont chargés à Redis pour exécuter certaines commandes. Certaines fonctions sont communes à tous les scripts, comme l'analyse syntaxique ou les transformations de données, que j'ai copiées/collées entre les scripts au lieu de simplement les réutiliser. Impossible de créer un "require" car Redis ne pourra pas savoir où charger le fichier.Comment réutiliser le code sur les scripts LUA qui seront chargés dans Redis?

Pour chaque script que j'ajoute, le cauchemar de l'entretien s'agrandit!

Comment le DRY principal peut-il être appliqué à ce cas? La seule façon dont cela me vient à l'esprit est Générateur de code T4.

je peux faire un fichier "Lua" avec ce code:

#import "DataTransformer.lua" 

T4 essaiera de lire tous les fichiers avec l'extension .lua et recherchez le tag #import. Pour chaque étiquette #import va trouver le fichier correspondant et remplacer la ligne par le code réel. De cette façon, T4 effectuera le copier/coller automatiquement.

Le code à l'intérieur de "DataTransformer" doit être alloué à un objet nommé "DataTransformer", et le code qui importe DataTransformer peut l'utiliser à l'aide de l'objet DataTransformer. {Function}. Est-ce que cela a du sens ou existe-t-il un moyen plus facile d'y parvenir?

Répondre

2

tl; dr Non - il n'y a pas de telle façon et en utilisant T4 ou tout autre préprocesseur pour trouver et remplacer est la meilleure façon. Détails: il y a au moins deux manières non documentées de faire ce que vous voulez (une dans la réponse de for_stack, l'autre implique la métatable globale), mais vous ne devriez pas vraiment les utiliser. Non documenté signifie qu'ils ne peuvent pas fonctionner dans les futures versions ...

Les scripts sont destinés à être autonomes. Vous ne voulez vraiment pas commencer à vous inquiéter si une dépendance de script a été chargée avant de l'exécuter. Tant que vous utilisez les scripts mis en cache (avec SCRIPT LOAD et EVALSH), il n'y a pas vraiment de surcharge pour avoir la même charge utile répliquée autre que celle de maintenir toutes les copies. La meilleure façon de le faire est d'avoir des éléments réutilisables "injectés" à partir d'un modèle dans les scripts avant le déploiement. De cette façon, vous pouvez également tester les réutilisables de manière indépendante.

+0

Je pense que OP ne s'inquiète pas de la surcharge de nombreux scripts répliqués, mais s'inquiète de la gestion de ces scripts. Dites, si je corrige un bug, je dois le réparer dans tous les scripts qui incluent le code dupliqué. –

+0

La performance est également une préoccupation. Il semble donc que le pré-traitement soit la bonne solution. Si j'utilise un générateur T4 je pourrai à chaque fois que je répare un bug sur un script le propager à tous ses consommateurs :) –

0

Vous pouvez utiliser la commande SCRIPT LOAD pour charger ces scripts fonctionnels dans le cache et les appeler dans un autre script lua sous la forme f_sha-code.

  1. charge le script fonctionnel pour mettre en cache

    ./redis-cli script load "redis.call('SET', KEYS[1], ARGV[1])"

    Redis renvoie le code SHA pour ce script: xxxx-SHA-CODE-xxxx

  2. Appelez la fonction, à savoir f_xxxx-SHA-CODE-xxxx dans d'autres script Lua.

    ./redis-cli eval "f_xxxx-SHA-CODE-xxxx(KEYS[1], ARGV[1]); return redis.call('GET', KEYS[1])" 1 key val

+0

Bien que techniquement correct, il s'agit d'une méthode non documentée et ne doit pas être utilisée. –

+0

@ItamarHaber Merci de l'avoir signalé. Avez-vous une idée, pourquoi Redis n'a pas de méthode officielle pour appeler un autre script lua? –

+0

Sachez - non, devinez - oui: gardez les choses simples :) –