2015-10-04 22 views
10

Dự án Rails mới nhất của tôi là nhiều hoặc ít hơn và thử nghiệm cho tôi để chia nhỏ nhiều thứ và tìm hiểu trong quá trình này. Tôi đã phiên bản mới nhất của Ruby quy định tại gemfile tôi:Có phải là một thực tế tồi để liệt kê phiên bản Ruby trong cả hai tệp Gemfile và .ruby-version Dotfile?

ruby '2.2.3'

Và tôi cũng có một dotfile .ruby-version trong dự án, với các nội dung sau:

2.2.3

khác hơn rõ ràng sao chép, có gì sai với điều này? Mục đích của cả hai công ước là gì? Nếu tôi chỉ nên có một quy ước để liệt kê phiên bản Ruby của tôi, thì tại sao tôi nên có một (Gemfile) trên phiên bản khác (dotfile)?

Hoàn toàn có thể có cả hai quy ước trong một dự án không?

Tôi sẽ là người duy trì duy nhất dự án thử nghiệm này, và không cảm thấy nó sẽ là một vấn đề phải duy trì một sự sao chép tinh tế này. Tôi không có ý định nâng cấp Ruby cho dự án này, và nếu tôi làm thế, tôi sẽ không gặp vấn đề gì khi nhớ làm điều đó ở cả hai nơi. Ngoài chi tiết này, tôi chắc chắn tránh được bất kỳ sự sao chép nào như vậy trong các codebases của ứng dụng của tôi.

+0

Tôi nghĩ rằng bạn không cần phải xác định phiên bản ruby ​​trong Gemfile của bạn ở tất cả . –

+3

Afaik '.ruby-version' đặt phiên bản Ruby cho RVM hoặc rbenv, nhưng Heroku lấy ví dụ lấy phiên bản Ruby từ Gemfile ([source] (https://devcenter.heroku.com/articles/ruby-versions)) . – spickermann

+0

Cảm ơn @spickermann, có vẻ như đó là một ý tưởng hay để có cả hai. – Todd

Trả lời

12

Chúng được phát triển bởi các nhóm khác nhau tại các thời điểm khác nhau và được sử dụng bởi các phần mềm khác nhau.

Liệt kê phiên bản Ruby trong Gemfile là feature in bundler.

Vì Gemfile chủ yếu chỉ được sử dụng bởi bundler, nó chủ yếu sẽ chỉ tác dụng khi bạn chạy với bundler - sử dụng bundle exec hoặc phần mềm (như Rails) tự động kích hoạt gói cho bạn. Đó là hiệu ứng chỉ đơn giản là để lỗi và từ chối chạy nếu bạn không sử dụng phiên bản của ruby ​​quy định. Đó là một yêu cầu - chạy theo ruby ​​này, hoặc tôi sẽ ném một cảnh báo lỗi bạn đang chạy dưới ruby ​​sai.

Tuy nhiên, heroku also pays attention đối với phiên bản được chỉ định trong Gemfile và sẽ chạy trong phiên bản đó. Heroku cũng quyết định sử dụng tính năng này trong bundler. Nhưng hầu hết các phần mềm khác, trên máy trạm của bạn, hoặc thậm chí travis, không sử dụng quy ước đó. (Travis làm cho bạn chỉnh sửa .travis.yml ENV của bạn để chỉ định phiên bản ruby ​​để sử dụng).

Các tính năng trong bundler được giới thiệu vào Bundler 1.2 vào tháng năm 2012.

File .ruby-version lần đầu tiên được giới thiệu bởi rvm, là người đầu tiên phiên bản ruby ​​người quản lý. Nếu bạn đang sử dụng rvm, và bạn chuyển sang một dự án direcotry với một tập tin .ruby-version, rvm sẽ tự động chuyển đổi vỏ của bạn để sử dụng phiên bản ruby ​​được chỉ định.

Tôi không chắc khi nào rvm giới thiệu tính năng này, nhưng tôi nghĩ trước tính năng "ruby" của Gemfile.

Vì rvm đã giới thiệu, phần mềm chuyển đổi phiên bản ruby ​​khác như rbenv và chruby cũng đã sử dụng phần mềm này để thực hiện tương tự - tự động chuyển sang phiên bản ruby ​​được chỉ định khi bạn cd vào thư mục. Mặc dù tôi nghĩ rằng với rbenv và chruby cả hai nó có thể là một tính năng tùy chọn.

Vì vậy, chúng là các tính năng khác nhau được giới thiệu và hỗ trợ bởi các gói phần mềm khác nhau vào các thời điểm khác nhau, làm những việc khác biệt một chút.

Tôi đồng ý sẽ gây khó chịu để duy trì cả hai và giữ cho chúng được đồng bộ hóa.

Cả hai đều thực sự là tùy chọn, bạn không cần phải sử dụng cả hai. Ngoại trừ việc bạn có thể cần phải sử dụng thông số ruby ​​Gemfile cho heroku, để cho nó biết ruby ​​bạn muốn nó chạy.

Tôi cũng không sử dụng cá nhân. Nhưng nếu bạn cần làm việc trong các phiên bản ruby ​​khác nhau trong các dự án khác nhau, và thấy thuận tiện khi có trình quản lý phiên bản ruby ​​(rvm, rbenv hoặc chruby) tự động chuyển sang phiên bản ruby ​​dự án phù hợp, .ruby-version có thể hữu ích.

Trừ mục đích heroku, việc liệt kê ruby ​​trong Gemfile chủ yếu là để giữ cho bản thân không mắc lỗi, ví dụ như khi triển khai. Hoặc có lẽ một triển khai tự động hóa trong nhà hoặc môi trường CI có thể sử dụng chúng giống như Heroku, hoặc có lẽ các ngăn xếp triển khai đám mây khác sẽ hoặc đã áp dụng nó. Tôi nghĩ rằng nhiều người đã tìm thấy nó không quá hữu ích mặc dù - điều này quá, tôi sẽ không sử dụng cho đến khi bạn chạy vào hoặc thấy một vấn đề mà nó giải quyết. Một sự bất tiện mà một số người có với các phiên bản ruby ​​trong Gemfile là với những viên hồng ngọc mới luôn luôn xuất hiện, bạn phải cập nhật tất cả các Gemfiles của bạn mọi lúc. Nói chung, vài năm gần đây các bản phát hành ruby ​​đều tương thích ngược, hạn chế sự cần thiết phải chắc chắn bạn đang sử dụng phiên bản ruby ​​chính xác, mã gần đây nhất sẽ chạy trên ruby ​​gần đây nhất, ngay cả khi ban đầu nó được viết cho một cái cũ hơn.

Tôi không tin rằng một trong hai tính năng cho phép bạn chỉ định một loạt các phiên bản ruby, như 2.2.* hoặc những gì có bạn.

Với cả hai/cả hai tính năng, chỉ sử dụng chúng nếu bạn cần hoặc tìm chúng hữu ích, bạn không cần phải sử dụng, và nó sẽ tốt (nếu khó chịu) để sử dụng cả hai, nếu bạn cần cả hai.

Vì Gemfile là mã ruby ​​trực tiếp, bạn về lý thuyết có thể Gemfile của bạn đọc tệp .ruby-version và tự động sử dụng giá trị đó làm giá trị Gemfile ruby. Nếu bạn muốn sử dụng cả hai, và "không lặp lại chính mình" với nó. Tôi không biết nếu đó là một điều phổ biến để làm, tôi chỉ nghĩ về nó. Nhưng nó sẽ hoạt động tốt.

+0

Cảm ơn bạn đã trả lời kỹ lưỡng. – Todd

+0

Ngoài ra, tôi có câu hỏi có liên quan tiềm ẩn tại đây: http://stackoverflow.com/questions/34905560/is-it-a-bad-practice-to-have-both-a-rvmrc-and-a-ruby-version -in-a-ruby-dự án, bạn nên quan tâm để cung cấp trí tuệ như vậy một lần nữa :) – Todd

6

Tôi nghĩ tốt hơn là tránh liệt kê cùng một thông tin hai lần trừ khi có lý do chính đáng - tức là, giữ cho nó khô.

Bạn có thể lưu trữ các phiên bản ruby ​​trong ".ruby phiên bản", và sau đó trong Gemfile làm điều gì đó như thế này:

ruby File.open('.ruby-version', 'rb') { |f| f.read.chomp } 
+2

Điều này là như vậy DRY nó chafes. Bạn sẽ cần tự thay đổi phiên bản trong '.ruby-version', thay thế nhiều phiên bản là không đáng kể với trình chỉnh sửa yêu thích của bạn. – Dennis

+0

@ Dennis đó là toàn bộ quan điểm của DRY. Ai đó có thể quên thực hiện tìm kiếm thay thế. Mã này cho bạn biết rằng tôi muốn sử dụng cùng một phiên bản như trong .ruby-version – PhilT

+2

Đây là một chút gọn gàng hơn và tương đương: ruby ​​File.read ('. Ruby-version', mode: 'rb').chomp – Empact

Các vấn đề liên quan