【问题标题】:Rails: pros/cons of specifying versions for the gems?Rails:为 gem 指定版本的优缺点?
【发布时间】:2013-12-27 22:23:08
【问题描述】:

我是 Rails 新手 -- 指定确切的(当前)gem 版本有什么优点和缺点?

这是我的引擎中的宝石:

s.add_dependency "haml-rails"
s.add_dependency "strip_attributes"
s.add_dependency "devise"
s.add_dependency "daemons"
s.add_dependency "delayed_job_active_record"
s.add_dependency "gravatar_image_tag"
  1. 添加版本能否确保未来版本的 gem 不会破坏应用程序?

  2. 但这是否意味着您不会得到任何错误修复?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 gem


    【解决方案1】:

    遵循semantic versioning 被认为是最佳实践。 总而言之,次要版本仅包含错误修复并且不更改 API,因此如果您想两全其美,请使用类似

    gem 'library', '~> 2.2'
    

    这样您将获得最高的 2.2 版本(例如 2.2.3),其中包含所有错误修复且没有重大更改。

    【讨论】:

    • 假设“库”遵循约定。 :)
    【解决方案2】:

    您的Gemfile.lock 将记录版本并为您锁定。

    使用它 - 与捆绑器一起使用。我目前必须维护一个 Rails 2.3 应用程序,而且我经常必须抵御那些认为他们已被邀请加入的最新版本的 gem。

    【讨论】:

      【解决方案3】:

      指定 gem 版本的优点:

      • 如果您指定了 gem 版本,然后有人将新的 gem 添加到 gemfile 并安装包,Gemfile.lock 只会为新的 gem 更改。如果您的版本没有明确说明,它们可能会意外更改多个 gem 安装。您可能正在开发某些功能,并且不小心包含了您没有注意到的 gem 更新。您确实应该在代码审查中发现这一点,但您可能不会。如果 gem 版本不明确,这种事情尤其常见,尤其是对初级人员。
      • 如果您不升级 Rails 版本,随着 gem 版本的增加,最终您可能会遇到问题,并且所有 gem 不再支持您的 Rails 版本。

      指定 gem 版本的缺点:

      • 如果您不指定 gem 的版本,并定期更新您的 Gemfile.lock,您将始终拥有最新的 gem,这可以带来许多好处,包括从 gem 中添加的功能以及改进安全性。
      • 指定 gem 的版本可能有点多余,因为 bundler 和你的 Gemfile.lock 文件应该有很多管理 gem 版本的责任。从这个角度来看,开发人员应该“让工具完成工作”,而不是自己对 gem 版本进行微观管理。
      • 如果您个人负责定期更新您的 Gem,您可能永远无法绕过它。

      两全其美可能是明确指定版本,然后在可能的情况下使用自动更新依赖项的工具,以便 gem 更新最终成为单独的提交。这样,如果它们导致错误或破坏测试,则更容易追踪原因。此类工具的一些示例是 gemnasiumdependabot。如果您还引入了 javascript 库,那么这也是一个很好的做法。

      针对您的具体问题:

      1. 是的,明确版本意味着未来对该特定 gem 的更新不会破坏您的应用。
      2. ...但是,是的,这也意味着您不会获得错误修复或安全改进。这是选择一种方式而不是另一种方式的权衡。

      【讨论】:

        猜你喜欢
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多