NPM 仅安装后依赖项
NPM postinstall-only dependencies
我正在使用 git 分发内部 TypeScript NPM 包。因为我不想在我的存储库中有构建文件,所以我在安装包时使用安装后操作来构建包:
"postinstall": "tsc -p tsconfig.json"
要构建我的包,需要一些依赖项(例如 TypeScript)。但是,当我将它们添加为开发依赖项时,它们在安装后阶段不可用,因此我必须将它们添加为常规依赖项。
所以我的问题是:
- 在我的 package.json 中将这些构建依赖项声明为常规依赖项是否有任何缺点?
- 如果是这样,在通过 git 安装的 NPM 包中表达仅构建依赖项的首选方式是什么?
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 的开发依赖项。
我正在使用 git 分发内部 TypeScript NPM 包。因为我不想在我的存储库中有构建文件,所以我在安装包时使用安装后操作来构建包:
"postinstall": "tsc -p tsconfig.json"
要构建我的包,需要一些依赖项(例如 TypeScript)。但是,当我将它们添加为开发依赖项时,它们在安装后阶段不可用,因此我必须将它们添加为常规依赖项。
所以我的问题是:
- 在我的 package.json 中将这些构建依赖项声明为常规依赖项是否有任何缺点?
- 如果是这样,在通过 git 安装的 NPM 包中表达仅构建依赖项的首选方式是什么?
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 的开发依赖项。