pnpm在多项目和单项目下的使用问题解答

2023-10-27

pnpm 是一个管理多个项目依赖的工具,它使用类似于 yarn 的方式来处理多个项目之间的依赖。可以按照多项目的workspace方式管理依赖,也可以进行单个项目的依赖管理。

pnpm workspace的文件夹标准结构 :

一个 pnpm workspace 的文件夹结构通常如下:

workspace-folder/

├── package.json

├── pnpm-workspace.yaml

├── packages/

│   ├── package-1/

│   │   ├── package.json

│   │   └── ...

│   └── package-2/

│   │   ├── package.json

│   │   └── ...

└── ...

在这种结构中,workspace-folder 文件夹是根文件夹,它包含一个根级的 package.json 文件,一个 pnpm-workspace.yaml 的配置文件,和一个子文件夹 packages,其中包含所有的项目,每个项目都有一个单独的 package.json 文件。

pnpm-workspace.yaml 的配置 

pnpm-workspace.yaml 是 pnpm workspace 的配置文件,它包含一些有关 workspace 的信息和配置。具体来说,pnpm-workspace.yaml 文件可能包含以下信息:

workspace 的名称

包含在 workspace 中的项目列表

共享的依赖包的配置信息

项目之间的依赖关系配置

项目的额外配置信息

pnpm-workspace.yaml 文件示例:

name: my-workspace
packages:
  - packages/*
  - packages/package-1

sharedWorkspaceConfig:
  hoist: false

packageDependencies:
  package-1:
    - package-2

packageDependenciesMeta:
  package-1:
    - package-2:
        optional: true

这个例子中,我们创建了一个名为 my-workspace 的 workspace,它包含了 packages 文件夹中所有的项目和 packages/package-1 文件夹中的项目。我们还配置了一些 sharedWorkspaceConfig,表示不使用 hoist 的方式来管理共享的依赖包。此外,我们还配置了 packageDependencies,表示 package-1 项目依赖于 package-2 项目,并且在 packageDependenciesMeta 中指定了 package-2 是一个可选依赖。

workspace 和 packages下的package.json的区别:

在 pnpm workspace 的文件夹结构中,通常会有两个 package.json 文件:一个是根文件夹下的 package.json,另一个是 packages 文件夹中项目文件夹中的 package.json。两个 package.json 文件都包含了项目的依赖信息和配置信息,但它们之间有一些不同:

根文件夹下的 package.json 是 workspace 级别的,它只包含 workspace 本身的依赖和配置信息,不包含项目的信息。

{
  "name": "my-workspace",
  "version": "1.0.0",
  "dependencies": {
    "lodash": "^4.17.15"
  },
  "devDependencies": {
    "jest": "^24.9.0"
  }
}

packages 文件夹中的 package.json 文件是项目级别的,它包含了项目本身的依赖和配置信息。

packages 文件夹中的 package-1 文件夹中的 package.json:

{
  "name": "package-1",
  "version": "1.0.0",
  "dependencies": {
    "react": "^16.12.0"
  }
}

每个项目里的配置文件:

在 pnpm workspace 的文件夹结构中,每个项目都有一个单独的文件夹,其中包含了项目的代码文件和配置文件。

项目的配置文件可能包括:

package.json:项目的依赖信息和配置信息。

.npmrc:npm 的配置文件,包含了 npm 的一些设置信息。

.gitignore:git 的忽略文件,用于指定哪些文件不需要被提交到 git 仓库中。

.eslintrc.js 或 .eslintrc.json:ESLint 的配置文件,用于设置代码检查规则。

.prettierrc.js 或 .prettierrc.json:Prettier 的配置文件,用于设置代码格式化规则。

jest.config.js 或 jest.config.json:Jest 的配置文件,用于设置单元测试的一些配置。

webpack.config.js 或 webpack.config.json:Webpack 的配置文件,用于设置构建项目的一些配置。

上述配置文件不是必须的,它们只是一些常见的配置文件。每个项目可能会有不同的配置文件,取决于项目使用的工具和框架。

项目中的package.json必须包含的信息:

package.json 文件通常必须包含以下信息:

name:项目的名称。

version:项目的版本号。

main:项目的入口文件。

这些是 package.json 文件中的必需字段,如果缺少这些字段,则可能会导致项目无法正常运行。

除了上述必需字段之外,package.json 文件还可能包含以下信息:

dependencies:项目的依赖包列表。

devDependencies:项目的开发依赖包列表。

scripts:项目的脚本命令列表。

license:项目的许可证信息。

description:项目的描述信息。

author:项目的作者信息。

这些字段不是必需的,但它们可以提供更多有用的信息,帮助其他人了解项目的相关信息。

例如:{

  "name": "my-project",

  "version": "1.0.0",

  "main": "index.js",

  "dependencies": {

    "react": "^16.12.0",

    "lodash": "^4.17.15"

  },

  "devDependencies": {

    "jest": "^24.9.0",

    "eslint": "^6.8.0"

  },

  "scripts": {

    "test": "jest",

    "start": "node index.js"

  },

  "license": "MIT",

  "description": "This is my project.",

  "author": "Jane Doe <jane.doe@example.com>"

}

项目中的.npmrc文件:

pnpm与 npm 使用相同的配置文件 .npmrc。pnpm 也有一个 .npmrc 文件,用于提供 pnpm 的一些默认设置信息。

.npmrc 文件是一个全局配置文件,它存储在用户的 home 目录中,可以在所有项目中共享。例如,如果你在 .npmrc 文件中配置了 npm 仓库的地址,那么所有的项目都会使用这个仓库地址。

pnpm 也可以使用项目本地的 .npmrc 文件。如果项目中有一个 .npmrc 文件,那么 pnpm 会优先使用项目本地的 .npmrc 文件,而不会使用全局的 .npmrc 文件。

例如,如果你在 .npmrc 文件中配置了 npm 仓库的地址为 https://registry.npmjs.org/,但在某个项目的 .npmrc 文件中又配置了 npm 仓库的地址为 https://registry.yarnpkg.com/,那么 pnpm 在这个项目中就会使用 https://registry.yarnpkg.com/ 这个仓库地址,而不是全局配置文件中的地址。

单个项目的使用:

pnpm 是一个用于管理多个 npm 包的工具,它可以为多个包之间的依赖关系提供统一的管理方式。如果你只有一个项目,没有其他依赖包,那么使用 pnpm 的workspace 可能并不是很必要。

单个项目使用的时候和npm的使用类似,不过记得在pnmp install之前,删除原来的node_modules

工作区外的使用:

pnpm的工作区功能允许在单个目录中管理多个项目,但是只能在特定的工作区目录中使用。

如果你不想在工作区目录中运行pnpm,可以尝试在命令行中添加--ignore-workspace-root选项。这个选项会忽略工作区目录的限制,并允许在任何目录中运行pnpm。例如:

pnpm --ignore-workspace-root [command]

注意,这样可以解决在非工作区目录中运行pnpm时出现的错误,但也可能会带来一些问题。这是因为pnpm命令可能需要访问工作区目录中的某些文件或信息,但在非工作区目录中运行时,这些文件或信息可能不存在或不可用。

另外,可以使用--filter选项指定要操作的项目,或使用--prefix选项指定安装模块的目录。例如:

pnpm install [module] --filter [project]

其中,[module]表示要安装的模块名称,[project]表示要安装模块的项目名称。这样,pnpm就会忽略工作区目录的限制,并只在指定的项目中安装模块。

另一个解决方法是使用--prefix选项指定安装模块的目录。例如,如果您想要在非工作区目录中安装一个模块,可以这样做:

pnpm install [module] --prefix [directory]

其中,[module]表示要安装的模块名称,[directory]表示安装模块的目录。这样,pnpm就会忽略工作区目录的限制,并在指定的目录中安装模块。

请注意,这些解决方法都可能会导致pnpm命令的结果与预期不同,因此应谨慎使用。最好的方法是尽量在工作区目录中运行pnpm,避免使用--ignore-workspace-root选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pnpm在多项目和单项目下的使用问题解答 的相关文章

随机推荐