跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠

乐达

  1. 主页
  2. 团队公告
  3. .csproj文件中版本号的管理和包引用的追溯功能

.csproj文件中版本号的管理和包引用的追溯功能

已定时 已固定 已锁定 已移动 团队公告
2 帖子 1 发布者 2 浏览 1 关注中
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Z 离线
    Z 离线
    zhongfangxiong
    写于 最后由 编辑
    #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里被用到。
    • 在另外的项目里,我会提供查询界面给开发人员和项目经理。
      你帮我评估一下,我的意图,我的方案,是不是最合理的,并给出意见。
    1 条回复 最后回复
    0
    • Z 离线
      Z 离线
      zhongfangxiong
      写于 最后由 编辑
      #2

      结论

      • 你的目标(消灭硬编码版本、沉淀“包→项目”映射)很合理,且能同时服务到 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 特殊规则。


      可行性评估

      1. 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 等脚本)。
      2. 硬编码版本建议
        • 借助我们已在 runner 镜像里扩展的 check-package-versions.sh + props 注释,现在本地扫描即可找到变量建议。若想“更全局、可查询”,需要把扫描结果保存到数据库,再由 version-writer 或一个小型 API 服务来提供读取引用。
      3. 包引用登记
        • 每个 pipeline 扫描 .csproj → 生成“项目/仓库/分支 + 包名 + 当前变量名 + 版本”记录,写入统一的 API/DB。后续查询就能反查“包在哪些项目中被使用”。
        • 关键点:需要全局唯一的项目标识(比如仓库路径、commit SHA、版本号),避免数据冲突;同时要考虑 pipeline 并发写入和旧数据淘汰策略。

      建议的实现路径

      1. API 设计(version-writer 服务或新微服务)
        • POST /packages/usage:提交单次扫描结果(包→项目→变量名→版本)。
        • POST /packages/variables:记录 version-writer 生成的“包-变量”对(含环境、产品线)。
        • GET /packages/{name}/usage:提供查询接口给你提到的“项目经理/开发人员”界面使用。
      2. Runner / CI 侧改动
        • 在 setup_global_var 阶段新增脚本:
          1. 使用 PROJECT_PATHS 或自动发现 .csproj,调用现有 check-package-versions.sh(或提炼公共函数)生成 JSON/CSV;
          2. 调用上述 API 上传扫描结果;
          3. 若发现硬编码版本,继续沿用现有脚本的“精准建议 + 可选失败”逻辑。
        • 这样 runner 镜像只需增加一个“上传脚本 + curl 工具”,风险可控。
      3. version-writer Controller 扩展
        • 在 update-version 入口里,把“模块名 → 变量名 → 版本”同步写到 API,作为权威数据源;
        • 同时确保在 props 注释里输出包名/变量名,供 CI 快速匹配。
      4. 查询侧
        • 由你的“另外的项目”直接访问 API / 读库,展示“包 → 影响的项目/仓库/版本/上次检测时间”等信息。
        • 也可以反查“项目 → 使用的所有包及变量”,辅助评审。

      风险与建议

      1. 数据一致性:Pipeline 失败或中途中止时,已有的数据是否回滚?建议 API 支持“覆盖”策略(用 commit SHA + job ID 作为主键)。
      2. 权限与网络:Runner 镜像要能访问 version-writer API(内网 or VPN),必要时配置 token/证书。
      3. 扫描性能:一次 CI 扫几十个 csproj,如果都在 setup 阶段执行,注意不要显著拖慢 pipeline;可以缓存 Directory.Build.props 下载、并发处理。
      4. 落地顺序(建议分阶段):
        1. version-writer 提供 “包 ↔ 变量” API,并在 update-version 阶段写入;
        2. Runner 在 setup 阶段扫描 .csproj → 上传“包引用快照”;
        3. Explorer/Query 项目读取数据,提供查询界面;
        4. 最终再考虑对 CI 做更严格的阻断策略(例如 packages 未登记则禁止发布)。

      下一步(可选)

      1. 确定 version-writer API 的接口设计/存储方案(SQL/NoSQL/Elastic)。
      2. 在 runner 镜像里新增一个 report-package-usage.sh,复用 check-package-versions.sh 提供的解析能力。
      3. 在 CI 模板(shared/nuget-setup.yml)里接入该脚本,确保所有引用模板的项目都能上报。
      4. 搭建查询界面(可先用简单的 web/Excel 输出,验证体验)。

      如需我帮忙设计 API、数据库 schema 或落地脚本,随时说。

      1 条回复 最后回复
      0
      回复
      • 在新帖中回复
      登录后回复
      • 从旧到新
      • 从新到旧
      • 最多赞同


      • 登录

      • 登录或注册以进行搜索。
      • 第一个帖子
        最后一个帖子
      0
      • 版块
      • 最新
      • 标签
      • 热门
      • 世界
      • 用户
      • 群组