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
仍需要部署
我的服务
。这就是我们考虑使用共享存储库的原因。