如果不存在
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
尚未提交到回购。我想避免在发现错误的较早日期在大型项目中手动查找和设置所有版本。
遵循 Ry 的 想法,使用 addon 的 mitmproxy 会从注册表发送的元数据中删除在固定日期之后创建的包的所有包信息。
插件确保注册表始终发送包含 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)
使用 docker 版本的 mitm 并以卷的形式提供插件代码。
docker run --rm -it -p 1234:8080 --name mitm \
-v ./plugin.py:/tmp/plugin.py \
mitmproxy/mitmproxy mitmproxy -s /tmp/plugin.py
告诉yarn使用端口1234上的代理。由于代理使用自己的SSL证书,所以也告诉yarn接受不安全的SSL连接(这可以通过向代理提供有效的SSL证书来修复)。
.yarnrc
应包含条目
strict-ssl false
https-proxy "http://localhost:1234"
用标准
yarn install
开始纱线。请求很快就会在代理屏幕内可见,并且比 maxdate
更新的软件包将被忽略。
备注: