Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用 pnpm 安装 egg 依赖之后,pnpm dev 时报错,插件找不到 #4739

Closed
aidening opened this issue Aug 17, 2021 · 11 comments · Fixed by eggjs/egg-core#237
Closed

Comments

@aidening
Copy link

aidening commented Aug 17, 2021

pnpm dev 之后报错:
2021-08-18 00:05:47,902 ERROR 301 nodejs.Error: Can not find plugin egg-onerror in "/mnt/e/workspace/front-project/fadog/fadog-portal/portal/node_modules, /mnt/e/workspace/front-project/fadog/fadog-portal/node_modules/.pnpm/registry.nlark.com+egg@2.30.0/node_modules/egg/node_modules, /mnt/e/workspace/front-project/fadog/fadog-portal/portal/node_modules"

/mnt/e/workspace/front-project/fadog/fadog-portal/node_modules/.pnpm/registry.nlark.com+egg-cluster@1.27.0/node_modules/egg-cluster/lib/agent_worker.js:32
throw err;
^

Error: Can not find plugin egg-onerror in "/mnt/e/workspace/front-project/fadog/fadog-portal/portal/node_modules,

相关环境信息

  • 操作系统
  • windows
  • Node 版本
  • 12.19.0
  • Egg 版本
  • 2.30.0

之前有同学提过类似的问题,我使用 pnpm install --shamefully-hoist 并没有起作用。

@xmsz
Copy link

xmsz commented Oct 3, 2021

+1

@KaneOne
Copy link

KaneOne commented Oct 30, 2021

pnpm 6.0 使用 --shamefully-hoist 是可以的

@DevXiaolan
Copy link
Contributor

--shamefully-hoist

这等于没用 pnpm

@egg-bot
Copy link

egg-bot commented Dec 24, 2021

Hello @aidening. Please provide a reproducible example following the instruction.

Issues labeled by Need Reproduce will be closed if no activities in 7 days.


@aidening,请根据这个说明提供最小可复现代码。

如果在 7 天内没有进展会被自动关闭。

@DevXiaolan
Copy link
Contributor

最小可复现

mkdir showcase && cd showcase
$ npm init egg --type=ts
$ pnpm install
$ pnpm dev

@atian25
Copy link
Member

atian25 commented Dec 29, 2021

image

昨天分析了下 pnpm 的那个目录结构,大概知道为啥 egg 会 break 了,它把子依赖提了一级,这样虽然在 require 里面是支持上溯的,但 egg loader 不会有这个行为。

举个例子,yadan-framework 有一个 egg-xx 的插件,在 pnpm 里面的目录是:

yadan-framework@1.0.0
  | - node_modules
       |- yadan-framework
       |- egg-xx

而不是我们希望的标准的:

yadan-framework@1.0.0
  | - node_modules
       |- yadan-framework
            | - node_modules
                   |- egg-xx

我们 loader 里面应该是插件定位的时候,有可能用了 path.resolve 或 fs.exists 啥的,而不是 require.resolve,所以可能找不到。(回头可能要跟着源码跑一下才能确定)

暂时不打算支持(3 里面再看看),先用 pnpm install --shamefully-hoist 的方式规避吧。

@DevXiaolan
Copy link
Contributor

:(

@zbjumper
Copy link

image

昨天分析了下 pnpm 的那个目录结构,大概知道为啥 egg 会 break 了,它把子依赖提了一级,这样虽然在 require 里面是支持上溯的,但 egg loader 不会有这个行为。

举个例子,yadan-framework 有一个 egg-xx 的插件,在 pnpm 里面的目录是:

yadan-framework@1.0.0
  | - node_modules
       |- yadan-framework
       |- egg-xx

而不是我们希望的标准的:

yadan-framework@1.0.0
  | - node_modules
       |- yadan-framework
            | - node_modules
                   |- egg-xx

我们 loader 里面应该是插件定位的时候,有可能用了 path.resolve 或 fs.exists 啥的,而不是 require.resolve,所以可能找不到。(回头可能要跟着源码跑一下才能确定)

暂时不打算支持(3 里面再看看),先用 pnpm install --shamefully-hoist 的方式规避吧。

eggjs@3提上日程了?

@atian25
Copy link
Member

atian25 commented Dec 30, 2021

@atian25
Copy link
Member

atian25 commented Jan 6, 2022

看了下 egg-core 源码:https://github.com/eggjs/egg-core/blob/master/lib/loader/mixin/plugin.js#L353

image

差不多就是这段逻辑,粗暴的写法就是 lookupDirs 数组每一个都要再判断下自己的同级目录。
优雅一点的话,不应该用 existsSync 来判断,而是用 require.resolve,不过要试下,要传第二个参数才行。

回头找时间优化下,也欢迎有空的同学直接提 PR。

@atian25
Copy link
Member

atian25 commented Jan 7, 2022

重新安装下依赖看看,应该支持了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants