You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Alpine Linux下node-sass预构建包未生效,yarn install触发源码编译

为什么Alpine Linux上yarn安装node-sass会触发源码编译?

首先可以肯定的是,这不是yarn的bug,核心原因和Alpine Linux的特性以及node-sass预构建二进制包的适配逻辑有关,结合你的报错日志,我来拆解一下:

核心原因分析

  • musl与glibc的兼容性差异:node-sass的大多数预构建二进制包是基于GNU C库(glibc)编译的,但Alpine Linux默认使用轻量的musl libc,两者的应用二进制接口(ABI)不兼容。当node-sass检测到系统使用musl时,会判定没有匹配的预构建包,自动切换到源码编译流程。
  • 编译依赖缺失:从你的报错日志能看到,源码编译第一步就找不到python2——这是因为Alpine默认未预装python2,而你当前使用的旧版node-gyp(3.6.2)依赖python2来完成编译工作。

解决办法

针对这个问题,有几个可行的方案,你可以根据需求选择:

1. 指定兼容musl的预构建二进制包

node-sass其实提供了适配musl的预构建包,你只需要在执行yarn install前设置对应的环境变量,让它直接下载适配Alpine的版本:

SASS_BINARY_NAME=linux-musl-x64 yarn install

这个变量会告诉node-sass去拉取适配musl x64架构的预构建包,跳过源码编译步骤。

2. 安装编译依赖,允许源码编译

如果你一定要从源码编译(比如特定版本没有musl预构建包),可以先安装Alpine上编译node-sass需要的依赖:

apk add --no-cache python2 g++ make

安装完成后再执行yarn install,就能满足node-gyp的编译需求了。

3. 替换为dart-sass(推荐)

node-sass已经处于维护状态,官方现在推荐使用dart-sass(npm包名为sass),它是纯JavaScript实现,不需要依赖系统级的二进制包,兼容性更好,完全不会有这类编译问题。你可以直接替换:

yarn remove node-sass
yarn add sass

项目里的scss编译逻辑基本不需要改动,dart-sass和node-sass的API是兼容的。

你的报错日志(格式化后)

yarn install v1.5.1
warning package.json: No license field
warning emulsify@1.0.0: No license field
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.1.2: The platform "linux" is incompatible with this module.
info "fsevents@1.1.2" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
error An unexpected error occurred: "/var/www/html/node_modules/node-sass: Command failed.
Exit code: 1
Command: sh
Arguments: -c node scripts/build.js
Directory: /var/www/html/node_modules/node-sass
Output:
Building: /usr/local/bin/node /var/www/html/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
gyp info it worked if it ends with ok
gyp verb cli [ '/usr/local/bin/node',
gyp verb cli   '/var/www/html/node_modules/node-gyp/bin/node-gyp.js',
gyp verb cli   'rebuild',
gyp verb cli   '--verbose',
gyp verb cli   '--libsass_ext=',
gyp verb cli   '--libsass_cflags=',
gyp verb cli   '--libsass_ldflags=',
gyp verb cli   '--libsass_library=' ]
gyp info using node-gyp@3.6.2
gyp info using node@9.11.1 | linux | x64
gyp verb command rebuild []
gyp verb command clean []
gyp verb clean removing "build" directory
gyp verb command configure []
gyp verb check python checking for Python executable "python2" in the PATH
gyp verb `which` failed Error: not found: python2

内容的提问来源于stack exchange,提问作者chingis

火山引擎 最新活动