dotnet CBB 为何决定推送 Tag 才能打包

经过推送 Tag 才打 NuGet 包的方法的做用不只仅是让打包方便,让打包这个动做能够彻底在本地执行,无需关注其余系统的使用步骤。更重要的是能够强制每一个可能被安装的 NuGet 包版本都能有一个和他对应的 Tag 号,缘由是为了解决回退到某个版本发现有一个坑,这个坑是由于某个依赖库的版本问题,此时我指望最小改动,我虽然能拿到这个库的代码,可是我很难知道我这个版本安装的 NuGet 库对应依赖库的哪一个 commit 的代码html

我以前每次须要追踪某个 NuGet 包对应的依赖库的源代码的版本的时候,都须要进入打包服务器,查看打包日志,在这样很坑玩了好久,公司的配置管理员干掉了服务器,删除了日志。而我接到一个很古老的项目须要修复某个坑,此时这个项目引用了一个底层库的古老版本,此时我不能升级底层库,应该底层库的改动量太大了。可是我又很难定位我如今项目引用的 NuGet 库对应的底层库的哪一个 commit 代码。后面只能经过二分的方法,用了几天的开发才完成缓存

因此看到了我上面的坑,小伙伴大概也就能知道为何我指望将 Tag 和 NuGet 包关联了服务器

在我如今团队的约定里面,只要添加了 alpha 也就是预览版,就能够随意推送测试的 Tag 让服务器帮你打包 NuGet 包,而后在其余的项目安装。为何会鼓励这样作?缘由是有小伙伴说个人某个项目的开发依赖某个库,可是假设这个库必定是合并到主分支以后才能打出 Tag 打包,也就是小伙伴在某个项目的代码将一直不能推送。同时小伙伴也不能在 csproj 里面引用某个私有的版本,由于私有的版本只有小伙伴本身能构建经过,其余小伙伴可构建不经过网络

假设小 A 须要开发项目 F 而这个项目以来库 L 的更改
而库 L 的更改若是没有合并到 master 分支,就不容许推送 Tag 打包
此时小 A 若是推送了代码,这个代码引用了尚未被发布的 L 库的代码,那么其余小伙伴将没法构建经过
此时小 A 若是推送了代码,这个代码引用了小 A 本地生成的 NuGet 库,那么其余小伙伴将找不到这个 NuGet 库,没法构建经过
若是小 A 不推送代码,只是写了一个 commit 可是这个 commit 包含了 L 库的代码,可是没有在 csproj 里面升级 L 库版本,那么在回滚代码的时候,进入到这个 commit 将构建失败
若是小 A 在 commit 里面升级到他本地生成的 NuGet 库,那么回滚代码的时候,由于公共服务器不存在小 A 的本地的 NuGet 库,依然会构建失败工具

此时有一个叫头像的小伙伴出了一个馊主意,小 A 虽然 L 库代码没有被合并,可是能够知道这个 L 库被合并以后分配的版本号,此时就在 csproj 里面更新到这个版本,而后经过本地打包的方法引用和推送。可是这个方法存在如下问题post

  • 小伙伴本地打包第一次,发现翻车了,想要第二次打包,可是此时的版本号就重叠了,须要通过黑科技删除 NuGet 缓存从新构建,此时的效率特别低
  • 小伙伴在此次 commit 写的代码是他认为发布的时候将会添加的公开方法,可是实际上最后发布的时候更改了公开方法,此时回滚到这个 commit 虽然能下载到 NuGet 库,可是发现 L 库的公开方法不匹配,构建失败

这就是为何选用推送 Tag 打包的缘由,容许小伙伴本身选择预览版的版本推送,自动打包,这样就能够在项目中使用此Tag 打出的预览版的代码。此时的 commit 其余小伙伴也能构建,回滚代码的时候也能够在公共服务器找到 NuGet 包或切换到对应版本的源代码性能

在 VisualStudio 的帮助下,使用推Tag打包的成本很是低,由于在 VS 里面只须要简单5次点击加上输入版本号就能完成 Tag 新建和推送,详细请看 VisualStudio 如何快速添加一个 Git Tag 推送测试

在本地推Tag打包还有一个好处是能提高很多的效率,有不少团队例如我如今的团队以前就是使用 jenkins 打包,这个工具太强大而让上手和维护成本都特别高,加上使用的小伙伴太多,服务器性能不足,每次打包都须要等待缓慢的系统响应。而经过 Tag 打包的方式能够隐藏这部分动做,全部动做都在本地执行。只有最后一步推送须要依赖 Git 服务的网络日志

相关文章
相关标签/搜索