NPM 仅安装后依赖项

NPM postinstall-only dependencies

我正在使用 git 分发内部 TypeScript NPM 包。因为我不想在我的存储库中有构建文件,所以我在安装包时使用安装后操作来构建包:

"postinstall": "tsc -p tsconfig.json"

要构建我的包,需要一些依赖项(例如 TypeScript)。但是,当我将它们添加为开发依赖项时,它们在安装后阶段不可用,因此我必须将它们添加为常规依赖项。

所以我的问题是:

Are there any drawbacks from having these build dependencies declared as regular dependencies in my package.json?

我不这么认为。无论哪种方式,您都需要它们来构建包,因此除非您提交构建的文件,否则无法绕过它。

或者,您可以仅提供源文件并让构建由您的用户负责。

另一种选择是分支它。假设 master 有你的源文件,创建一个 dist 分支并且永远不会将它合并回 master,然后在 dist 上提交构建的文件,当你想发布一个版本合并 master 到 dist,构建,提交, 推。这会让您更好地控制更新,并让消费者更轻松。

如果您正在创作一个将在其他项目中使用的库,那么在您的存储库中保留工件通常是可以接受的。为用户节省安装时间和麻烦。

此 post-install 构建方案的一个可能缺点是您的消费者可能会使用 package.json resolutions.

超载您的构建依赖项

我不得不强烈反对 zamber 的回答。将所有依赖项声明为产品依赖项存在相当大的缺点。 如果你这样做,任何安装你的包的人也会在他们的 node_modules 文件夹中安装你所有的开发依赖项。在这一点上这似乎不是什么大问题,但想象一下如果每个人都这样做。还要记住,不仅仅是安装您项目的人,还有安装任何使用您项目的依赖项的人。

node_modules 文件夹已经很大,npm install 已经需要很长时间了。如果每个人都添加开发依赖项作为产品,带宽、处理能力和硬盘 space 要求将显着增加。

在我的很多项目中,真正的依赖项确实很少,但有很多大型开发依赖项:构建依赖项(如 typescript)、测试依赖项(如 jest 或 jasmine)、linting 依赖项,甚至用于自动测试的整个浏览器。除了您之外,没有其他人需要这些依赖项,因此不必为它们支付时间和硬​​盘驱动器费用 space。

发布 TS 库的方法是先构建再发布。这意味着需要 none 的开发依赖项。