如何在单个 Node.js 存储库中包含多个 targets/executables?

How can I have multiple targets/executables in a single Node.js repo?

我有一个使用 TypeScript 构建的 React Native 应用程序,我还想开发一些 CLI 工具来帮助开发人员和 'back office' 也使用 TypeScript 的人。我希望这些都住在同一个 monorepo 中。

根据同事的建议和我自己的研究,我尝试通过在 repo 中创建一个子文件夹,然后创建第二个 package.json(以及所有其他配置文件)和 npm install-ing 就好像它是一个完全独立的项目一样。没过多久这就变得一团糟,主要是重复导入,其中一件事似乎神秘地从其他目标 node_modules 导入模块,但也只记得重新 npm install 所有每次提交之前的不同子项目,等等。周围的 TS build 文件夹变得更加混乱;他们是人们从中输入错误内容的另一个地方。这种方法造成的混乱极大地降低了生产力,感觉 必须 是更好的方法。那么问题来了:

构建多个 TS/Node 目标的最佳实践是什么(“目标”,我不是指 ES6 与 ESNext,我指的是 C/C++ 意义上的:多输出“程序”,所以在这种情况下,我希望它既能创建我的 RN 应用程序所需的包,又能生成一个 CLI 可执行文件。)它们都从一个单一的 monorepo 彼此共享代码?

如果重要的话,我也在用Expo。

你本质上是在描述一个单体仓库。 pnpm 为此提供了开箱即用的出色工具。

下载 pnpm CLI 并安装它:

$ npm i -g pnpm              # Download pnpm
$ mkdir monorepo             # Create a new monorepo folder
$ cd monorepo
$ mkdir packages             # This will be the folder where you add your
                             # apps, libraries, etc.
$ touch package.json         # Create a package.json
$ echo "{}" > package.json

创建一个 pnpm-workspace.yaml 文件并添加以下内容:

packages:
  - 'packages/**'

恭喜。您现在有了一个 monorepo,您​​可以在其中添加多个应用程序。它是这样工作的:

  • packages 下每个包含 package.json 文件的文件夹现在都是一个 Node 应用程序,您可以使用工作区根目录中的 pnpm 来控制它。
  • 当您从根目录 运行 pnpm i 时,它将为您的 所有 应用程序和库安装所有依赖项。
  • 您甚至可以安装您在本地创建的库,而无需 运行 npm link,或者处理将 file:../ 添加到您的 package.json 或任何其他混乱。
  • pnpm 还支持 运行ning 脚本同时跨所有存储库。

I made an example project for you to look at. 在此示例中,您会注意到我创建了一个名为 my-library 的库和一个名为 awesome-app 的依赖应用程序。当我运行

$ pwd
~/Whosebug/packages/awesome-app
$ pnpm i my-library

pnpm 知道自动获取我的工作区库:

{
  "name": "awesome-app",
  "dependencies": {
    "my-library": "workspace:0.1.0"
  }
}

注意 workspace:0.1.0 与我存储库中的软件包版本相匹配。

我爱pnpm。它并非没有缺点,但我对它的使用效率很高。还有其他替代方案,例如 Lerna,npmyarn 支持他们自己的工作区协议。我只是发现 pnpm 工作最好,仪式最少。

尽情享受吧。