Ember 附加组件被解析为不正确的对等依赖项。——通过删除 "content-tag@3.1.0": "patches/content-tag@3.1.0.patch" 解决

我发誓我每周花 2-4 小时来维护我的开发实例。

我运行 pnpm dedupe

pfaffman@noreno:~/src/discourse-repos/discourse$ bin/ember-cli
范围:所有 17 个工作区项目
锁定文件是最新的,跳过解析步骤
已是最新
完成,耗时 1.3 秒
一些 V1 ember 插件解析为不正确的对等依赖项。这使得我们无法安全地将它们转换为 v2 格式。

👇 👇 👇
👉 请参阅 https://github.com/embroider-build/embroider/blob/main/docs/peer-dependency-resolution-issues.md 了解问题的解释和修复建议。
👆 👆 👆

discourse@0.0.0 (dev)-> discourse-plugins@1.0.0 -> ember-this-fallback@0.4.0
  看到对等依赖 ember-source@5.12.0
    在 /home/pfaffman/src/discourse-repos/discourse/node_modules/.pnpm/ember-source@5.12.0_patch_hash=xx7mvsb7nmshqkkqhmf45r3hse_@glimmer+component@1.1.2_@babel+cor_fw7srrjre4qclkyiv6wvjvr6va/node_modules/ember-source
    但 discourse@0.0.0 正在使用 ember-source@5.12.0
      在 /home/pfaffman/src/discourse-repos/discourse/node_modules/.pnpm/ember-source@5.12.0_patch_hash=xx7mvsb7nmshqkkqhmf45r3hse_@glimmer+component@1.1.2_@babel+cor_stof4qukza26ryuxyhy7me4cya/node_modules/ember-source

然后我删除了我的插件并重试,出现了这个错误:


pnpm install -r
范围:所有 17 个工作区项目
 ERR_PNPM_PATCH_NOT_APPLIED  以下补丁未应用:content-tag@3.1.0

请从“patchedDependencies”中删除它们或更新它们以匹配您依赖项中的包。
进度:已解析 1786,已重用 1734,已下载 0,已添加 0

我最终删除了这一行才使 ember 工作:

这是我拉取新 discourse 版本时执行的操作:

  cd "$DISCOURSE_SRC"
  # 注意:如果 bundler 损坏,请尝试 `gem install bundler -v 2.5.3`

  # 好的。我们将负责至少创建一个数据库
  if psql -d discourse_development -c '\q' 2>/dev/null; then
    # 连接成功
    echo "我们有 postgres。"
  else
    echo "没有 discourse 数据库"
    cd /tmp && sudo su -c "su postgres -c 'createuser -s \"$USER\"'"
    cd $DISCOURSE_SRC
    LOAD_PLUGINS=1 ./bin/rails db:create
    LOAD_PLUGINS=1 RAILS_ENV=test ./bin/rails db:create
    echo "CREATE EXTENSION IF NOT EXISTS vector;" | psql
  fi

  if ! [[ -d $ALL_THE_PLUGINS ]]; then
    echo "缺少插件"
    cd $SRC
    git clone https://github.com/discourse/all-the-plugins
    cd $ALL_THE_PLUGINS
    ./reset-all-repos
  fi
  cd $ALL_THE_PLUGINS
  if [ -z "$(find official -mmin -100)" ]; then
    echo -e "\n正在更新插件\n "
    ./reset-all-repos
  fi

  if ! [[ -d $ALL_THE_THEMES ]]; then
    echo "缺少主题!!!"
    sleep 5
    cd $SRC
    git clone https://github.com/discourse/all-the-themes
    cd $ALL_THE_THEMES
    ./reset-all-repos
  fi

  cd $ALL_THE_THEMES
  if [ -z "$(find official -mmin -100)" ]; then
    echo -e "\n正在更新主题. . .\n"
    ./reset-all-repos
  fi

  asdf plugin add ruby 2>&1 |grep -v "already"
  asdf plugin add imagemagick 2>&1 |grep -v "already"
  asdf plugin update --all > /dev/null

  docker pull discourse/base:release
  RUBY_VERSION=$(docker run discourse/base:release bash -c 'ruby --version'|cut -d' ' -f2)
  LOCAL_RUBY_VERSION=$(ruby --version|cut -d' ' -f2)
  echo "获取 RUBY_VERSION $RUBY_VERSION"
  asdf install ruby $RUBY_VERSION 2>&1 |grep -v "already"
  asdf global ruby $RUBY_VERSION 2>&1 |grep -v "already"
  IMAGE_MAGICK_VERSION=$(docker run discourse/base:release bash -c 'convert --version'|head -1|cut -d' ' -f3)
  echo "获取 IMAGE_MAGICK_VERSION: $IMAGE_MAGICK_VERSION"
  asdf install imagemagick $IMAGE_MAGICK_VERSION 2>&1 |grep -v "already"
  asdf global imagemagick $IMAGE_MAGICK_VERSION 2>&1 |grep -v "already"

  # 2025-01-13 从基础容器获取 node 版本!
  NODE_VERSION=$(docker run discourse/base:release bash -c 'node --version'|cut -d'v' -f2)
  echo "获取 NODEJS 版本: $NODE_VERSION"
  asdf install nodejs $NODE_VERSION 2>&1|grep -v "already"
  asdf global nodejs $NODE_VERSION 2>&1|grep -v "already"

  npm install -g pnpm

  # 版本更新结束
  cd $DISCOURSE_SRC
  git checkout main
  git pull
  bundle install
  rm -rf node_modules pnpm-lock.yaml
  pnpm install -r --fix-lockfile

  echo -e "\n-----------> 正在运行 pnpm update. . .\n"
  pnpm update
  echo -e "\n-----------> 正在运行 pnpm dedupe. . .\n"
  pnpm dedupe
  echo -e "\n-----------> 正在迁移数据库. . .\n"
  LOAD_PLUGINS=1 ./bin/rails db:migrate
  LOAD_PLUGINS=1 RAILS_ENV=test ./bin/rails db:migrate
  exit
2 个赞

为什么?这会更改 lockfile,而你真的不想这样做(除非你特意要更改 Discourse 的依赖项)。如果你不想更改依赖项,唯一需要的 pnpm 命令应该是 pnpm install

你描述的问题听起来像是你的 pnpm lockfile 与 core 的不一致。我建议检查任何差异(例如,通过 git status 或你使用的任何 git GUI)。如果存在差异,请重置它(例如,通过 git restore pnpm-lock.yaml)。

可能相关:我建议从你的安装脚本中删除 --fix-lockfile。Core 的 lockfile 永远不需要“修复”,所以在本地运行它只会导致不一致。

顺便问一下,你是否尝试过使用 devcontainer 设置。它旨在几乎完全消除此类维护。

尽管不可否认,如果这个问题确实是你修改了 pnpm lockfile,那么在 devcontainer 中也可能发生 :sweat_smile:

1 个赞

哦,是的……这会解决问题 :eyes:

使用核心的 lockfile。如果你删除它并从 package.json 重新生成一个,你将获得每个依赖项的最新版本,这肯定会导致问题。

另外,pnpm 非常擅长保持 node_modules 的有序,所以你不需要每次拉取核心时都删除它。当我拉取核心时,我所做的就是 bundle install && pnpm install && bin/rake db:migrate

因为这解决了我的上一个问题?

今天我尝试添加的另一个东西;我会移除那个。

我不是故意改的……当傻瓜如此聪明时,很难做到万无一失。

也许 git clean -f 才是我需要的。 :person_shrugging:

好多年没用了。我当时可能觉得它更慢;也许现在没那么慢了?也许我应该再试一次?你用过它吗?

这是一个全新的指南——它与旧的“docker dev”指南不同。(事实上……这让我想起……我们可能应该弃用/删除那个旧指南)

在 macOS 上,虚拟化开销使其速度稍慢,尤其是对于像并行运行 RSpec 套件这样的 CPU 密集型任务。但对于一般开发来说,它非常好。

我并非 100% 的时间都使用它,但在不想干扰我的主要开发环境时,我会将其用于小型独立任务。例如:在审查时检出别人的 PR。或者如果我需要在 stable 分支上进行一些测试/开发。

听起来不错!如果这样能解决问题,请告诉我们 :crossed_fingers:

哦!也许我需要阅读手册。也许过去五年里有什么变化。也许下次我感到沮丧时,我会去看看。谢谢。

git clean -f 似乎解决了这个问题。我确实有一个 Discourse 的 fork 在别处,我可以名正言顺地编辑它来创建一个 PR,但这个副本来自原始来源,所以丢弃任何更改都不是问题(而且任何更改可能都是意外的)。

我主要只在插件开发中使用我的开发环境。

它现在又能正常工作了,我谨慎地希望我的脚本在接下来的几次也能正常工作!

2 个赞

今天我无法运行我的开发环境,因为 Discourse 坚持使用 pnpm 9.15.5,而 npm 坚持安装 10.x 版本。pnpm --version 会在我的主目录中显示 10.x,但在 discourse 目录中运行时会失败。这花了我整个下午的时间。我最终用 npm 卸载了 pnpm,并在我的更新脚本中添加了以下内容:

  PNPM_VERSION=$(docker run discourse/base:release bash -c 'pnpm --version'|cut -d'v' -f2)
  echo "GOT PNPM version: $PNPM_VERSION"
  asdf install pnpm $PNPM_VERSION 2>&1|grep -v "already"
  asdf global pnpm $PNPM_VERSION 2>&1|grep -v "already"

这似乎奏效了。

我尝试使用 Docker 开发的魔法,但不知道如何传递环境变量,而且它甚至没有设置 DISCOURSE_DEV_ALLOW_ANON_TO_IMPERSONATE,所以我无法登录。

现在我又遇到了这个:

 Error encountered while starting Sidekiq: [Discourse::Utils::CommandError] /home/pfaffman/src/discourse-repos/discourse/lib/discourse.rb:139:in `exec': renice: failed to set priority for 116553 (process ID): Permission denied   

我想我之前通过编辑……某个文件修复了它。

好的。这是修复 nice 问题的方法。我发誓我不知道为什么只有我遇到了这个问题。

在一个类似这样的文件中:

sudo nano /etc/security/limits.d/90-pfaffman-nice.conf

添加类似这样的内容:

pfaffman soft priority 5
pfaffman hard priority 5
1 个赞

只要你有 这个提交 的核心代码,那么理论上 pnpm 10.x 在核心代码中运行时应该会自动回退到 pnpm 9。你不需要任何自定义的安装技巧。

在 pnpm 10 发布后,一些团队成员确实遇到了问题,并通过运行 pnpm self-update 9 解决了。但自从我们在核心代码中添加了新的配置后,我认为没有人需要手动进行任何操作。

使用 VSCode 吗?如果你使用的是预定义的任务,那么你可以在 tasks.json 中添加 env。如果你通过 VSCode 终端启动 rails/ember,那么你可以像其他终端一样在前面添加 env。

这对我来说是第一次遇到 :sweat_smile:。不过很高兴你最终解决了它!

我想知道,你运行的是什么 Linux 操作系统?

我在 d2a34bed8439557bfc37b8c08f89271be6903015 (应该是在那之后) 上,它试图运行 pnpm 9,但找不到它,所以它会拒绝运行,因为它非常非常非常想要自己的版本。而且我无法安装它,直到我用 asdf 来处理。

天哪。不。我搜索了“development docker”,然后得到了旧的方法:https://meta.discourse.org/t/install-discourse-for-development-using-docker/102009。如果这是我们现在喜欢的方式,能否有人将其链接到 Developing Discourse using a Dev Container

我运行的是 POP!OS,我认为它在底层基本上是标准的 Ubuntu,但也许他们更改了 renice 值,而且我唯一遇到这种情况的人。我不记得是什么时候开始的,但这次我终于在操作系统层面修复了它,而不是通过编辑核心!

2 个赞