我正在使用分离的微服务构建我的应用程序,每个服务都有自己的代码仓库和npm依赖,并且可能在不同的服务器上。
我正在寻找一种将所有依赖项放入一个全局的 package.json
文件中并通过url访问的方法,
这样,我就可以更新共享的依赖版本,而无需逐个运行所有不同的微服务并单独更新它们。
这种做法可行吗?
很遗憾,npm不支持指定父级package.json文件的功能。虽然这个功能在一段时间前曾被提出,但npm的维护人员得出结论,这应该由外部工具实现。
当然,你可以自己编写这样的工具。以下是其中一个可能的方法:
创建包含所有共享依赖项的package.json
文件的库。在此示例中,它将被称为shared-deps
。
创建merge.js
脚本,将共享依赖项添加到本地package.json
文件中,并将其添加到shared-deps
库中:
const fs = require('fs')
const localPackageJson = require('../../package.json')
const sharedPackageJson = require('./package.json')
Object.assign(localPackageJson.dependencies, sharedPackageJson.dependencies)
fs.writeFileSync('../../package.json', JSON.stringify(localPackageJson, null, 2))
将以下的 post-install hook 添加到使用这些共享依赖项的应用程序的 package.json
中:
"scripts": {
"postinstall": "node ./node_modules/a/merge.js"
}
现在,当您运行npm install
时,您的共享依赖项将与shared-deps
库一起安装,您的package.json
将随后更新。
shared-dependencies
的新存储库,并在其中包含所有共享依赖项的package.json
,然后将其发布到npm上,那么您就可以在每个主项目上执行npm i shared-dependencies
,从而可以访问所有共享依赖项。还有dry-dry。它允许您在一个包中定义常见的package.json
条目,并从项目中的每个包中链接到它。