Firebase-tools: 无法在非交互模式下删除

创建于 2018-08-17  ·  18评论  ·  资料来源: firebase/firebase-tools

版本信息

"firebase-tools": "4.1.1"

平台信息

OS X 和 Bitbucket 管道 CI

重现步骤

在 Bitbucket 管道 CI 中,使用带有 env 变量的非交互模式
firebase use myproject
firebase deploy在 index.js 中有 5 个函数

_在后来的 PR_
firebase deploy在 index.js 中只有 4 个函数

预期行为

  1. 完整的 firebase 部署删除了最新 index.js 中不再存在的“第 5 个”函数
  2. 不需要手动步骤/CLI 命令(就像以前版本的 firebase 工具一样)

实际行为

Error: The following functions are found in your project but do not exist in your local source code:
... 功能列表 ...
Aborting because deletion cannot proceed in non-interactive mode. To fix, manually delete the functions by running:

最有用的评论

当然:我们不断重构旧函数并经常替换(例如,将 https onRequest 交换为 onCall)。 我们更容易删除旧函数并添加新函数。 有时我们只是不再使用该功能,并希望它消失。
我们不会每周删除一个函数,但是现在不能通过 CI 来完成,这意味着我们必须在 review 中添加一个手动步骤,以便在合并和自动部署之前手动删除。 这也意味着至少有两个开发人员需要对我们的生产功能进行写访问,我们正试图摆脱这种情况以求安心。
如果我们有firebase deploy --allow-deletes并且我们保持良好的审查流程,那么我们的整个开发团队就可以自由地创建/更新/删除任何内容,而无需等待我在我的笔记本电脑上打开生产 CLI,而我正在做某事别的。

我可以理解为什么默认设置是不删除,但我们很惊讶它在非交互模式下不可能/被阻止,假设该模式下的大多数人在像我们一样部署之前都进行了彻底的审查?

所有18条评论

您好,这是故意行为,因为我们收到很多反馈,表示用户不喜欢 CLI 如何自动删除他们的功能。 所以现在我们需要用户确认删除,这在非交互式中是无法完成的。

这就是为什么该版本是一个主要版本的颠簸,以表明行为发生了重大变化。

@laurenzlong可以添加一个标志以允许在非交互模式下删除吗? 与良好的审查/合并策略 + CI 部署相比,在 CLI 中手动删除函数对我们来说不太安全和不方便

你能再扩展一下你的理由吗? 您在 CI 期间是否经常删除函数?

当然:我们不断重构旧函数并经常替换(例如,将 https onRequest 交换为 onCall)。 我们更容易删除旧函数并添加新函数。 有时我们只是不再使用该功能,并希望它消失。
我们不会每周删除一个函数,但是现在不能通过 CI 来完成,这意味着我们必须在 review 中添加一个手动步骤,以便在合并和自动部署之前手动删除。 这也意味着至少有两个开发人员需要对我们的生产功能进行写访问,我们正试图摆脱这种情况以求安心。
如果我们有firebase deploy --allow-deletes并且我们保持良好的审查流程,那么我们的整个开发团队就可以自由地创建/更新/删除任何内容,而无需等待我在我的笔记本电脑上打开生产 CLI,而我正在做某事别的。

我可以理解为什么默认设置是不删除,但我们很惊讶它在非交互模式下不可能/被阻止,假设该模式下的大多数人在像我们一样部署之前都进行了彻底的审查?

感谢 Alan 的反馈,我将就此展开内部讨论。

谢谢劳伦🙌

我们有完全相同的问题。 它也会有很大帮助。 由于更新,我们不得不放弃使用 Google Cloud Builder 的自动化部署。

不确定是否有人已经建议了。
大多数用户似乎更喜欢一个标志,其中不存在的功能将被删除。

这并不总是每个人都想要的选择。
例如,我们想要一个标志,它允许我们忽略这些函数。
所以这些功能不会得到更新或被删除。

例如,如果有人在功能分支中创建了一个新函数并使用firebase deploy --only functions:functionName部署它
这不会影响生产使用中的任何其他功能。

然后有人尝试部署新版本,然后我们的 CI 管道将启动并调用命令
firebase deploy --ignore-missing-functions ,然后部署将更新所有存在的函数,创建缺失的函数,但不会更新或删除函数functionName

我看到了恢复旧行为的标志的好处,因此在我看来,这两种行为都会很棒。
要么删除缺失的函数,要么忽略它们。

同样在这里。 因为我们有很多触发器,而且经常需要将用户数据库从 prod 移动到开发项目以进行调查和故障排除,所以我们需要一种方法来在 json 导入期间禁用所有触发器。
我们提出的禁用触发器的唯一方法是在导入之前实际删除 dev 项目中的所有函数 - 从字面上注释掉所有 index.js,将其部署到 dev,然后导入 json,然后将所有函数恢复为进一步调查任何报告的问题。

如果有一种方法可以使用更新的 CLI 以更友好的方式禁用触发器,我将非常感谢有关如何实现这一目标的任何输入。 否则,批量从 CLI 中删除函数仍然是我们所依赖的。

@laurenzlong正在解决这个问题吗?

我们将很快添加一个选项来强制删除丢失的功能。
我们已经听到了反馈,希望这会有所帮助。 默认行为将
保持不变。

2018 年 10 月 12 日星期五上午 5:06 所罗门·恩格尔 < [email protected]写道:

@laurenzlong https://github.com/laurenzlong是否正在解决这个问题?


您收到此消息是因为您订阅了此线程。
直接回复本邮件,在GitHub上查看
https://github.com/firebase/firebase-tools/issues/877#issuecomment-429303503
或静音线程
https://github.com/notifications/unsubscribe-auth/AAAD_npvEeL-UEG_Q5YNtNylQCi_9hKKks5ukIWtgaJpZM4WCBfg
.

@mbleigh当我运行firebase deploy时,是否有任何选项可以不删除任何函数?

例如,如果我有 2 个具有完全不同功能的独立存储库,它们都部署到同一个 Functions 项目中。

所以例如:
我有回购

  • “前端”,具有以下功能:

    • 语言重定向器

  • “后端”,具有:

    • 已通过用户身份验证

现在,如果我从“前端”存储库运行firebase deploy ,我只想更新languageRedirector
如果我从“后端”存储库运行firebase deploy我只想更新onUserAuthenticated

这可能吗?

@IchordeDionysos据我所知这是不可能的。 在部署过程中,检查函数以找出需要删除的内容和需要添加的内容。 如果代码中“缺少”一个,CLI 将尝试删除它。

这是您正在考虑的 #999 吗? :)
我们真的需要这个选项,因为如果没有这个,我们的 CI 脚本目前将无法工作......

我只是在那个 PR 上写了一个注释。 虽然这是一个好主意,但添加这样的标志还需要更多的内部过程。 我不希望在几天内发生什么事情,但知道它在我们的雷达上。

@IchordeDionysos同时,您是否可以在firebase deploy上使用--only functions:[function] firebase deploy来让您的 CI 工作? 您可以在此处找到更多详细信息: https :

对我们来说,问题已经解决。 我们可以再次通过 Google Cloud Builder 进行部署。

这是我们仅用于 upsert 函数(不删除其他函数)的“hack”:

echo "n\n" | firebase deploy --only functions --interactive --token $FIREBASE_TOKEN

也希望拥有明确的选项,例如--no-delete而不是依赖于永远不会改变的问题😏

此页面是否有帮助?
0 / 5 - 0 等级