C'est assez vague (et vaste) comme question.
Une façon de faire que je connais plutôt bien c'est d'écrire une API, de ton côté, donc un ensemble de classes et de méthodes qui font des trucs. Ca c'est vraiment la base, écrire l'API qu'un développeur pourrait manipuler pour faire ce que tu veux qu'il fasse dans ton plugin (déplacer un fichier, envoyer un email, et que sais-je encore). Je vais écrire les exemples en Groovy parce que c'est un langage que je connais bien donc je suis plus à même de t'expliquer le cheminement.
1ère étape :
| import com.winxaito.starwarsapi.Base
import com.winxaito.starwarsapi.BaseRegistry
def bases = [new Base('Tatooine', 'Luke', 57), new Base('Naboo', 'Padme', 107)] // ton API lui fournit de quoi créer des bases
BaseRegistry.registerMyBases(bases) // là tu vas faire un appel à ta BDD ou autre
|
| groovy SonScript.groovy -cp starwarsapi.jar #un peu pénible de se trimballer ton jar...
|
Déjà t'as une belle première étape, un développeur peut écrire un plugin "en code", il écrit un bout de code qui se sert ton API, te l'envoie, tu le fais tourner chez toi, et roulez. Mais c'est pas bien pratique, parce qu'il faut qu'il embarque ton API pour compiler son code par exemple, donc ton jar, ta gem, etc.
Donc le mieux c'est que tu lui prépares un environnement chez toi dans lequel il va faire tourner ses scripts. On appelle ça un shell
parfois, et certains langages te permettent directement de "lire et interpréter" des chaînes de caractères comme si c'était du code (Groovy Shell, Javascript eval
, …). Et généralement, en préparant l'environnement, bah tu lui mâches le travail.. Là c'est déjà sympa, le mec écrit :
| // Youpi tu lui as mis les imports dans ton shell histoire qu'il se les trimballe pas
bases << new Base('Tatooine', 'Luke', 57) // la liste de bases existe déjà, c'est toi qui la lui donnes
bases << new Base('Naboo', 'Padme', 107)
// pas besoin d'appeler d'autre méthode, comme tu lui as filé la liste, tu es capable de l'instrumenter, et donc de savoir que quand elle a changé de taille en exécutant son script c'est qu'il faut la sauvegarder en BDD
|
Ensuite il existe des mécaniques plus avancées, parmi celles que je connais y'a le système de sandbox
. En gros tu dis "ton plugin c'est un script, et quand tu fais ton script, chez moi je vais le faire tourner dans un environnement cloisonné, restreint, pour que tu bricoles pas avec mon système par exemple". La plupart des langages qui ont été pensés pour écrire des plugins ou des extensions fournissent généralement ce genre de fonctionnalités. Groovy, Javascript pour ceux que je connais mais ça m'étonnerait pas que l'interpréteur Ruby permette de le faire par exemple. Histoire que le mec écrive pas
| bases << new Base('Tatooine', 'Luke', 57)
while(true) {
Runtime.getRuntime().exec(["javaw", "-cp", System.getProperty 'java.class.path', "ForkBomb"])
} // lolilol, ça va bien ton serveur ? :D
// ou bien marrant aussi :
System.exit() // prout :P
|
Donc à cette étape t'es "production-ready" déjà, n'importe qui peut t'écrire un plugin et le faire fonctionner avec (au moins un peu de) sécurité, chez toi, pépère. Tu peux même t'amuser a brancher ça sur un textarea
ou autre histoire qu'on écrive des plugins directement sur ton serveur.
Enfin, tu vas peut-être vouloir que les gens qui ne sont pas nécessairement développeurs écrivent des plugins, dans ce cas, il faut leur fournir une espèce de surcouche à ton API, une "façon d'écrire" différente du code pur et dur et des appels de méthodes. En règle générale on appelle cela une DSL.
| bases {
Tatooine {
gouverneur: 'Luke'
resources: 57
}
Naboo {
gouverneur: 'Padme'
resources: 107
}
}
|
Au final, ce code branché sur ton API à travers une DSL fait exactement la même chose que les autres. Simplement pour un mec qui ne sait pas programmer, ça pourra lui parler un peu plus.
Si tu connais Gradle et que tu as déjà écrit un fichier build.gradle
pour Android par exemple, tu as utilisé sans le savoir une DSL écrite par les gens de chez Android.
EDIT : En me relisant, j'ai pas fait exprès mais j'ai pris un exemple de client / serveur pour lequel les plugins s'exécutent sur le serveur, c'est déjà un peu différent du scripting de jeu. Donc tu vois, même en essayant de rester générique, je suis déjà rentré dans un cas assez particulier. Faut vraiment essayer de nous dire dans quel contexte tu veux pouvoir permettre de créer des plugins, ce dont tu disposes aujourd'hui, comment fonctionne ton logiciel, etc. Là on va commencer à pouvoir mieux t'aiguiller.