Linux下构建 uniapp h5/web 应用问题处理
执行npm install && npm run build:h5-dev
过程报错问题,记录分享
最终成功构建。
一、找不到 node-sass-china 、 less 模块
⠹ 开始编译当前项目至 h5 平台...
ERROR Failed to compile with 2 errors 15:21:24
error in /opt/frontend/h5/App.vue?vue&type=style&index=1&lang=scss&
Syntax Error: Error: Cannot find module '/usr/local/compile-node-sass/node_modules/node-sass-china'
Syntax Error: Error: Cannot find module '/usr/local/compile-node-sass/node_modules/node-sass-china'
Require stack:
- /usr/local/uniapp-cli/node_modules/@dcloudio/vue-cli-plugin-uni/packages/sass-loader/dist/getDefaultSassImplementation.js
...
...
...
error in /opt/frontend/h5/pages/question/question.vue?vue&type=style&index=0&id=315c7946&lang=less&scoped=true&
Syntax Error: Error: Cannot find module '/usr/local/compile-less/node_modules/less'
Require stack:
- /usr/local/uniapp-cli/node_modules/less-loader/dist/index.js
...
...
首先检查版本号是否对应
解决方案1:
- 检查项目中是否已安装node-sass-china
[root@ h5]# npm ls node-sass-china
sass@0.0.1-2019021317 /opt/frontend/h5
└── node-sass-china@4.7.2
将node_modules中的node-sass文件夹内容拷贝到目标目录
cp -r node_modules/node-sass/* /usr/local/compile-node-sass/node_modules/node-sass-china
- 检查项目中是否已安装 less
[root@ h5]# npm ls less
xxxx@1.0.0 /opt/frontend/h5
└── less@4.1.3
将node_modules中的less文件夹内容拷贝到目标目录
cp -r node_modules/node-sass/* /usr/local/compile-less/node_modules/less
解决方案2:
参考文章 https://ask.dcloud.net.cn/article/35468
下载文章中compile-node-sass.zip
安装包(需要登录dcloud账号,浏览器打开直接下载) https://ask.dcloud.net.cn/file/download/file_name-Y29tcGlsZS1ub2RlLXNhc3Muemlw__url-Ly9hc2suZGNsb3VkLm5ldC5jbi91cGxvYWRzL2FydGljbGUvMjAxOTAyMTQvZmIyZTFkYjdjODI1ZWQ0ZjZjMWU5ODM1Zjg1YWZjNGI=
解压到目标文件夹 /usr/local/compile-node-sass
二、错误binding.node
缺失
[root@node180 h5]# npm run build:h5-dev
> answer@1.0.0 build:h5-dev
> INIT_CWD=`pwd` && cd /usr/local/uniapp-cli && cross-env UNI_INPUT_DIR=$INIT_CWD/ UNI_OUTPUT_DIR=$INIT_CWD/unpackage/dist/build/h5 UNI_PLATFORM=h5 NODE_ENV=dev node /usr/local/uniapp-cli/bin/uniapp-cli.js
请注意运行模式下,因日志输出、sourcemap以及未压缩源码等原因,性能和包体积,均不及发行模式。
⠏ 开始编译当前项目至 h5 平台...--> LibSass 的二进制文件(/usr/local/compile-node-sass/node_modules/node-sass-china/vendor/linux-x64-93/binding.node)缺失,请执行下面3条命令下载对应版本的二进制文件:(有可能引发此错误的原因是 Node 版本变更)
mkdir -p /usr/local/compile-node-sass/node_modules/node-sass-china/vendor/linux-x64-93
cd /usr/local/compile-node-sass/node_modules/node-sass-china/vendor/linux-x64-93
curl -o binding.node http://cdn.npm.taobao.org/dist/node-sass/v4.7.2/linux-x64-93_binding.node
--> MacOS 、Unix/Linux 请根据权限使用 sudo
按照要求执行三句命令后报错
ERROR Failed to compile with 1 error 12:05:56
error in /opt/frontend/h5/App.vue?vue&type=style&index=1&lang=scss&
Syntax Error: Error: /usr/local/compile-node-sass/node_modules/node-sass-china/vendor/linux-x64-93/binding.node: invalid ELF header
发现下载后的 binding.node 文件内容为空,说明这个URL路径无效。
查看本地安装node-sass版本号
[root@ h5]# npm ls node-sass
xxxx@1.0.0 /opt/frontend/h5
└── node-sass@6.0.1
找到对应版本号的文件并下载到对应文件夹
curl -o binding.node https://registry.npmmirror.com/binary.html?path=node-sass/v6.0.1/linux-x64-93_binding.node
三、错误make: g++: Command not found
make: g++: Command not found
make: *** [Release/obj.target/libsass/src/libsass/src/ast.o] Error 127
make: Leaving directory `/usr/local/uniapp-cli/node_modules/.store/node-sass-china@4.13.1/node_modules/node-sass-china/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/uniapp-cli/node_modules/.store/node-gyp@3.8.0/node_modules/node-gyp/lib/build.js:262:23)
安装 gcc、g++、make工具
yum -y install gcc gcc-c++ kernel-devel && yum -y install make
四、错误g++: 错误:unrecognized command line option ‘-std=gnu++14’
⠦ [2/3] Installing true-case-path@^1.0.2
g++: 错误:unrecognized command line option ‘-std=gnu++14’
make: *** [Release/obj.target/libsass/src/libsass/src/ast.o] 错误 1
make: 离开目录“/usr/local/uniapp-cli/node_modules/.store/node-sass-china@4.13.1/node_modules/node-sass-china/build”
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/uniapp-cli/node_modules/.store/node-gyp@3.8.0/node_modules/node-gyp/lib/build.js:262:23)
查看g++版本过低,-std=c++14需要g++5.2以上,而centos默认的g++只有4.8.5
[root@ uniapp-cli]# g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
- 安装scl工具(解决检索不到devtool高版本问题)
按顺序安装centos-release-scl-rh 、centos-release-scl
yum -y install centos-release-scl-rh && yum -y install centos-release-scl
输入scl,可以看到输出:“Need at least 3 arguments.Run scl --help to get help.”说明scl被装好了。
- 增加安装devtool版本
yum search gcc
或者yum list |grep gcc
看是否有devtoolset-7-gcc、devtoolset-7-gcc-c++.x86_64 等依赖包可供选择.
选择安装devtoolset-7-gcc-c++.x86_64
以及devtoolset-7-gcc.x86_64
命令行输入:scl enable devtoolset-7 bash
即可切换GCC至7.3.1版本
检查安装结果
[root@ frontend]# g++ --version
g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
Copyright (C) 2017 Free Software Foundation, Inc
另:安装uniapp-cli,参考原文链接
在windows的系统上打开HBuilderX的安装目录
然后进入plugins/uniapp-cli(我的路径是D:\Program Files\HBuilderX\plugins\uniapp-cli)目录,将该文件下的文件拷贝到Linux主机上 (不需要拷贝node_modules目录和package-lock.json文件)
然后在Linux上打开uniapp-cli的目录执行cnpm install,耐心等待安装完成
如有需要可以安装下less和node-sass-china,命令 cnpm install bcrypt less node-sass-china --save,其中安装node-sass-china需要编译(需要安装make,gcc,g++等)耗时比较久,如果安装过程中出现下载错误则执行以下命令
Copymkdir -p /var/tools/uniapp-cli/node_modules/_node-sass-china@4.13.1@node-sass-china/vendor/linux-x64-83
cd /var/tools/uniapp-cli/node_modules/_node-sass-china@4.13.1@node-sass-china/vendor/linux-x64-83
curl -o binding.node http://cdn.npm.taobao.org/dist/node-sass/v4.13.1/linux-x64-83_binding.node
如果出现以下错误Binary has a problem: Error: /var/tools/uniapp-cli/node_modules/_node-sass-china@4.13.1@node-sass-china/vendor/linux-x64-83/binding.node: invalid ELF header
则需要安装apt install python-snappy(ubuntu,debian)或者cnpm install bcrypt --save(centos),bcrypt 安装到uniapp-cli下,如果还是不可以,删除 node_modules 之后多尝试看看直至成功。
此时还需要注意,如果报错Syntax Error: Error: Cannot find module '/var/tools/compile-node-sass/node_modules/node-sass-china'
还需要构建两个软连接
Copyln -s /var/tools/uniapp-cli/ /var/tools/compile-node-sass
ln -s /var/tools/uniapp-cli/ /var/tools/compile-less