在包含多个包的 repo 中,每个包的版本应该代表啥?

Posted

技术标签:

【中文标题】在包含多个包的 repo 中,每个包的版本应该代表啥?【英文标题】:In a repo containing multiple packages, what should the version of each represent?在包含多个包的 repo 中,每个包的版本应该代表什么? 【发布时间】:2018-08-13 05:03:17 【问题描述】:

我正在开发一个 Web 应用程序,其中 React client 应用程序和 Node Express server API 存在于同一个存储库中,但具有单独的 package.json 文件。结构如下:

root
-client/
  --src/     
  --package.json  // manages create-react-app dependencies, scripts
-controllers/
-models/
-routes/
-app.js
-package.json // manages node express server dependencies, scripts

看起来,这些单独的包是系统(即网络应用程序)的子模块。例如,考虑路由的处理方式,服务器无法识别的任何请求都由client 路由器处理:

// app.js

require('./routes/...')(app)      // api routes defined first

if (process.env.NODE_ENV === 'production') 
  app.use(express.static('client/build'))
  const path = require('path')
  app.get('*', (req, res) =>    // non match fall through to client
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'))
  )

服务器 API 未启用 cors。

这些package.json 文件应该共享相同的版本,还是分开进行版本化?

【问题讨论】:

【参考方案1】:

每个包都应该单独进行版本控制。将它们绑定到相同的版本号意味着一个简单的错误修复,需要另一个无意义的版本碰撞。不要欺骗你的客户!包版本号适用于其内容并且仅适用于其内容。即使是一个包的包也应该有自己的版本序列。

您也可以选择只运送一个包裹。

【讨论】:

我想我已经看到了它的价值——例如,如果我将来为新的 Vue 或 FooX.js 删除 React 客户端,则服务器 API 仍然存在,而客户端语义发生了变化。此外,可以添加另一个客户端(例如移动客户端)或服务器操作/物流可以更改,这样客户端就不能再从同一个域获得服务,从而进一步分离两个包。我是否朝着正确的方向解释了这一点? 听起来像。了解版本控制的关键是准确了解您使用该数字跟踪的内容。内部有很多位的大型单片封装在实践中相当脆弱。在您的大多数客户从未使用过的角落修复一些客户关键错误,您最终会迫使每个人都接受并安装整个东西。但是,有时你想打包一堆包(当然每个包都是单独版本的),所以你可以说这是我们测试并提供全面支持的版本集。 But then, sometimes you want to package a bunch of packages (each individually versioned of course), so you can say here's a version set we tested and provide full support for - 这应该存在,与软件工程基础教科书中所写的完全一样。感谢您的洞察力。

以上是关于在包含多个包的 repo 中,每个包的版本应该代表啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何组织一个包含多个包的 python 项目,以便包中的每个文件仍然可以单独运行?

composer 如何处理同一个包的多个版本?

CentOS中yum install命令如何找到安装包的下载地址

在 Java 中访问包的多个版本

如何修改maven依赖包的版本

多个 Flutter 包的集中版本管理