使依赖项的依赖项在 Yarn 2 中可用
Making a dependency's dependencies available with Yarn 2
我正在开发一个框架,我希望框架包的依赖项可供使用它的应用程序使用。依赖不是消费者直接使用的,而是框架提供的文件。
使用 npm,它可以工作,但是使用 Yarn 2 我会遇到这样的错误
Error: Your application tried to access @snowpack/plugin-dotenv, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.
显然,我可以将依赖项添加到消费应用程序的 package.json,但这需要在依赖项发生变化时手动编辑 package.json。这与具有无模糊升级路径的框架的想法背道而驰。此外,依赖项适用于框架提供的文件。它们不应受到下游代码的干扰。
是否可以在下游共享依赖项?
注意:我正在使用工作区。我不知道这是否与问题相关。
您可以使用 createRequire
来实现。
例如,如果您的应用程序依赖于 micromatch@4.0.2
,并且您希望在应用程序代码中要求它的 sub-dependency picomatch
而不声明它,您可以代表micromatch
通过以下代码:
const {createRequire} = require(`module`);
const requireDependency = createRequire(require.resolve(`micromatch`));
requireDependency(`picomatch`);
此方法适用于所有包管理器和安装策略,包括 Yarn v2 pnp
和 pnpm
以及 npm
。
我正在开发一个框架,我希望框架包的依赖项可供使用它的应用程序使用。依赖不是消费者直接使用的,而是框架提供的文件。
使用 npm,它可以工作,但是使用 Yarn 2 我会遇到这样的错误
Error: Your application tried to access @snowpack/plugin-dotenv, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.
显然,我可以将依赖项添加到消费应用程序的 package.json,但这需要在依赖项发生变化时手动编辑 package.json。这与具有无模糊升级路径的框架的想法背道而驰。此外,依赖项适用于框架提供的文件。它们不应受到下游代码的干扰。
是否可以在下游共享依赖项?
注意:我正在使用工作区。我不知道这是否与问题相关。
您可以使用 createRequire
来实现。
例如,如果您的应用程序依赖于 micromatch@4.0.2
,并且您希望在应用程序代码中要求它的 sub-dependency picomatch
而不声明它,您可以代表micromatch
通过以下代码:
const {createRequire} = require(`module`);
const requireDependency = createRequire(require.resolve(`micromatch`));
requireDependency(`picomatch`);
此方法适用于所有包管理器和安装策略,包括 Yarn v2 pnp
和 pnpm
以及 npm
。