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 :

  1. 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 voudrions napi-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.

  2. 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 comment node-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

  3. 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 à bord napi-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 !

Commençons aujourd'hui