如何在单个 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,npm
和 yarn
支持他们自己的工作区协议。我只是发现 pnpm
工作最好,仪式最少。
尽情享受吧。
我有一个使用 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,npm
和 yarn
支持他们自己的工作区协议。我只是发现 pnpm
工作最好,仪式最少。
尽情享受吧。