No such export X in resource Y : comment le corriger dans FiveM
Vous obtenez « No such export X in resource Y » dans FiveM ? Les causes : ressource non démarrée, nom de dossier incorrect, décalage client ou serveur, export renommé et ordre de démarrage.
La console affiche ceci, souvent en boucle :
SCRIPT ERROR: @my_script/server/main.lua:14: No such export GetItemCount in resource my_inventoryVotre script a appelé exports['my_inventory']:GetItemCount(). À ce moment-là, my_inventory n'avait pas d'export avec ce nom. Le message nomme les deux parties, donc la correction est l'une d'un petit nombre de causes. Ce guide couvre le cas générique. Si l'export est getSharedObject de es_extended, lisez No such export getSharedObject in resource es_extended à la place, qui contient les causes spécifiques à ESX.
1. La ressource n'est pas démarrée
Une export n'existe que lorsque sa ressource est en cours d'exécution. Vérifiez la console au démarrage :
- La ressource est-elle listée dans
server.cfgavecensureoustart? - A-t-elle démarré sans erreur, ou a-t-elle imprimé
Couldn't start resourceouFailed to load script? - Est-elle arrêtée dans txAdmin ? Vérifiez la page Ressources.
Une ressource qui n'a pas pu démarrer, par exemple à cause d'une erreur de syntaxe Lua ou d'une dépendance manquante, n'a pas d'exports. Corriger d'abord sa propre erreur. Voir Couldn't start resource et could not find dependency. Une erreur de syntaxe en particulier est couverte dans Lua syntax error: unexpected symbol near.
2. Le nom de ressource est incorrect
exports['my_inventory'] utilise le nom du dossier de la ressource, pas le titre du script. Si le dossier a été renommé, chaque script qui l'appelle par l'ancien nom échoue.
Situations typiques :
- Vous avez renommé
my_inventory-masteroumy_inventory-mainen quelque chose de plus court et vous avez continué à appeler l'ancien nom. - Le nom utilise un trait d'union dans un endroit et un trait de soulignement dans un autre :
my-inventoryetmy_inventorysont des ressources différentes. - La capitalisation diffère : correspondre au dossier exactement.
- La ressource se trouve dans un dossier avec des crochets tels que
[qb]. Les crochets sont seulement une catégorie : ils ne font pas partie du nom, utilisez doncmy_inventory, pas[qb]/my_inventory.
Certaines ressources remplacent une autre avec provide 'other_name' dans leur fxmanifest, afin que les scripts demandant l'ancien nom fonctionnent toujours. Si vous avez remplacé une ressource par une ressource compatible et l'ancien nom échoue, vérifiez si la nouvelle le fournit, et que vous avez supprimé l'ancien dossier pour que les deux ne se heurtent pas.
3. L'export est de l'autre côté
Les exports sont par côté. Une export enregistrée dans un script client ne peut être appelée que depuis un autre script client, et une enregistrée sur le serveur uniquement depuis un script serveur.
-- my_inventory/server/main.lua
exports('GetItemCount', function(source, item)
return 0
end)-- my_script/client/main.lua
-- fails: GetItemCount exists on the server only
local count = exports['my_inventory']:GetItemCount('water')Pour vérifier, regardez dans les fichiers du fournisseur : la ligne exports(...) est dans client/ ou server/, ou dans un fichier listé sous shared_scripts, qui s'exécute sur les deux côtés. Si l'export est serveur uniquement, appelez-le depuis un script serveur, et obtenez les données au client avec un événement ou un rappel, voir server callbacks.
4. L'export a été renommé ou supprimé
Les ressources changent entre les versions. Une export appelée GetItemCount dans une version plus ancienne peut être getItemCount ou Search dans une version plus récente, et les noms Lua sont sensibles à la casse. Si l'erreur est apparue après une mise à jour de l'une ou l'autre ressource :
- Ouvrez le
fxmanifest.lua,READMEou la documentation du fournisseur et cherchez la liste des exports actuels. - Recherchez dans le dossier de la ressource
exports(et le nom que vous appelez. - Mettez à jour votre appel, ou mettez à jour l'autre ressource vers la version pour laquelle le script a été écrit.
N'oubliez pas que l'inverse existe aussi : un script mis à jour pour appeler une nouvelle export, tandis que le fournisseur exécute toujours une ancienne version sans elle.
grep -rn "exports(" resources/[mic]/my_inventorySous Windows, utilisez la boîte de recherche de votre éditeur à la place.
5. Ordre de démarrage et dépendances
Si la ressource existe et a l'export, mais que l'appel se produit avant qu'elle ne soit prête, vous obtenez la même erreur. Les ressources commencent dans l'ordre de server.cfg :
ensure oxmysql
ensure ox_lib
ensure my_inventory
ensure my_scriptMettez le fournisseur au-dessus du script qui l'utilise. Pour une correction permanente, indiquez le lien dans le fxmanifest.lua de l'appelant :
dependency 'my_inventory'Ensuite, FiveM démarre my_inventory en premier, et refuse de démarrer le script sans elle. Plus sur l'ordre dans server.cfg resource order.
Deux pièges connexes :
- L'export est enregistré tard.
exports('Name', fn)s'exécute lorsque la ligne est atteinte. Si le fichier erreur au-dessus, ou l'enregistre après une longueWait, les appelants qui s'exécutent entre-temps échouent. Enregistrez les exports près du haut du fichier. - Un appel au moment du chargement. Un appel au niveau supérieur tel que
local count = exports['my_inventory']:GetItemCount('water')s'exécute au moment où votre fichier se charge. Déplacez-le dans un événement ou un thread, ou assurez-vous que la dépendance s'exécute déjà.
Vous pouvez également protéger une intégration optionnelle avec pcall et avec une vérification que la ressource s'exécute :
if GetResourceState('my_inventory') == 'started' then
local ok, count = pcall(function()
return exports['my_inventory']:GetItemCount('water')
end)
endGetResourceState retourne 'started', 'stopped', 'missing' ou d'autres états, afin que vous puissiez aussi enregistrer quel cas il s'agit. Pour un regard plus approfondie sur le fonctionnement des exports, lisez FiveM exports in Lua.
6. Redémarré une ressource, pas l'autre
Redémarrer un fournisseur pendant l'exécution du serveur ne re-connecte pas toujours les scripts qui contiennent ses objets. Après que vous redémarriez ou mettez à jour un fournisseur, redémarrez les scripts qui l'appellent, ou redémarrez le serveur.
Liste de contrôle
| Symptôme | Correction |
|---|---|
| Ressource non listée dans la console au démarrage | Ajouter ensure my_inventory à server.cfg |
Couldn't start resource au-dessus de l'erreur |
Corriger d'abord l'erreur du fournisseur |
| Dossier renommé | Utiliser le nom exact du dossier dans exports['name'] |
| Export appelée du mauvais côté | L'appeler du côté qui la définit, ou utiliser un événement/rappel |
| Erreur après une mise à jour | L'export a été renommée ou supprimée ; vérifier la liste actuelle d'exports du fournisseur |
| Erreur au démarrage uniquement | Placer le fournisseur au-dessus de l'appelant ; ajouter une ligne dependency |
| Toujours échouant après un redémarrage du fournisseur | Redémarrer les scripts qui l'appellent |
Réponses rapides
Qu'est-ce que « No such export X in resource Y » signifie ?
Un script a appelé exports['Y']:X() et la ressource Y n'avait pas d'export appelé X à ce moment-là. Y n'est pas en cours d'exécution, a un nom différent, définit X de l'autre côté, ou n'a pas cet export dans cette version.
Le nom de ressource est-il sensible à la casse ?
Traiter comme sensible à la casse : le nom dans exports['name'] doit correspondre exactement au nom du dossier, y compris les traits d'union et les traits de soulignement. C'est particulièrement important sur les serveurs Linux.
L'ordre d'ensure corrige-t-il cette erreur ?
Souvent, oui. Les ressources commencent dans l'ordre de server.cfg, donc mettez la ressource qui fournit l'export au-dessus de celle qui l'appelle, ou ajoutez une ligne dependency au fxmanifest.
Des scripts sans ce problème
Mic PhoneUn téléphone pliable qui se déplie en tablette et se prolonge jusqu’au vrai téléphone du joueur.Voir le script →
CCTV Security CamerasDes caméras à placer, une tablette multi-vues en direct et des photos imprimées comme preuves.Voir le script →
Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →