.csproj文件中版本号的管理和包引用的追溯功能
团队公告
2
帖子
1
发布者
2
浏览
1
关注中
-
有个方案需要讨论:
1)你分析我的X:\WindSurf\gitlab-ci\基础框架\gitlab.lodatone.com\deploy\common-ci\nuget-component-linux.yml 和X:\WindSurf\gitlab-ci\基础框架\gitlab.lodatone.com\deploy\common-ci\nuget-component-hybrid.yml 这种模板;
2)都是对一堆.csproj文件进行build,pack,然后把nupkg推送到nuget仓库。然后更新Directory.Build.props用到的版本号定义的变量。
3)我希望增加两个功能- 每次build的时候,检查.csproj的包引用,对写死的版本号,给出精准的使用哪个变量的建议
- 程序员/项目经理,能知道某个包,在哪些项目里被用到了
4)我的想法是,在X:\gitlab\lodatone.com\tools\version-writer\Yee.DirectoryBuild.VersionWriter\Controllers 这里增加功能: - 流水线在setup的时候,就扫描本次要打包哪些包,这些包的版本号是什么,然后记录到数据库。包名 - 版本号变量名;
- 流水线在setup的时候,就扫描.csproj文件,调用web api,等级其使用了哪些包
5)目标: - .csproj里所有的包的版本号,都不是写死的,都引导项目经理/开发人员,改成变量;
- 数据库里登记清楚,能知道一个包,在哪些项目/仓库的具体.csproj里被用到。
- 在另外的项目里,我会提供查询界面给开发人员和项目经理。
你帮我评估一下,我的意图,我的方案,是不是最合理的,并给出意见。
-
结论
- 你的目标(消灭硬编码版本、沉淀“包→项目”映射)很合理,且能同时服务到 CI 合规与项目管理洞察。
- 现有模板(nuget-component-linux.yml、nuget-component-hybrid.yml)已经通过 shared/package-version-check.yml 引入了脚本级检查;要实现更强的“建议 + 追踪”能力,需要把 version-writer 的上下游信息贯通起来。
- 你的方案(在 version-writer Controller 里新增扫描、入库 API,流水线 setup 时调用)是可行的,但还需要一些边界和数据结构设计,才能让 CI 运行成本、Runner 镜像更新、数据库一致性都可控。
我参考了“gitlab-ci 三层架构 / Key 规则”的记忆,确保改动方向遵循 LT-78 特殊规则。
可行性评估
- CI 模板现状
- nuget-component-linux.yml 只是桥接到
.NET 8.0模板;nuget-component-hybrid.yml 桥接到.NET 4.8.1模板。无论哪个入口,最终都在setup阶段跑setup_version、setup_global_var,之后build/test/push/update-version全部共用。要加逻辑就放在setup_global_var阶段最自然(已有 download-directory-builds-props.sh 等脚本)。
- nuget-component-linux.yml 只是桥接到
- 硬编码版本建议
- 借助我们已在 runner 镜像里扩展的 check-package-versions.sh + props 注释,现在本地扫描即可找到变量建议。若想“更全局、可查询”,需要把扫描结果保存到数据库,再由 version-writer 或一个小型 API 服务来提供读取引用。
- 包引用登记
- 每个 pipeline 扫描
.csproj→ 生成“项目/仓库/分支 + 包名 + 当前变量名 + 版本”记录,写入统一的 API/DB。后续查询就能反查“包在哪些项目中被使用”。 - 关键点:需要全局唯一的项目标识(比如仓库路径、commit SHA、版本号),避免数据冲突;同时要考虑 pipeline 并发写入和旧数据淘汰策略。
- 每个 pipeline 扫描
建议的实现路径
- API 设计(version-writer 服务或新微服务)
POST /packages/usage:提交单次扫描结果(包→项目→变量名→版本)。POST /packages/variables:记录 version-writer 生成的“包-变量”对(含环境、产品线)。GET /packages/{name}/usage:提供查询接口给你提到的“项目经理/开发人员”界面使用。
- Runner / CI 侧改动
- 在
setup_global_var阶段新增脚本:- 使用
PROJECT_PATHS或自动发现.csproj,调用现有 check-package-versions.sh(或提炼公共函数)生成 JSON/CSV; - 调用上述 API 上传扫描结果;
- 若发现硬编码版本,继续沿用现有脚本的“精准建议 + 可选失败”逻辑。
- 使用
- 这样 runner 镜像只需增加一个“上传脚本 + curl 工具”,风险可控。
- 在
- version-writer Controller 扩展
- 在
update-version入口里,把“模块名 → 变量名 → 版本”同步写到 API,作为权威数据源; - 同时确保在 props 注释里输出包名/变量名,供 CI 快速匹配。
- 在
- 查询侧
- 由你的“另外的项目”直接访问 API / 读库,展示“包 → 影响的项目/仓库/版本/上次检测时间”等信息。
- 也可以反查“项目 → 使用的所有包及变量”,辅助评审。
风险与建议
- 数据一致性:Pipeline 失败或中途中止时,已有的数据是否回滚?建议 API 支持“覆盖”策略(用 commit SHA + job ID 作为主键)。
- 权限与网络:Runner 镜像要能访问 version-writer API(内网 or VPN),必要时配置 token/证书。
- 扫描性能:一次 CI 扫几十个 csproj,如果都在
setup阶段执行,注意不要显著拖慢 pipeline;可以缓存Directory.Build.props下载、并发处理。 - 落地顺序(建议分阶段):
- version-writer 提供 “包
变量” API,并在 update-version阶段写入; - Runner 在
setup阶段扫描.csproj→ 上传“包引用快照”; - Explorer/Query 项目读取数据,提供查询界面;
- 最终再考虑对 CI 做更严格的阻断策略(例如 packages 未登记则禁止发布)。
- version-writer 提供 “包
下一步(可选)
- 确定 version-writer API 的接口设计/存储方案(SQL/NoSQL/Elastic)。
- 在 runner 镜像里新增一个
report-package-usage.sh,复用 check-package-versions.sh 提供的解析能力。 - 在 CI 模板(shared/nuget-setup.yml)里接入该脚本,确保所有引用模板的项目都能上报。
- 搭建查询界面(可先用简单的 web/Excel 输出,验证体验)。
如需我帮忙设计 API、数据库 schema 或落地脚本,随时说。