解决 `this-property-fallback` 不推荐使用通知

背景

本质上,如果你在 handlebars 模板中使用 {{foo}} 来引用控制器/组件上的属性,那么你需要将其更新为 {{this.foo}}

上游信息:Property Fallback Lookup | Ember.js - Deprecations

为了让 Discourse 通过 Ember 4.x 升级,我们引入了一个向后兼容的垫片(shim),这样主题和插件就不需要急于进行此更改。但是,长期维护此垫片是不可行的,因此我们需要将主题和插件更新为现代语法。

弃用

在最新版本的 Discourse 中,使用旧语法将在控制台中打印弃用消息。它看起来像这样:

DEPRECATION: [PLUGIN discourse-calendar] `loading` 属性路径在 `discourse/plugins/discourse-calendar/discourse/templates/admin-plugins-calendar.hbs` 模板中使用时没有使用 `this`。此回退行为已被弃用,所有属性在使用时都必须在 `this` 上查找:{{this.loading}}

与任何其他弃用一样,我们将逐渐提高此警告的可见性,直到最终删除向后兼容的垫片。我们初步计划在 2025 年第二季度最终移除,但会根据实际数据进行调整。

升级你的代码

对于小型主题/插件,你可以手动更新模板,在任何属性名称前添加 this.

为了让大型主题/插件的过渡更容易,我们引入了一个新的 ember-template-lint 规则,其中包含一个自动修复程序。

因此,如果你使用我们最新的标准 linting 配置(根据 plugin skeletontheme skeleton),那么所有受影响的代码将在下次运行 ember-template-lint --fix 时自动更新。

如果你有任何问题/疑虑,请在下方告知我们!

6 个赞

太棒了!在我的一个插件中(我认为我已经正确更新了 lint 配置),我看到很多 {{this.blah}} 实例,我非常确定它们不是最近才出现的。我怎么强调都不为过,这有多酷。 :tada: :clinking_glasses: :beers:

如果有一种自动化的方法,可以在骨架更新时复制/删除每个插件中的相应文件,那就太好了。(这次我可能手动完成了这件事,也可能没有。)也许可以在骨架中放置一个小的 bash 脚本,它可以检查当前目录中是否存在 plugin.rb,如果存在,它就可以将脚本所在位置的文件复制到当前目录。大概是这样。

1 个赞

我们还没有真正宣传过,但您可能会对 GitHub - discourse/mass-pr: A tool for applying automated changes across a large number of GitHub repositories 感兴趣。我们使用它来将这些类型的更改应用于我们维护的 600 多个主题/插件存储库。

所以,在这种情况下,我运行类似这样的命令:

GITHUB_TOKEN=... pnpm mass-pr \
  --message "DEV: Update linting" \
  --branch "update-linting" \
  --script scripts/update-js-linting.sh \
  discourse-solved \
  discourse-assign \
  ...

它会更新骨架内容,自动修复所有 linting 问题,并在 GitHub 上创建 PR。

然后我们有另一个脚本来处理合并:GitHub - discourse/mass-merge: A script for mass-approving and merging Dependabot pull requests

对于一个更轻量级的更新脚本,我们绝对欢迎 pr-welcome!如果只有一个存储库需要更新,这些脚本有点过于笨重。

5 个赞

真的吗?太棒了!

我迫不及待想试试,但也迫不及待想谢谢你。

不。一个脚本比两个脚本更容易维护 4 倍,如果你们正在使用那个脚本,那么我想要使用它。

太酷了。

谢谢你,大卫!这太棒了。

首先,我花了一点时间才弄清楚我需要运行 pnpm install

现在我有这个了:

#!/usr/bin/env bash
# sync-with-skeleton -- 假定你处于一个
today=$(date +"%Y-%m-%d")
repo=$(grep url .git/config | sed -E 's/.*:([^/]+/[^.]+).*/\1/')
cd ~/src/discourse-repos/mass-pr
GITHUB_TOKEN=$GITHUB_TOKEN pnpm mass-pr \
--message "DEV: Update GitHub workflows" \
--branch "sync-with-skeleton-$today" \
--script scripts/update-workflows.sh \
$repo

如果它能检查当前目录中是否存在 plugin.rb,甚至检查仓库是否存在,那就更好了,但今天我只能做到这样了。或者我可以提交一个 PR,然后它会 cd 到它所在的目录。

而且,它也让我明白了我为什么即使只是我自己也应该提交 PR。非常感谢。

2 个赞