npm install on synology 给出 zlib 无效距离错误
npm install on synology gives zlib invalid distance error
虽然这还不理想,但我们目前 运行 通过 synology 构建脚本。构建的一部分当然是安装所有包。然而在这一点上发生了很多错误。
我们安装使用:
npm ci --only=production
(尽管与 npm install
的结果相同)。并出现以下错误:
npm WARN tar zlib: invalid distance too far back
(像很多很多次一样)在某处跟随着:
291 verbose stack ZlibError: zlib: invalid distance too far back
291 verbose stack at Unzip.write (/usr/local/lib/node_modules/npm/node_modules/minizlib/index.js:147:22)
291 verbose stack at Unpack.write (/usr/local/lib/node_modules/npm/node_modules/tar/lib/parse.js:313:19)
291 verbose stack at PassThrough.ondata (_stream_readable.js:727:22)
291 verbose stack at PassThrough.emit (events.js:210:5)
291 verbose stack at addChunk (_stream_readable.js:309:12)
291 verbose stack at readableAddChunk (_stream_readable.js:290:11)
291 verbose stack at PassThrough.Readable.push (_stream_readable.js:224:10)
291 verbose stack at PassThrough.Transform.push (_stream_transform.js:150:32)
291 verbose stack at PassThrough.afterTransform (_stream_transform.js:94:10)
291 verbose stack at PassThrough._transform (_stream_passthrough.js:44:3)
291 verbose stack at PassThrough.Transform._read (_stream_transform.js:189:10)
291 verbose stack at PassThrough.Transform._write (_stream_transform.js:177:12)
291 verbose stack at doWrite (_stream_writable.js:431:12)
291 verbose stack at writeOrBuffer (_stream_writable.js:415:5)
291 verbose stack at PassThrough.Writable.write (_stream_writable.js:305:11)
291 verbose stack at PassThrough.ondata (_stream_readable.js:727:22)
292 verbose cwd /volume1/docker/builder/dockers/allsports.app/allsports.app.nginx/javascript
293 verbose Linux 3.10.105
294 verbose argv "/volume1/@appstore/Node.js_v12/usr/local/bin/node" "/usr/local/bin/npm" "ci"
295 verbose node v12.14.0
296 verbose npm v6.13.4
297 error code Z_DATA_ERROR
298 error errno -3
299 error zlib: invalid distance too far back
300 verbose exit [ -3, true ]
从日志中可以看出,我是 synology 使用节点 12.14 和 npm 6.13。我已经在自己的电脑上使用完全相同的版本进行了测试,并且运行流畅。
这是什么原因造成的,可以修复吗?
系统 Zlib 1.2.8(包含在 Synology 当前版本的 DSM 中)不能与节点 v12 或 v10 中的 npm 一起使用,如 https://github.com/nodejs/node/issues/22839#issuecomment-474484250
所述
Synology 的早期版本的 Node(例如 v8)没有这个问题,npm 工作正常。我只是 运行 遇到了这个错误(npm 不能做 任何事情 有用)在我的 Synology 上使用 Node v12 并退回到 Node v8 确实使问题消失了。
一个选择可能是使用 Entware 从源代码构建一个更新的 zlib,但我读到 Synology 支持甚至拒绝接触带有 ipkg/Optware/Entware 的系统。 changelog for Zlib 表示 1.2.9 中的一些可移植性改进,但我不确定仅替换系统 zlib 是否会导致系统上其他软件出现问题。
总的来说,如果您的构建脚本可以处理 Node 8(不幸的是它刚刚停产),我会暂时坚持使用它。否则 official/supported 答案大概是等待 Synology 对 DSM 的更新。
所以我将 1.2.8 zlib 替换为 1.2.11,然后 npm 现在可以工作了。
我用的是entware的libz.so.1.2.11,但是entware只安装在/opt/lib所以我复制到/lib
rm /lib/libz.so.1.2.8
rm /lib/libz.so.1
rm /lib/libz.so
cp /opt/lib/libz.so.1.2.11 /lib/
chmod +x /lib/libz.so.1.2.11
ln -s /lib/libz.so.1.2.11 /lib/libz.so.1
ln -s /lib/libz.so.1.2.11 /lib/libz.so
我从来没有升级过 DSM,所以我认为应该没问题。
临时切换节点版本有帮助吗?如果您安装了 V12 和 V8 软件包,这将起作用。
sudo -i
nvm ls # all installed versions
nvm set 8.9.4
node --version
npm --version
# do things with v8
nvm set 12.14.0
不幸的是,我不允许发表评论,所以@StonyBoy:您可以从 entware 中复制 zlib,例如至 /volume1/etc/lib 然后使用脚本启动 npm:
#!/bin/bash
LD_LIBRARY_PATH=/volume1/etc/lib:/usr/local/lib:/usr/lib:/lib:/lib/security
export LD_LIBRARY_PATH
exec /usr/local/bin/npm $@
这避免了那些烦人的重新安装...
更改位于 /lib 或 /usr/lib 中的库非常危险(在我的系统上也是如此)。我做到了,但它无法启动我的 Synology。需要恢复固件,让我很费心......
不幸的是,自从固件更新后,entware 库停止在我的 Synology RS816(MARVELL Armada 385 88F6820,armv7l)上工作(我不确定是哪个,现在我有 6.2.3-25426)。如果我尝试 运行 npm 我得到
error while loading shared libraries: /opt/lib/libz.so.1: internal error
不确定,但我认为这是因为 libz 不是静态链接并使用 /opt/lib/libc.so.6,这会以某种方式破坏它。
所以我搜索了另一个 libz.so.1.2.11 并在
optware-ng,将其复制到 /usr/local/lib 并制作了一个新的 npm 脚本。在我的 RS816 上,npm 位于 /usr/local/bin
并链接到 ../lib/node_modules/npm/bin/npm-cli.js
。新的 npm 脚本类似于 (Kein Admin),看起来像这样:
#!/bin/sh
# fix npm WARN tar zlib: invalid distance too far back
# using libz 1.2.11 from optware-ng located at /usr/local/lib
export LD_LIBRARY_PATH=/usr/local/lib:/lib
/usr/local/lib/node_modules/npm/bin/npm-cli.js $@
虽然这还不理想,但我们目前 运行 通过 synology 构建脚本。构建的一部分当然是安装所有包。然而在这一点上发生了很多错误。
我们安装使用:
npm ci --only=production
(尽管与 npm install
的结果相同)。并出现以下错误:
npm WARN tar zlib: invalid distance too far back
(像很多很多次一样)在某处跟随着:
291 verbose stack ZlibError: zlib: invalid distance too far back
291 verbose stack at Unzip.write (/usr/local/lib/node_modules/npm/node_modules/minizlib/index.js:147:22)
291 verbose stack at Unpack.write (/usr/local/lib/node_modules/npm/node_modules/tar/lib/parse.js:313:19)
291 verbose stack at PassThrough.ondata (_stream_readable.js:727:22)
291 verbose stack at PassThrough.emit (events.js:210:5)
291 verbose stack at addChunk (_stream_readable.js:309:12)
291 verbose stack at readableAddChunk (_stream_readable.js:290:11)
291 verbose stack at PassThrough.Readable.push (_stream_readable.js:224:10)
291 verbose stack at PassThrough.Transform.push (_stream_transform.js:150:32)
291 verbose stack at PassThrough.afterTransform (_stream_transform.js:94:10)
291 verbose stack at PassThrough._transform (_stream_passthrough.js:44:3)
291 verbose stack at PassThrough.Transform._read (_stream_transform.js:189:10)
291 verbose stack at PassThrough.Transform._write (_stream_transform.js:177:12)
291 verbose stack at doWrite (_stream_writable.js:431:12)
291 verbose stack at writeOrBuffer (_stream_writable.js:415:5)
291 verbose stack at PassThrough.Writable.write (_stream_writable.js:305:11)
291 verbose stack at PassThrough.ondata (_stream_readable.js:727:22)
292 verbose cwd /volume1/docker/builder/dockers/allsports.app/allsports.app.nginx/javascript
293 verbose Linux 3.10.105
294 verbose argv "/volume1/@appstore/Node.js_v12/usr/local/bin/node" "/usr/local/bin/npm" "ci"
295 verbose node v12.14.0
296 verbose npm v6.13.4
297 error code Z_DATA_ERROR
298 error errno -3
299 error zlib: invalid distance too far back
300 verbose exit [ -3, true ]
从日志中可以看出,我是 synology 使用节点 12.14 和 npm 6.13。我已经在自己的电脑上使用完全相同的版本进行了测试,并且运行流畅。
这是什么原因造成的,可以修复吗?
系统 Zlib 1.2.8(包含在 Synology 当前版本的 DSM 中)不能与节点 v12 或 v10 中的 npm 一起使用,如 https://github.com/nodejs/node/issues/22839#issuecomment-474484250
所述Synology 的早期版本的 Node(例如 v8)没有这个问题,npm 工作正常。我只是 运行 遇到了这个错误(npm 不能做 任何事情 有用)在我的 Synology 上使用 Node v12 并退回到 Node v8 确实使问题消失了。
一个选择可能是使用 Entware 从源代码构建一个更新的 zlib,但我读到 Synology 支持甚至拒绝接触带有 ipkg/Optware/Entware 的系统。 changelog for Zlib 表示 1.2.9 中的一些可移植性改进,但我不确定仅替换系统 zlib 是否会导致系统上其他软件出现问题。
总的来说,如果您的构建脚本可以处理 Node 8(不幸的是它刚刚停产),我会暂时坚持使用它。否则 official/supported 答案大概是等待 Synology 对 DSM 的更新。
所以我将 1.2.8 zlib 替换为 1.2.11,然后 npm 现在可以工作了。
我用的是entware的libz.so.1.2.11,但是entware只安装在/opt/lib所以我复制到/lib
rm /lib/libz.so.1.2.8
rm /lib/libz.so.1
rm /lib/libz.so
cp /opt/lib/libz.so.1.2.11 /lib/
chmod +x /lib/libz.so.1.2.11
ln -s /lib/libz.so.1.2.11 /lib/libz.so.1
ln -s /lib/libz.so.1.2.11 /lib/libz.so
我从来没有升级过 DSM,所以我认为应该没问题。
临时切换节点版本有帮助吗?如果您安装了 V12 和 V8 软件包,这将起作用。
sudo -i
nvm ls # all installed versions
nvm set 8.9.4
node --version
npm --version
# do things with v8
nvm set 12.14.0
不幸的是,我不允许发表评论,所以@StonyBoy:您可以从 entware 中复制 zlib,例如至 /volume1/etc/lib 然后使用脚本启动 npm:
#!/bin/bash
LD_LIBRARY_PATH=/volume1/etc/lib:/usr/local/lib:/usr/lib:/lib:/lib/security
export LD_LIBRARY_PATH
exec /usr/local/bin/npm $@
这避免了那些烦人的重新安装...
更改位于 /lib 或 /usr/lib 中的库非常危险(在我的系统上也是如此)。我做到了,但它无法启动我的 Synology。需要恢复固件,让我很费心......
不幸的是,自从固件更新后,entware 库停止在我的 Synology RS816(MARVELL Armada 385 88F6820,armv7l)上工作(我不确定是哪个,现在我有 6.2.3-25426)。如果我尝试 运行 npm 我得到
error while loading shared libraries: /opt/lib/libz.so.1: internal error
不确定,但我认为这是因为 libz 不是静态链接并使用 /opt/lib/libc.so.6,这会以某种方式破坏它。
所以我搜索了另一个 libz.so.1.2.11 并在
optware-ng,将其复制到 /usr/local/lib 并制作了一个新的 npm 脚本。在我的 RS816 上,npm 位于 /usr/local/bin
并链接到 ../lib/node_modules/npm/bin/npm-cli.js
。新的 npm 脚本类似于 (Kein Admin),看起来像这样:
#!/bin/sh
# fix npm WARN tar zlib: invalid distance too far back
# using libz 1.2.11 from optware-ng located at /usr/local/lib
export LD_LIBRARY_PATH=/usr/local/lib:/lib
/usr/local/lib/node_modules/npm/bin/npm-cli.js $@