Retour sur : Guides sur la technologie
Comment faire fonctionner node sqlite3 avec Apple Silicon M1
Le problème
La raison pour laquelle sqlite3 ne fonctionne pas correctement est triple :
Quand node sqlite3 est installé en utilisant
npm install sqlite3
, il récupère toutes les dépendances et les installe. Ensuite, il récupère le fichier binaire de liaison précompilé pour l'architecture et la plate-forme cibles. Dans mon cas, nous voudrionsnapi-v6-darwin-unknown-arm64
pour ARM64 et darwin pour Apple M1. Il n'y a pas encore de binaire précompilé disponible pour cet Apple ARM64 et même s'il y en a un, le paragraphe suivant expliquera pourquoi cela ne fonctionnera toujours pas.Le problème est qu'il détermine la plate-forme et l'architecture du système en utilisant le paquet de compilation binaire
node-pre-gyp
et ce très précieux problème Github détaille commentnode-pre-gyp
ne gère pas correctement la détection de l'architecture ARM et mélange essentiellement tout. Comme il ne détecte pas correctement, même si nous construisons notre propre liaison avec--build-from-source
lors de l'installation, cela ne fonctionnera toujours pas car il compile le mauvais fichier de liaison pour la mauvaise architecture. Pour aggraver les choses, si nous n'utilisons pas--build-from-source
, il récupère simplement le fichier de liaison précompilé Intel.napi-v6-darwin-unknown-x64
Maintenant, pour une raison quelconque, pendant l'exécution, il détecte correctement l'architecture et essaie de chercher la version ARM64 du fichier de liaison, il ne le trouvera pas et lancera l'erreur redoutée 'module non trouvé' pour
napi-v6-darwin-unknown-arm64
. Il ne le trouvera évidemment pas et même s'il le trouve, il lancera une erreur d'architecture incorrecte car nous avons la version Intel à bordnapi-v6-darwin-unknown-x64
.
La solution magique
Désinstaller sqlite3 :
npm uninstall sqlite3
Installez une nouvelle version de sqlite3, construisez-la à partir de la source, spécifiez l'arch cible et utilisez la construction de secours avec node-pre-gyp juste pour être sûr :
npm install sqlite3 --build-from-source --target_arch=arm64 --fallback-to-build
Maintenant, le bon fichier de liaison est compilé pour la bonne plate-forme et architecture, lors de l'exécution, il le trouvera et fonctionnera !