重新创建前一个日期的yarn.lock

问题描述 投票:0回答:1

如果不存在

yarn.lock
并且执行
yarn install
,则会使用所有依赖项的
当前最新可用版本
创建新的 yarn.lock(与
package.json
中注明的版本兼容)。

有没有办法重新创建在某个时间点生成的

yarn.lock

一个例子: 假设

package.json
只有一个依赖项 fig-components:

{
  "name": "test",    
  "version": "0.1.0",
  "dependencies": {
    "fig-components": "^1.0.0"
  }
}

此依赖项在过去 30 天内已频繁更新

{
    "created": "2023-12-05T15:53:53.991Z",
    "1.0.0": "2023-12-05T15:53:54.330Z",
    "1.0.1": "2023-12-06T16:04:37.170Z",
    "1.0.2": "2023-12-24T12:37:30.628Z",
    "1.0.3": "2023-12-24T12:53:59.037Z",
    "1.0.4": "2023-12-25T14:15:10.609Z",
    "1.0.5": "2023-12-30T02:32:15.320Z",
    "1.0.6": "2023-12-30T06:26:59.997Z",
    "1.0.7": "2024-01-03T15:18:26.959Z",
    "1.0.8": "2024-01-04T16:03:12.958Z"
}

如果我在 2023 年 12 月 31 日创建了我的

yarn.lock
,我会在锁定文件中获得版本 1.0.6。如果我今天 (2024-01-04) 创建该文件,我会得到版本 1.0.8。这是预期的行为。

有没有办法在今天创建

yarn.lock
,但只能使用 2023 年 12 月 31 日提供的版本?

我为什么要这样做?我想重现以前发生但现在不再重现的错误。前一个

yarn.lock
尚未提交到回购。我想避免在发现错误的较早日期在大型项目中手动查找和设置所有版本。

javascript yarnpkg
1个回答
0
投票

使用从包信息响应中删除较新版本的代理

遵循 Ry想法,使用 addonmitmproxy 会从注册表发送的元数据中删除在固定日期之后创建的包的所有包信息。

1.中间人插件

插件确保注册表始终发送包含 time 属性的包元数据的

长版本
。然后它会从
maxdate
之后创建的响应中过滤掉所有版本。

from mitmproxy import http
import json 

def request(flow: http.HTTPFlow):
    # yarn will send the type 'application/vnd.npm.install-v1+json' 
    # that does not contain the 'time' information
    flow.request.headers["Accept"] = "application/json"

def response(flow: http.HTTPFlow):
    assert flow.response

    if flow.response.headers["Content-Type"] == "application/json":
        pkg = json.loads(flow.response.content)
                
        # only load versions before maxdate
        maxdate = '2023-06-30T06:26:59.997Z' 

        # get all versions that have been created after maxdate (ignoring timezones...)
        versions_to_delete = {v for (v,t) in pkg['time'].items() if t >= maxdate } 

        # delete the versions that are too new
        for v in versions_to_delete:
            if v in pkg['versions'].keys():
                del pkg['versions'][v]

        # delete the the time information
        del pkg['time']

        # update the information about the latest version
        pkg['dist-tags']['latest'] = max(pkg['versions'].keys())

        flow.response.text = json.dumps(pkg)

2.启动mitm代理

使用 docker 版本的 mitm 并以卷的形式提供插件代码。

docker run --rm -it -p 1234:8080 --name mitm \
  -v ./plugin.py:/tmp/plugin.py \
  mitmproxy/mitmproxy mitmproxy -s /tmp/plugin.py

3.纱线配置

告诉yarn使用端口1234上的代理。由于代理使用自己的SSL证书,所以也告诉yarn接受不安全的SSL连接(这可以通过向代理提供有效的SSL证书来修复)。

.yarnrc
应包含条目

strict-ssl false
https-proxy "http://localhost:1234"

4.开始纱线

用标准

yarn install
开始纱线。请求很快就会在代理屏幕内可见,并且比
maxdate
更新的软件包将被忽略。

备注

  • 此方法已使用 Yarn 版本 1.22.19 和 mitmproxy 版本 10.2.1 进行了测试
  • 这用于调试目的(代理的 SSL 配置和插件内部的日期比较需要改进)
  • 由于 mitmproxy 内部的额外处理,构建过程(或至少是加载包的部分)比平时花费的时间更长
© www.soinside.com 2019 - 2024. All rights reserved.