威尼斯手机平台-电子正规官网登录首页

热门关键词: 威尼斯手机平台,威尼斯登录首页,威尼斯正规官网
也就是说当我们在修改某个文件之后,在代码进入版本库之前
分类:热门贴子

Spring Boot 2.1.9 发布了,可从 repo.spring.io 和 Maven Central 获取。

图片 1

一 什么是配置管理


配置管理是一个过程,通过该过程,所有与项目相关的产物,以及它们之间的关系都将会被唯一的定义、存储、检索和修改。

这也就意味着我们应该有一些良好的配置管理策略去对项目中的配置进行管理,这样做的好处也是显而易见的,比如:

  • 我们可以完全再现所需要的任何环境(OS 的版本及其补丁、网络配置以及部署在其上的软件应用和及其配置)
  • 我们可以很轻松的对这些配置进行修改,并可以将这些修改部署到任意一种环境中
  • 我们可以很容易的看到已被部署到某个具体环境中的某次修改,并可以追溯到修改源,谁做的修改,什么是做的修改。

此版本包含 40 个修复、改进和依赖项升级。更新内容如下:

源代码管理是开发工作中很重要的一部分,甚至可以说是很多开发者的生命。但是我们往往在这方面犯错。我在这里列出了十条建议,可以说是戒律。虽然我会用 Subversion 和 .NET 来做示例,但这些戒律和你用的编程语言还有源码管理工具无关。1. 彻底抛弃 VSS!VSS 已死,就让它离去吧。它曾经很有用,但是现在其他 VCS已经远远超越了它。微软也决定从明年开始不再支持 VSS了。老实说,在1995年,VSS是一个伟大的工具,但是它的光环早已被它的晚辈——Subversion、Git 和 Mercurial 夺去。2. 没有进入版本库,它就不存在你应该每天把这条念一遍 ——“工作进展的唯一标准就是代码进了版本库”。在代码进入版本库之前,它相当于不存在。我承认你的代码藏在你机器的某个角落,但是对于其他人来讲,这有何意义?他们不能拿到你的最新版本,他们不能和你的版本合并,你也不能部署你的代码,一旦你的硬盘坏了,一切将烟消云散。如果你坚持执行这一条的话,你会发现其他的好习惯会随之而来。你会自觉的把任务分成小块并经常提交代码。你会更加频繁的更新、集成代码。最重要的是,经常提交代码说明了你正在做东西。3. 尽早提交,尽快提交,经常提交紧接上面一点,防止“幽灵代码”的唯一的方式就是把代码尽快的提交到版本库。这么做还有以下好处:每次提交都会生成一个新的版本,给你回滚的机会。假如你把代码搞乱了,你是希望回滚到一小时前还是一个星期前?间隔的时间越长,代码合并越困难。合并代码从来不是一件好玩的事情。当你好几天都不提交代码,你会突然发现,你已经累计了50个冲突要解决,你大概会疯掉。当你坚持经常提交代码的习惯以后,你会发现你的工作、代码提交会呈现出一定的规律。这个规律可以用来指导你的开发工作。当你发现你的团队好几天都没有代码提交的时候,你就会意识到 “something is wrong”。4. 在提交前检查你的更改提交代码到版本库看起来太简单了。反正在项目的根目录下有东西更改了,提交吧!这样会导致你提交了一堆垃圾。很多人看到下面的对话框的时候,往往是选择所有,然后搞定!于是你的代码库就被污染了,例如debug文件夹之类的。还有一些情况是人们提交代码前不检查自己到底更改了什么。例如一个项目配置文件,你会记得你改了什么吗?也许这次修改就不应该提交呢?如下图所示,这个Web.config文件为什么被修改了?你可以通过SVN工具对比来查看更改。对于一些可能被更改但是不需要进入版本库的文件,例如 Thumbs.db,你可以用 SVN 的“ignore”功能来排除它。5. 认真填写“commit messages”填写 commit message是有一点枯燥,但是请不要写“更新了一段代码”这种提交注释,你会把别人逼疯的。“commit message”的目的是解释你提交的代码中到底修改了什么。你也许不记得你一年前为什么提交一段代码,但是 SVN 的注释会让你想起来。所以,请不要写以下这些注释:修复了一个bug有一个拼写错误更新1024这什么都不是提交了你还有见过比这个更烂的注释吗?另外,任何一个人的注释应该是不一样的,而且从逻辑上来讲永远不可能一样,因为你每次提交代码的基础一定是不一样的,所以你做的事情不可能一样。6. 你必须自己提交代码,而不是让别人代劳这个听起来有些奇怪。但这种事情确实存在,而且我还遇到过不止一次。有一些团队为了保证代码库的干净,让一个人专门负责审核和提交代码。这并不是一个好习惯。首先,源代码管理并不是为了保持代码的纯净,起码在开发过程中不是这样。它的目的是让团队更频繁的集成各自的工作,当有问题的时候可以回退。在这个过程中,并不需要每一步都很完美。只有在版本发布的时候,我们才需要,或者尝试去达到“干净的代码”。还有,从开发者的角度来看,这么做等于没有源代码管理。因为它意味着没有代码集成,没有回退,没有blame log,什么都没有。你只是坐在那里写代码,然后在你也无法确定的时间把代码交给你的老板。7. 数据库的版本控制是必须的这是有很多人想做,但是觉得很困难而做不到的一点。这里的问题是,很多应用没有数据库根本无法运行。所以如果你不把数据库加入版本控制的话,你的应用是不完整的。大部分的版本控制系统只针对文件系统工作,例如 HTML、CSS、图片、配置文件等任何保存在文件系统中的东西。但是对于数据库中的数据却无能为力。不过现在也有一些数据库版本控制工具,例如 Red Gate 出品的 SQL Source Control。关于这个工具我曾经写过很详细的文章 Rocking your SQL Sourc Control world with Red Gate,我在这里就不赘述了。总之,数据库的版本控制也很容易了!8. 编译出来的文件不应该加入版本控制简单的说,就是任何自动生成的东西都不应该放在版本库里面。以 .NET 为例,所有“bin”、“obj”文件夹下面的东西都不应该加入版本库。为什么?因为如果这么做了,你团队的其他人会恨死你的。每次他们更新代码都会用你的编译输出来替代他们的编译输出,会导致他们本地的很多东西不能用。另外一个原因是,你完全没有必要把这些编译输出放在版本控制里面,它们只是在浪费服务器的硬盘和带宽。9. 别人不在乎你的个人配置很多时候,人们没有意识到他们正在提交自己的个人配置到版本库。开发工具往往会生成一些配置文件,记录你的文件路径、字体设置、快捷键设置等等,这些东西只对你有用。以 .NET 项目为例。10. 依赖项也需要添加到版本库虽然这是最后一条,但也是很重要的。如果你的代码需要依赖第三方的类库或者文件,你需要把这些文件也添加到版本库。你不能认为程序在你的机器可以跑,就在别人的机器上也能跑。你团队的其他成员也许没有这些依赖的文件,他们更新了你的代码以后,会导致项目无法编译或者程序无法运行。我今天还遇到一个这样的问题。我拉下了很久以前的一个项目,然后出现下面的编译错误。这个项目也是我开发的,以前的工作环境总是有 NUnit 的,但是现在没有了,所以出现了这些错误。总结这十条的每一条都很简单,老实说都是很基础的东西:及时、尽早的提交代码,充分了解你提交的东西,并确认它们确实需要被提交到代码库,解释你的提交,自己提交自己的代码,不要忘记数据库版本控制,不要忘记依赖项。但请你忘记 VSS。英文原文:The 10 commandments of good source control management

二 使用版本控制


版本控制系统是保存文件多个版本的一种机制。也就是说当我们在修改某个文件之后,我们仍然可以访问该文件之前的任意一个修订的版本。

使用版本控制系统的目的:

  • 保存每个文件的所有版本的历史信息,并使之易于查找。
  • 使得分布式团队可以跟加高效的协作。

为了达到这样的目的,我么可以采纳下列的几条建议

1 对所有的内容进行版本控制

是对所有的内容进行版本控制,而不仅仅只是对源代码进行控制,这也是自己对版本控制的一个误区,在对源代码进行版本控制外,还应该对所开发的软件相关的产物都应该被置于版本控制之下。这些产物可能包含着测试代码、数据库脚本、构建和部署脚本、文档、库文件和应用软件所用的配置等。

只有将上述的所有内容进行版本控制,我们才可以完全享受到从持续集成、自动化部署、自动化测试到一键部署的所有好处。当然了,不是所有的东西都得提交到版本库中,比如说源代码经过编译后的二进制文件。

2 频繁的提交代码到主干

在开发中我们只有频繁的提交代码,才可以享受版本控制所带来的众多好处。一旦将每次的修改提交到版本库,那就意味着团队的所有人都可以看到这些变更,这也会促进内建质量的提高,一旦需到将代码回滚,那么我们也可以回退到离当前版本最近的可用版本,将损失最小化。

3 使用意义明显的提交注释

这样做的好处就是当构建失败的时候,我们可以很轻易的知道是谁破坏了构建,以及他为什么破坏了构建。一个优秀的注释应该包括:

  • 总结性描述
  • 细节性描述
  • 相关问题或者bug的链接

Bug 修复

  • 由 ApplicationContextAssert didNotHaveBean 产生的断言错误消息中的错字 #18372
  • WebFlux 不考虑执行器端点的生存时间缓存 #18339
  • 使用 ObjectProvider 时强制排序 #18333
  • Janino 的依赖关系管理不完整 #18225
  • Bindable.withExistingValue 删除注释 #18218
  • TestTypeExcludeFilter 无法检测到 JUnit 5 的 @testable 注释 #18214
  • 并发 EndpointRequest 调用可能导致 NPE #18211
  • Quartz 使用 JDBC 失败,但是没有 Liquibase #18153
  • 即使稍后导致 406 的 NO_CONTENT 状态,BasicErrorController 也会返回正文 #18136
  • 从不正确的嵌套 JarFile 获取注释 #18128
  • @ConditionalOnMissingBean 的某些用法不允许将定义为接口的 bean 导致具体实现回退 #18101
  • 存在 oauth2 客户端配置时,ReactiveManagementWebSecurityAutoConfiguration 不会回退 #17949
  • 主服务器 ResourceConfigCustomizers 不应应用于管理上下文 #17801
  • Devtools 处于活动状态时不接受自定义协议 #17214
  • DataSourceInitializedEvent 选择错误的数据源 #17061

详情可查看更新说明。

(文/开源中国)    

三 依赖管理


在软件开发中,最常见的外部依赖无非就是使用第三方的库文件,而这些库文件一般都是以二进制文件的存在,不会被团队的成员所修改,这也就意味着这些依赖一般不会频繁的更新,所以我们一般也不会将这些二进制文件放入到版本库中,我们最好将其放在统一的一个本地库中。

四 软件配置管理


1 配置与灵活性

在对软件进性配置时,我们一般应该总是先专注与提供具有高价值且可配置程度较低的功能,在真正需要时在添加可配置项。

2 配置的分类

我们一般在构建,部署,测试和发布过程中任何一个阶段引入配置,不建议在构建打包时引入配置,应该保证部署之前所有的包是一样的

3 应用程序的配置管理

  • 获取配置信息
    让所有应用程序通过一个中央服务系统得到他们所需的配置信息
  • 为配置项建模
    一个配置项取决于三个方面
    应用程序
    应用程序的版本
    运行环境(开发,测试,生产)
  • 系统配置的测试
  • 保证外部服务都开启
  • 对与配置项相关的功能进行自动化的冒烟测试

4 管理配置信息的原则

  • 确定注入配置的时机
  • 配置项和配置值分开存储
  • 总是自动化获取配置
  • 每个人应该都能容易的获取当前应用当前版本在当前环境下的配置信息
    命名简单易懂
  • 确保配置信息修改的模块化,改一边不会影响另一边
  • 不要重复定义配置项
  • 最少化配置
  • 避免过分设计
  • 确保对配置操作也有测试

五 环境管理


每一个应用程序都会依赖与硬件、软件、基础设施以及外部系统才能工作,而这些所依赖的东西就被称为是应用程序的环境。环境的配置和应用程序的配置应该是同等重要的。只有我们可以充分的给予了重视,我么才可能:

  • 避免人员离职产生的知识遗忘问题
  • 修复时间往往要耗费很长时间
  • 可以保持各个环境的统一

环境管理需要考虑的配置信息:

  • 操作系统(版本,补丁级别和配置设置)
  • 第三方包(版本,配置)
  • 网络拓扑
  • 所依赖的外部服务(版本,配置)
  • 现有的数据及其他相关信息

当我们在对环境配置进行管理时,我们应该建立一套自动创建的环境,这样可以使得自动创建环境比修复受损的环境要容易的多。

疑问
对软件配置的管理这个概念还不是很清楚。

本文由威尼斯手机平台发布于热门贴子,转载请注明出处:也就是说当我们在修改某个文件之后,在代码进入版本库之前

上一篇:【威尼斯正规官网】12本子在性质和易维护性方面有了料定的滋长,该意义信任于 LLVM for JIT 来编写翻译 SQL 查询 下一篇:没有了
猜你喜欢
热门排行
精彩图文