Résolution des erreurs de compilation des binaires d'images sous Windows lors de l'installation npm

Lors de l'installation de dépendances Node.js sur un environnement Windows, il est fréquent de rencontrer des échecs lors de l'étape postinstall de certains packages de traitement d'images tels que cwebp-bin, gifsicle, optipng-bin ou pngquant. Ces erreurs se manifestent généralement par des échecs de commandes de compilation comme ./configure ou autoreconf.

Analyse des symptômes

Lors de l'exécution de npm install, le processus échoue et génère des traces d'erreur similaires à celles-ci :

npm ERR! code 1
npm ERR! path D:\projects\mon-app\node_modules\cwebp-bin
npm ERR! command failed
npm ERR! command C:\windows\system32\cmd.exe /d /s /c ./configure --disable-shared
npm ERR! '.' n'est pas reconnu en tant que commande interne ou externe...

npm ERR! path D:\projects\mon-app\node_modules\gifsicle
npm ERR! command C:\windows\system32\cmd.exe /d /s /c autoreconf -ivf
npm ERR! 'autoreconf' n'est pas reconnu en tant que commande interne ou externe...

Bien que ces messages indiquent un échec de compilation depuis le code source, la cause réelle se trouve souvent plus haut dans les logs, sous forme d'avertissements :

‼ getaddrinfo ENOENT raw.githubusercontent.com
‼ cwebp pre-build test failed
i compiling from source

Identification de la cause racine

Ces packages tentent d'abord de télécharger des binaires précompilés hébergés sur raw.githubusercontent.com. Si cette requête réseau échoue (souvent en raison d'une résolution DNS bloquée, d'un pare-feu d'entreprise ou de restrictions géographiques), le script d'installation bascule automatiquement sur la compilation locale du code source.

Cependant, les scripts de compilation (configure, autoreconf, make) sont conçus pour des environnements de type Unix. Sous Windows natif, ces commandes n'existent pas, ce qui provoque l'erreur fatale Command failed.

Solution : Contournement du blocage DNS

Pour résoudre ce problème, il faut permettre à npm de télécharger correctement les binaires précompilés, évitant ainsi le fallback vers la compilation locale. La méthode la plus directe consiste à forcer la résolution DNS de raw.githubusercontent.com en modifiant le fichier hosts du système.

Voici comment automatiser l'ajout d'une adrese IP fonctionnelle dans votre fichier hosts via PowerShell. Exécutez PowerShell en tant qu'administrateur et utilisez le script suivant :

# Définir le chemin du fichier hosts
$hostsPath = "$env:windir\System32\drivers\etc\hosts"

# Adresse IP de secours pour GitHub Raw
$targetIp = "185.199.108.133"
$domain = "raw.githubusercontent.com"

# Vérifier si l'entrée existe déjà
$hostsContent = Get-Content $hostsPath -Raw
if ($hostsContent -notmatch $domain) {
    # Ajouter la nouvelle règle de résolution
    $newEntry = "`n$targetIp`t$domain"
    Add-Content -Path $hostsPath -Value $newEntry -Force
    Write-Host "Entrée ajoutée avec succès au fichier hosts." -ForegroundColor Green
} else {
    Write-Host "Le domaine est déjà présent dans le fichier hosts." -ForegroundColor Yellow
}

# Vider le cache DNS pour appliquer les changements immédiatement
Clear-DnsClientCache
Write-Host "Cache DNS vidé." -ForegroundColor Cyan

Une fois le fichier hosts mis à jour et le cache DNS purgé, relancez l'installation des dépendances :

npm cache clean --force
Remove-Item -Recurse -Force node_modules
npm install

Le gestionnaire de paquets pourra désormais récupérer les exécutables précompilés sans tenter de les générer localement.

Étiquettes: npm nodejs Windows cwebp-bin gifsicle

Publié le 1 août à 06h25