Javascript 您如何在一次回购中与其他团队共享本地npm包? 脚本
考虑以下文件夹结构:Javascript 您如何在一次回购中与其他团队共享本地npm包? 脚本,javascript,node.js,npm,npm-install,npm-scripts,Javascript,Node.js,Npm,Npm Install,Npm Scripts,考虑以下文件夹结构: /my-service /src /bin /other-package /src package.json package.json 有两个npm包:一个用于我的服务,另一个用于其他包 我的服务取决于其他套餐 我的服务归团队A所有,其他包归团队B所有 请记住,当其他包发生更改时,团队B仍需要部署我的服务。这就是我们考虑使用共享存储库的原因 问题: 如何构造这种依赖关系,使两个团队的开发人员体验都是合理的 理想情况下,团队B只需要安装和构建
/my-service
/src
/bin
/other-package
/src
package.json
package.json
有两个npm包:一个用于我的服务
,另一个用于其他包
我的服务
取决于其他套餐
我的服务
归团队A
所有,其他包
归团队B
所有
请记住,当
其他包
发生更改时,团队B
仍需要部署我的服务
。这就是我们考虑使用共享存储库的原因
问题:
如何构造这种依赖关系,使两个团队的开发人员体验都是合理的
理想情况下,团队B
只需要安装和构建其他软件包
,就可以在该目录中完成所有需要的操作
同样,团队A
应该能够使用最新版本的其他软件包
,并且在本地开发中的摩擦最小
选择权
我目前正在考虑两个方案来解决这个问题,但不知道是否有更好的方案
本地文件依赖关系
在此选项中,my service
有一个package.json
如下所示:
"dependencies": {
"other-package": "./other-package"
},
"scripts": {
"build": "npm run build:other-package && npm run build",
"build:other-package": "cd other-package && npm i && npm run build && cd .."
}
"dependencies": {
"other-package": "./other-package/other-package-0.0.1.tgz"
}
局部tarball依赖
在此选项中,my service
有一个package.json
如下所示:
"dependencies": {
"other-package": "./other-package"
},
"scripts": {
"build": "npm run build:other-package && npm run build",
"build:other-package": "cd other-package && npm i && npm run build && cd .."
}
"dependencies": {
"other-package": "./other-package/other-package-0.0.1.tgz"
}
在这种情况下,团队
B
需要负责在新版本准备就绪时运行other package
目录中的npm pack
,更新my service
中的package.json
并将其提交给git。将两个包放在单独的存储库中,在第一个文件的package.json
文件中,将一个依赖项放入第二个文件的git存储库。如下所示:
"dependencies": {
"my-other-package": "git://github.com/user/project.git#commit-ish"
}
有关可用语法选项的详细信息,请参阅
这样,两个团队就可以独立地处理各自的包。同时,可以通过其git url引用包,您甚至可以通过提供其commit ish
来锁定特定的分支、标记或提交
如果使用GitHub管理git存储库,还可以使用快捷语法:
"dependencies": {
"my-other-package": "user/project#commit-ish"
}
这也适用于私有存储库,但仅适用于GitHub。对于另一个git托管解决方案,您需要使用上面提到的语法
由于您提到依赖团队希望使用最新版本而不会有太多摩擦,因此您可能只想使用诸如#master
之类的东西作为提交工具。然后,在每次npm安装中
都会获得提交给主分支的最新版本
请注意,这会导致不可复制的构建,因为您无法确定地预测将安装什么。根据我的个人经验,我建议将依赖关系绑定到特定的提交。虽然这是更多的维护工作,但它会导致可复制和可预测的安装,这一点IMHO很有价值,但YMMV
这种方法的一大优点是,两个团队在发布或类似的事情上不必相互关心,因为您可以依赖外部的包,而团队管理包时甚至不知道其他人正在使用它
如果出于任何原因,它绝对必须是一个单一的存储库,而您不能使用我描述的方法,那么您可能会对术语“monorepo”感兴趣。这基本上就是为多个包提供单个(mono)存储库的概念。管理这种单一回购协议的一个工具是,你可能想仔细看看
长期分裂的人应该团结起来;那些长期团结的人将被分裂
最近,我帮助我的团队过渡到monorepo,将10+个回购合并为一个。Monorepo有一些缺点,当它变得非常庞大时(比如谷歌),它会给版本控制设施带来压力。另一方面,它有助于代码共享、重用构建脚本、ci流、批处理git历史记录和文件等
典型的monorepo方法平等对待子项目
/monorepo
/node_modules <-- shared top level node_modules
/packages
/my-service
/other-package
如果您愿意尝试像lerna.js
这样的工具,它可以帮助您完成上述工作
现在,您可以像正常情况一样指定您的my service/package.json
"dependencies": {
"other-package": "latest"
}
请记住,当
其他包
发生更改时,团队B
仍需要部署我的服务
。这就是我们考虑使用共享存储库的原因。