为什么node-sass总是安装失败?

来源:http://www.chinese-glasses.com 作者:Web前端 人气:135 发布时间:2020-04-07
摘要:时间: 2019-10-14阅读: 197标签: sass [原文] http://www.th7.cn/web/js/201511/135415.shtml node-sass是我们开发中很常见的依赖包,也是安装时间冗长和最常见到报错的依赖。安装node-sass失败原因有很多种

时间: 2019-10-14阅读: 197标签: sass

[原文] http://www.th7.cn/web/js/201511/135415.shtml

node-sass是我们开发中很常见的依赖包,也是安装时间冗长和最常见到报错的依赖。安装node-sass失败原因有很多种,我们在说失败原因之前,先来分析一下node-sass的安装过程(以下node版本为v10.15.3):

如果你正在构建一个基于 gulp 的前端自动化开发环境,那么极有可能会用到 gulp-sass ,由于网络原因你可能会安装失败,因为安装过程中部分细节会到亚马逊云服务器上获取文件。本文主要讨论在不变更网络环境的前提下安装 gulp-sass / node-sass 。

PS D:demo npm i node-sass// 从npm源安装到node_modules node-sass@4.13.0 install D:demonode_modulesnode-sass node scripts/install.js// 下载binding.nodeDownloading binary from -sass/releases/download/v4.13.0/win32-x64-64_binding.nodeDownload complete .] - :Binary saved to D:demonode_modulesnode-sassvendorwin32-x64-64binding.node// 缓存binding.nodeCaching binary to C:UsersleepiAppDataRoamingnpm-cachenode-sass4.13.0win32-x64-64_binding.node node-sass@4.13.0 postinstall D:demonode_modulesnode-sass node scripts/build.jsBinary found at D:demonode_modulesnode-sassvendorwin32-x64-64binding.nodeTesting binaryBinary is fine// 写package-lock.jsonnpm notice created a lockfile as package-lock.json. You should commit this file.npm WARN demo@1.0.0 No descriptionnpm WARN demo@1.0.0 No repository field.+ node-sass@4.13.0added 174 packages from 138 contributors and audited 529 packages in 24.379sfound 0 vulnerabilities

问题描述


我们可以看到,安装node-sass有几个步骤:

执行 npm install 安装软件包 gulp-sass

$ npm install gulp-sass

这个过程中会先安装 node-sass ,因为 gulp-sass 依赖于 node-sass 。中间出现的错误信息类似下面这样:

Cannot download https://github.com/sass/node-sass/releases/download/v3.4.2/win32-x64-46_binding.nodeHint: If github.com is not accessible in your locationtry setting a proxy via HTTP_PROXY, e.g. export HTTP_PROXY=http://example.com:1234or configure npm proxy vianpm config set proxy http://example.com:8080'

校验本地node_modules中是否已安装node-sass,版本是否一致;如未安装或版本不符,从npm源安装node-sass本体;检测全局缓存和本地中是否有binding.node,如有即跳过安装;没有binding.node则从github下载该二进制文件并将其缓存到全局;假如binding.node下载失败,则尝试本地编译出该文件;将版本信息写到package-lock.json;

处理思路


由此看到,实际上node-sass依赖了一个二进制文件binding.node,从npm源安装完本体后还会从github下载binding.node。

看现象很有可能是这些二进制文件使用了 GitHub 的 lfs 服务,而 lfs 使用的是亚马逊云,由于网络原因,这些服务器无法访问。

现在解决问题的办法思路就很清晰了,下载源码自己编译一个这样的二进制文件,或下载官方的二进制文件。只要解决该文件的下载问题就可以继续往后安装。

打开 github 看一下该项目 https://github.com/sass/node-sass,在 releases 页面能找到下失败的文件 win32-x64-46_binding.node ,这里还可以下载到 source code,下载后里头有 C++ 项目 使用 visualstudio2015 自己编译一个就可以了。
同时,在 https://github.com/sass 下,还发现一个名字叫 node-sass-binaries 的项目,这里头其实也有刚才的那个二进制文件,并且这里的是可以直接下载的(貌似没使用 lfs)。

我不想自找麻烦,所以下面说一下直接使用该项目中的二进制文件进行安装 node-sass 过程。

操作
npm 是一个功能超级强悍的工具,安装一个软件包的方式也当然不仅仅是 npm install packagename 这一种方式,当然这是最快捷的使用公共软件包的安装方式。
首先到官网(https://github.com/sass/node-sass/releases)下载 node-sass 项目源码,下载后解压至相应的 node_modules 目录中。
接下来,打开 package.json 文件,检查 script 字段

"scripts": { "coverage": "node scripts/coverage.js", "install": "node scripts/install.js", "postinstall": "node scripts/build.js", "pretest": "node_modules/.bin/jshint bin lib scripts test", "test": "node_modules/.bin/mocha test" },

打开 install 字段对应的文件 scripts/install.js,可以看到 checkAndDownloadBinary() 在下载这个二进制文件,URL使用的是 process.sass.binaryUrl,我们可以直接在这里覆盖这个变量,把改地址修改为上面提到的那个能够下载的二进制文件地址。
download(process.sass.binaryUrl, process.sass.binaryPath, function(err) { ....}
或者,找出上面提到的 sass.binaryUrl() 方法,打开 ../lib/extensions.js 文件,大约108行左右,修改为如下样子即可

function getBinaryUrl() { var site = flags['--sass-binary-site'] || process.env.SASS_BINARY_SITE || process.env.npm_config_sass_binary_site || (pkg.nodeSassConfig && pkg.nodeSassConfig.binarySite) || 'https://github.com/sass/node-sass/releases/download'; //return [site, 'v' + pkg.version, sass.binaryName].join('/'); return 'https://github.com/sass/node-sass-binaries/blob/master/win32-x64-46_binding.node';}

因此安装node-sass相关的失败原因有以下几种:

重新安装


进入node-sass 项目根目录执行 install 命令:

$ cd node_modules/node-sass$ npm install 

如果不出意外,这个安装过程很快就会结束。
node-sass 安装完成后,gulp-sass 的依赖问题也就解决了,然后跳出去 node_modules 目录继续安装 gulp 。

$ cd ../..npm install gulp-sass

原因一: npm源速度慢

由于众所周知的国内网络环境,从国内安装官方源的依赖包会很慢。可以将npm源设置成国内镜像源(如淘宝npm):

npm config set registry 

或者通过.npmrc文件设置:

// .npmrcregistry=

原因二: binding.node源无法访问或速度慢

node-sass除了npm部分的代码,还会下载二进制文件binding.node,默认源是github,国内访问较慢,特殊时期甚至无法访问。我们也可以将其改成国内源:

// linux、mac 下SASS_BINARY_SITE=-sass/ npm install node-sass// window 下set SASS_BINARY_SITE=-sass/  npm install node-sass

或者通过.npmrc文件设置:

// .npmrcsass_binary_site=-sass/

有类似问题的还有chromedriver,phantomjs,electron等常见依赖包,我们可以一并写到.npmrc中:

// .npmrcsass_binary_site=-sasschromedriver_cdnurl=_cdnurl=_mirror=

本文由10bet发布于Web前端,转载请注明出处:为什么node-sass总是安装失败?

关键词:

上一篇:没有了

下一篇:HTML 标签的 for 属性

最火资讯