V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
bianjp
V2EX  ›  JavaScript

淘宝 NPM 源竟然会篡改包的下载版本

  •  2
     
  •   bianjp · 5 天前 · 5248 次点击

    淘宝源擅自把 path-to-regexp 1.8.0 版本的下载地址改成了 1.9.0 版本,导致使用了 package-lock.json, yarn.lock 的工程安装依赖失败( checksum 校验失败)。

    https://i.imgur.com/kJbQ1hZ.png

    好像是这里引入的: https://github.com/cnpm/bug-versions/pull/257/files

    虽然是出于安全考虑,但这样篡改下载地址却影响了存量的 CICD 流程,给开发者造成不便,也破坏了与 NPM 官方源的兼容性(不能自由切换 NPM 源了)。

    一直以为淘宝源是官方源的纯净代理呢,没想到竟会做这样的事,看来要慎用了。

    同事说用腾讯云、华为云的 NPM 源也遇到过一些坑,看来想找个靠谱的国内 NPM 代理都不容易(前端圈这是怎么了?)。

    中科大镜像站有个 NPM 源的反向代理(https://npmreg.proxy.ustclug.org),似乎是比较纯净的,准备试用下。

    第 1 条附言  ·  5 天前
    这个问题还有点奇怪,实际上 package-lock.json 中存储了完整的下载地址,应该不受 NPM 源修改下载地址影响,但确实有些构建流程报了 checksum 校验失败。除非是 1.8.0 的下载地址返回了 1.9.0 的文件内容,现在不能复现,下次遇到我再分析下。
    第 2 条附言  ·  5 天前
    找到问题了,有些工程中只有 yarn.lock, 没有 package-lock.json, 但在 CICD 中却使用 npm 安装依赖(可能是因为以前 CICD 容器未预装 yarn ),而 npm 只会使用 yarn.lock 中的 checksum, 但不会使用里面的下载地址,所以下载到了新版本,跟旧的 checksum 比对自然不一致。

    这事开发者的责任更大。
    33 条回复    2024-09-13 13:16:07 +08:00
    shakukansp
        1
    shakukansp  
       5 天前
    一直是代理连官方源
    weixind
        2
    weixind  
       5 天前
    真难伺候。
    dejavuwind
        3
    dejavuwind  
       5 天前   ❤️ 1
    没事儿别碰国内这些大厂
    dif
        4
    dif  
       5 天前   ❤️ 5
    打开代理,去掉各种第三方源。一样丝滑。
    国内程序员必修课,佛跳墙。
    bianjp
        5
    bianjp  
    OP
       5 天前
    开发者本地翻墙没问题,但是公司的 CICD 服务器、NPM 私服都部署在内网服务器上,且不允许翻墙,所以只能找个国内的 NPM 代理。
    Mithril
        6
    Mithril  
       5 天前
    你的 CICD 直连外网拉包么。。。
    正常情况下 CICD 应该只用内网缓存过的二进制,这样才能保证你产品的安全,出了问题也可追溯。
    特别是 NPM 这种一大把前科的东西。

    只从缓存取的话,应该不会有问题的。
    Melting
        7
    Melting  
       5 天前   ❤️ 2
    确实 [email protected] 是一个 bug version ,但是也不应该有 npm 源来进行纠错
    mercury233
        8
    mercury233  
       5 天前   ❤️ 1
    合理一点的做法是默认不允许安装,加参数强制安装,默认替换是什么操作
    billlee
        9
    billlee  
       5 天前   ❤️ 1
    他们是给自己开发的,只是顺便公开出来给大家用一下
    webbillion
        10
    webbillion  
       5 天前   ❤️ 4
    赞同 9 楼,镜像源这个东西你不用他们好像没任何损失
    Hyperion
        11
    Hyperion  
       5 天前   ❤️ 2
    其实关键并不是 npminstall 的这个提交,可能、应该、也许出发点是好的
    https://github.com/cnpm/npminstall/pull/256

    但在全局引入这种污染行为,是在 cnpmcore 的这个提交
    https://github.com/cnpm/cnpmcore/commit/a309edfa2e4a34d2a96fe36ffadea13e60f453ba

    也就是在这个提交之后,bug-version 扩散到了整个镜像源

    觉得没有问题的,多半应该也是不会看命令行 warning ,装不了删删 lock 对不对啊,那也就无所谓了嘛对不对啊

    反正之前 bun 的 pr 里 cnpm 相关讨论看下来,维护者对这种操作还挺自豪的

    所以,cnpm 是顺便给国内开发者用的这个定义应该是不会错的,这就不是个正经源

    部署还是封装成 docker 整个扔上去算了
    andyskaura
        12
    andyskaura  
       5 天前
    这种时候就需要赛博大善人出马了。 dockerhub 和 npm 都可以用 cf worker
    yuhuai
        13
    yuhuai  
       5 天前
    我建议是设置下.npmrc ,下载你需要的包上传到内网的包管理服务器,例如 gitea 的包管理或者 Nexus,然后替换你本地的引入
    bianjp
        14
    bianjp  
    OP
       5 天前
    @Mithril CICD 使用内网 NPM 私服,但私服只缓存二进制文件,仍会实时(或只缓存一小段时间)从上游 NPM 源获取包的 metadata 信息。
    bianjp
        15
    bianjp  
    OP
       5 天前
    @yuhuai NPM 包数量太多了,手动上传不可行,只能搞代理 + 缓存。
    swim2sun
        16
    swim2sun  
       5 天前
    可以理解 op 的状况,本地开发还好,CI 很多情况下是不能用代理的,就算能用代理 下载速度也是没法跟用国内镜像源相比

    希望 op 测试出好用的镜像源后能跟大家分享一下
    xiaozhenga
        17
    xiaozhenga  
       5 天前
    只能换新的镜像源了
    LaoChen
        18
    LaoChen  
       5 天前
    大开眼界
    herozzm
        19
    herozzm  
       5 天前
    之前国内的 docker 仓库也会存在这些问题
    kongkx
        20
    kongkx  
       5 天前 via iPhone
    让公司在外网做一个 npm 私服穿墙,然后内网私服连外网私服, 🐶
    lyxxxh2
        21
    lyxxxh2  
       5 天前
    很久没用过国内镜像了。
    pip npm composer go 通通走代理。
    速度比国内镜像还快,也各种奇葩的网络小问题。

    ps: 公司电脑内网服务器:
    export http_proxy=http://192.168.50.30:7890
    export https_proxy=http://192.168.50.30:7890

    外网服务器没辙,装代理客户端麻烦。
    lyxxxh2
        22
    lyxxxh2  
       5 天前
    @lyxxxh2
    速度比国内镜像还快,也没各种奇葩的网络小问题。
    IvanLi127
        23
    IvanLi127  
       5 天前
    我一直以为淘宝源有 bug ,一直很抵触用淘宝源,原来是我错怪他了🤭原来不是镜像源呀
    unco020511
        24
    unco020511  
       5 天前
    你们公司内部没有代理镜像吗?
    shiny
        25
    shiny  
       5 天前   ❤️ 1
    之前本来 bun 要默认使用淘宝镜像,也是因为会替换版本所以没有上。
    https://github.com/oven-sh/bun/pull/12936#issuecomment-2265147603

    > npmmirror has a BugVersionService which will replace the manifest of version A (which has bugs) with version B (fixed version). This mechanism will cause the integrity inconsistency between npmmirror and other registries.
    wheat0r
        26
    wheat0r  
       5 天前
    @bianjp #5 自己搭代理呗
    LLaMA2
        27
    LLaMA2  
       5 天前
    CICD 不能用外网也没什么大问题,

    开发时使用在线源,推到线上版本全部都是用 tgz 的本地包,

    依赖库包 tgz 文件全部推送到代码仓库.不使用在线安装就不用担心连不上 npm 源了
    kilvn
        28
    kilvn  
       5 天前
    @lyxxxh2 #21 那可太简单了,外网服务器用 docker 起个 client 容器,直接走容器的端口不就好了,环境隔离没风险。
    BaiLinfeng
        29
    BaiLinfeng  
       5 天前
    居然没看懂,啥情况?
    Vegetable
        30
    Vegetable  
       5 天前
    @shiny 真就是负负得正了,bun 这个改动也是骂声一片,现在好了。
    Rorysky
        31
    Rorysky  
       5 天前
    @lyxxxh2 我全部用清华源 os/语言/库...
    vishun
        32
    vishun  
       4 天前
    我去,这你么一个镜像随便改源的东西,还从来没有告知过,简直有病啊。
    更好的方法是提供一个正常镜像地址,一个 bug 修复镜像地址,如果只提供 bug 修复镜像地址,也应该在官网明确告知啊。
    lyxxxh2
        33
    lyxxxh2  
       4 天前
    @Rorysky
    composer go pip 那些还好。
    npm 就很不省心,镜像了,但又没完全镜像。
    之前下载公司项目,cnpm 和换源总是网络超时。
    后面直接 npm set proxy,就没操过这种心了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:47 · PVG 06:47 · LAX 15:47 · JFK 18:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.