在假设使用依赖管理工具(例如 Maven 2)的情况下,寻找处理项目中主要依赖升级的最佳实践。
具体来说,我感兴趣的是:
欢迎提供您自己的经验或您遇到/发现有用的任何文章/论文。
编辑: 更新依赖版本号是微不足道的。我更多的是在寻找你如何根据对依赖项的更改(弃用、删除、参数/返回值类型的更改等)来处理你需要进行的更改。而且,如果将来有缓解这些变化的好方法,那么让您的依赖项保持最新应该可以让您掌握变化并防止浪费大量时间只是为了获得功能“更安全 x 2.1”。
最佳答案
处理依赖项更改的良好做法与应用程序设计的良好做法相同。您希望对您的体系结构进行分层,并尽量减少代码在每个依赖项上的广泛耦合,以便隔离更改,以便升级依赖项不会破坏应用程序的每个部分。接口(interface)编码并保持业务逻辑与基础设施代码分离。
对于次要升级(依赖项的升级点版本),如果您有一套全面的单元测试来检测由于 API 更改导致的故障,这会有所帮助。这就是为什么它有时有助于编写表面上看起来总是有效的琐碎测试的一个重要原因。这方面的一个例子是编写一个简单的 JDBC 单元测试来执行一个简单的查询。这似乎是一种浪费,直到您在数据库升级后发现 JDBC 驱动程序出现运行时问题(这发生在我身上)。
对于较大的更改(例如在 Spring 等框架的不兼容版本之间升级),如果您有一些自动化的功能或集成测试,或者至少有一个功能规范,您的 QA 人员可以通过它来验证高级功能,这会有所帮助.如果您要升级的框架 API 差异很大,需要进行广泛的代码更改,则单元测试可能不再相关。
管理从一个依赖版本到另一个不兼容版本的迁移的实际战术部分实际上取决于您在做什么。一个成熟的库将提供某种迁移路径,希望不会要求您重写所有内容。将与框架升级相关的代码更改与与实现新功能相关的更改分开是个好主意。这样,如果出现问题,您就会知道它与框架升级有关,而不是您在实现新功能时出现问题。
之所以如此困难,部分原因是在运行时,您的 JVM 中只能有一个特定依赖项的版本,因此您必须一次更新所有代码。 OSGi 通过允许不同的 OSGi bundle 在同一个环境中运行以依赖不同的依赖版本来解决这个特殊问题,因此您可以在运行时依赖不同的依赖版本。这就是 Eclipse 在不破坏其他插件的情况下管理插件依赖关系的方式。
关于java - 如何处理重大框架/依赖升级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405954/
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我