如何清理 Firebase 托管中的旧部署版本?
Posted
技术标签:
【中文标题】如何清理 Firebase 托管中的旧部署版本?【英文标题】:How to clean old deployed versions in Firebase hosting? 【发布时间】:2016-12-27 05:47:18 【问题描述】:每次部署到托管 Firebase 时,都会创建一个新的部署版本,以便您可以回滚并查看部署者。这意味着每次部署的每个文件都会被存储并占用更多空间。
除了手动逐个删除每个部署的版本,有没有什么自动化的方法来清理那些无用的文件?
【问题讨论】:
这是截至 2019 年 3 月的答案:***.com/a/47213789/1271706 【参考方案1】:你是对的。您需要使用 Firebase 托管控制台一一删除旧部署的版本。
没有其他方法可以做到这一点,所以我建议您提交feature request 以启用在 Firebase 托管控制台中删除多个部署的版本。
更新:
您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 为团队提出的替代方案之一(批量删除,仅保留 X 版本,保留发布日期
【讨论】:
我已经填写了一个功能请求,但我怀疑它会被实现。哦,好吧。 哦,痛苦——就我而言,我有 218 个! (点击菜单,点击删除,点击删除……点击菜单,点击删除,点击删除……重复218次……) @Pier 请链接到您创建的功能请求,以便我们对其进行跟踪。谢谢!编辑:我看到 Firebase 上的功能请求不公开。那有点……不太好。 @Levi 在 firebase-tools repo 上也有报道。致大家:您可以在这里投票(请避免 +1 垃圾邮件,使用反应)github.com/firebase/firebase-tools/issues/… 为团队提出的替代方案之一(批量删除,仅保留 X 版本,保留发布日期的版本2019 年 3 月更新
现在有一个合适的解决方案:“版本历史设置”,它允许保留最新的 X 版本。
https://support.google.com/firebase/answer/9242086?hl=en
2019 年 2 月更新
由谷歌员工@github.com/firebase/firebase-tools/issues/...确认
它正在积极进行中。 ?
???
在继续阅读之前:
您可以在这里投票(请避免 +1 垃圾邮件,使用反应)https://github.com/firebase/firebase-tools/issues/215#issuecomment-314211730 为团队提出的替代方案之一
因此,通过使用 Chrome 开发工具,我找到了一种删除多个版本的方法。请记住,这需要一些工作(请小心操作,因为已删除的版本无法恢复,并且您不会收到任何警告,例如使用 UI 时)。
步骤 1. 检索版本列表。
-
打开 Chrome 开发工具(如果您不知道如何处理,您应该等待 Firebase 团队提供适当的解决方案)。
打开 Firebase 的控制台并转到“托管”选项卡。
转到 CDT 上的“网络”选项卡并使用 Websockets 过滤器。
选择名为
.ws?v=5&ns=firebase
的请求
打开“框架”标签
现在是乏味的部分:选择具有最高“长度”值的帧。 (根据您的数据,可能是 2-n 帧。在我的情况下,长度为 14k-16k 的 3 帧)
按顺序粘贴每个帧的数据(这将形成一个有效的 JSON 对象)。
提取数据:有几种方法可以做到这一点。我在 CDT 的控制台上选择了简单的 JS。
var jsonString = '...';
var json = JSON.parse(jsonString);
var ids = Object.keys(json.d.b.d);
步骤 2. 执行请求
差不多了:P
现在您有了 ID,请执行以下请求:
删除https://firebasehosting.clients6.google.com/v1beta1/sites/PROJECT_NAME/versions/-VERSION_ID?key=KEY
我使用了 Sublime(创建请求字符串)+ Paw。
“KEY”可以从 CDT 的任何请求中复制。它与 Firebase 的 Web API 密钥不匹配
=> 在执行请求之前:记下您不想从 Firebase 提供的表格中删除的版本。 (网站上列出的每个版本在您的电子邮件下都有其 ID 的最后 6 位数字)
(未提供屏幕截图,因为所有这些都需要模糊处理和一些工作)
【讨论】:
我已经完成了最后一步,除了我想使用浏览器内的工具来发送删除请求。这似乎是正确的:fetch(`https://firebasehosting.clients6.google.com/v1beta1/sites/$projectID/versions/$versionID?key=$key`, method: "DELETE", credentials: 'include');
但是,在运行时,它显示“请求缺少所需的身份验证凭据”。这很奇怪,因为“网络”选项卡显示请求是相同的。 (除了两个 cookie 的微小变化,这似乎无关)
@Venryx 你明白了吗?
不,抱歉。我最终使用了上面@Aaverin 的解决方案,效果很好。
太棒了。现在应该是答案了。【参考方案3】:
这个脚本还不是超级可靠的,所以使用它需要您自担风险。我稍后会尝试更新它,但现在对我有用。 只需一些 javascript 即可单击按钮以一一删除已部署的项目。
var deleteDeployment = function(it)
it.click()
setTimeout(function()
$('.md-dialog-container .delete-dialog button.md-raised:contains("Delete")').click()
, 300)
$('.h5g-hist-status-deployed').map((i, a) => $(a).parent()).map((i, a) => $(a).find('md-menu button:contains(Delete)')).each((i, it) =>
setTimeout(function()
deleteDeployment(it)
, (i + 1) * 2000)
)
【讨论】:
这在五分钟内清除了 3GB 的旧部署。谢谢! 酷!你让我的生活更轻松。【参考方案4】:Firebase终于为此实施了解决方案。
现在可以设置保留版本的限制。
https://firebase.google.com/docs/hosting/deploying#set_limit_for_retained_versions
编辑:以前的链接已过时。这是一个有效的新链接:
https://firebase.google.com/docs/hosting/usage-quotas-pricing#control-storage-usage
【讨论】:
【参考方案5】:由于选择器依赖于当前 DOM 结构和 Hosting Dashboard 上的类,这可能有点脆弱,但它对我有用!
注意:此脚本(如果从控制台执行)或小书签将单击并确认删除当前视图中的所有行。我相当肯定,即使您在当前部署上单击删除,它也不会删除它。
控制台运行函数:
let deleteAllHistory = () =>
let deleteBtns = document.querySelectorAll('.table-row-actions button.md-icon-button');
const deleteBtn = (pointer) =>
deleteBtns[pointer].click();
setTimeout(() =>
document.querySelector('.md-open-menu-container.md-clickable md-menu-item:last-child button').click();
setTimeout(() =>
document.querySelector('.fb-dialog-actions .md-raised').click();
if(pointer < deleteBtns.length - 1)
deleteBtn(pointer + 1);
, 500);
, 500);
;
deleteBtn(0);
;
书签:
javascript:(function()%7Bvar%20deleteBtns%3Ddocument.querySelectorAll('.table-row-actions%20button.md-icon-button')%2CdeleteBtn%3Dfunction(a)%7BdeleteBtns%5Ba%5D.click()%2CsetTimeout(function()%7Bdocument.querySelector('.md-open-menu-container.md-clickable%20md-menu-item%3Alast-child%20button').click()%2CsetTimeout(function()%7Bdocument.querySelector('.fb-dialog-actions%20.md-raised').click()%2Ca%3CdeleteBtns.length-1%26%26deleteBtn(a%2B1)%7D%2C500)%7D%2C500)%7D%3BdeleteBtn(0)%7D)()
【讨论】:
注意这将删除域:|【参考方案6】:Nathan 的选项很棒,但我有一个使用 AutoHotkey 的快速而简单的方法。删除每个版本大约需要一秒钟,因此您可以在 10 秒内敲出一个页面。
#a::
Click
MouseGetPos, xpos, ypos
MouseMove, xpos, ypos + 30
Sleep 300
Click
Sleep 400
Click 1456, 816
MouseMove, xpos, ypos + 82
return
#s::
Click
MouseGetPos, xpos, ypos
MouseMove, xpos, ypos - 820
return
您可能需要修改屏幕的确切像素值,但这在我的 1920x1080 上完美运行。
Win + a 是删除并移动到下一个条目,Win + s 是移动到下一页。将鼠标放在第一个 3 点菜单上即可!
【讨论】:
【参考方案7】:在发布历史记录表顶部,单击工具栏并选择“版本历史记录设置”。设置为所需数量并单击保存。这将自动删除旧部署。
【讨论】:
【参考方案8】:我不知道它是否可以帮助您,但我可以从“托管”菜单中删除旧部署,如下所示: Delete or rollback old deployment
【讨论】:
你应该把相关的代码/说明放在这里,以避免将来任何断开的链接让你回答无用。 是的,但您必须手动操作。逐个。你甚至读过这个问题吗?以上是关于如何清理 Firebase 托管中的旧部署版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何更新在 Firebase 托管中部署的 Flutter Web 版本
如何使用swift和ios使firebase sdk中的旧消息过期
Firebase 托管 Flutter Web 应用程序未清除首次部署的缓存
如何在 Firebase 托管上部署 next.js 应用程序?