2009-11-20 35 views
21

Tôi có một khách hàng muốn ứng dụng Rails của họ đã thành công trong một niche và áp dụng nó cho một niche tương tự. Phiên bản mới này của ứng dụng sẽ bắt đầu rất giống nhau: tất cả cùng chức năng, biểu tượng và màu sắc khác nhau. Tuy nhiên, nếu trang web mới thành công, chắc chắn bạn sẽ cần các tùy chỉnh quan trọng không nên áp dụng cho trang web gốc. Đồng thời, nếu lỗi được khắc phục và cải tiến được thực hiện cho một ứng dụng thì cả hai ứng dụng đều có thể chia sẻ những cải tiến đó.Chạy nhiều trang web từ cùng một codebase đường ray?

Ai đó có thể đề xuất các chiến lược hoặc tài nguyên giải quyết vấn đề này không? Làm cách nào để giữ các thay đổi áp dụng cho cả hai ứng dụng mất nhiều thời gian hơn để thử nghiệm và triển khai?

Vâng, tôi biết câu trả lời liên quan đến công cụ SCM, plugin, đá quý và Rails. Những công cụ này sẽ và đang được sử dụng. nhưng tôi muốn biết khicách để sử dụng những công cụ này để giải quyết vấn đề này.

Liên kết cũng được hoan nghênh.


Câu hỏi này là không giống như:

Multiple websites running on same codebase? Trong câu hỏi của tôi, tôi không chạy ứng dụng chính xác cùng với các thiết lập khác nhau.

How do you sync changes between multiple codebases? Tôi hỏi một câu hỏi tương tự, nhưng tôi đặc biệt hỏi về ứng dụng Rails.

Trả lời

29

Chúng tôi hiện đang làm việc với một thiết lập khá giống với những gì bạn mô tả.

Chúng tôi bắt đầu phát triển một ứng dụng Rails hơi lớn (bán hàng, quản lý chứng khoán, danh mục sản phẩm, v.v ...) cho khách hàng. Sau khi hoàn thành nó, đã có một số yêu cầu mới cho chức năng gần như giống hệt nhau.

Ứng dụng ban đầu, tuy nhiên, phải tiếp tục được duy trì, thêm các tính năng mới, sửa lỗi và không biết gì.

Các thiết bị mở rộng cần duy trì hầu hết các chức năng, nhưng thay đổi diện mạo và ngoại hình.

gì chúng tôi làm là làm theo một loạt các bước sau:

  1. Đầu tiên chúng tôi bắt đầu dọn dẹp mã, kéo tài liệu tham khảo hardcode các bảng, giảm và tối ưu hóa truy vấn, nhìn lên chỉ số mất tích và cách để cải thiện sử dụng ActiveRecord của chúng tôi
  2. Sau khi có phần hài lòng, chúng tôi bắt đầu phát triển các bài kiểm tra còn thiếu.Tôi không thể nhấn mạnh đủ lý do tại sao nó hữu ích, vì chúng tôi sẽ duy trì một codebase giống nhau cho một số ứng dụng và cần chức năng cốt lõi để được bảo vệ vì nó có thể là từ những thay đổi mới.
  3. Đó cũng là từ ảo thuật: chức năng cốt lõi. Chúng tôi đã bắt đầu chọn chức năng cơ sở có thể được sử dụng lại và mở rộng tất cả các mã chung. Điều đó đã cho chúng ta một sự kết hợp của bộ điều khiển, mô hình và quan điểm, mà chúng tôi bắt đầu thay đổi thành mô-đun, bổ sung và đá quý. Điều gì xảy ra ở đâu? Phụ thuộc rất nhiều vào mã của bạn. Theo quy tắc chung, chức năng không xử lý ngôn ngữ miền sẽ chuyển sang plugin (hoặc đá quý nếu không phụ thuộc quá nhiều vào Rails)
    1. Cách tiếp cận này đã dẫn chúng tôi đến một số bổ sung, đá quý mà chúng tôi sau đó kéo lại với nhau lắp ráp lại dự án ban đầu, và sau đó nó đã đến kho GIT của riêng nó. Bằng cách đó, chúng tôi đã có một kho lưu trữ "mẫu" chính được dán tất cả các thành phần và một số kho lưu trữ GIT khác cho từng phần tử.
    2. Cuối cùng, chúng tôi phát triển một hệ thống chủ đề dễ dàng (về cơ bản tải/stylesheets/themes /: theme_name/và nhận được theme_name từ DB). Vì nó là một dự án mạng nội bộ, chúng ta gần như có thể làm bất cứ điều gì với kiểu dáng CSS thích hợp. Tôi đoán là làm việc với IE bạn cần một cách tiếp cận phức tạp hơn.
    3. Sau đó, chúng tôi chỉ sử dụng kho lưu trữ chính đó phát triển chức năng mới trên đầu trang của nó.

Bây giờ, chúng ta xử lý những thay đổi đối với cơ sở cốt lõi như thế nào. Chúng tôi bắt đầu với kho lưu trữ mẫu của chúng tôi. Chúng tôi sửa chữa hoặc xác định nơi sửa chữa hoặc thay đổi nên và thay đổi nó ở đó hoặc trên gem/plugin tương ứng của nó. Sau khi thử nghiệm đúng cách, chúng tôi triển khai nó vào tài khoản GitHub của chúng tôi.

Cuối cùng, chúng tôi hợp nhất/rebase các dự án khác từ kho lưu trữ mẫu đó, nhận các bản cập nhật mới.

Nghe có vẻ hơi phức tạp, nhưng nó chỉ dành cho thiết lập. Dòng công việc hiện tại khá đơn giản và dễ dàng, với lợi thế nhất định khi làm việc với một số nhà phát triển mà không có vấn đề lớn hơn.

+0

Chà. Cảm ơn bạn. Điều đó cực kỳ hữu ích và được giải thích rõ ràng. – nicholaides

+0

Không sao, vui khi có thể giúp đỡ. Quản lý dự án đôi khi hơi khó, và một số thứ tự luôn hỗ trợ :) – Yaraher

+0

có đọc thêm nào mà bạn có thể giới thiệu cho phương pháp này không? – danieldekay

1

Chúng tôi đang làm điều tương tự tại công ty của mình. Ngoại trừ hiện tại của nó liên quan đến nhiều môi trường (sản xuất, thử nghiệm, phát triển). Chúng tôi đang sử dụng SVN làm SCM để giữ mã của chúng tôi và cho phép chúng tôi sao chép môi trường ổn định hiện tại và tạo các phiên bản riêng biệt của ứng dụng (và có khả năng thay đổi những thứ như biểu tượng hoặc chức năng nhất định). Tôi rất khuyên bạn nên chạy môi trường với Apache/Nginx và Phusion's Passenger. Điều này cho phép chúng tôi chạy tất cả các ứng dụng này một cách riêng biệt, trên cùng một/codebase tương tự (s). Và đó là nó. Chúng tôi phải DB, một sản xuất và một phát triển để giữ cho dữ liệu trực tiếp của chúng tôi riêng biệt, nhưng bạn có thể dễ dàng kết nối hai phiên bản ứng dụng với cùng một db theo cách này. Nó đã làm việc rất tốt cho chúng tôi cho đến nay trong việc có thể phát triển, thử nghiệm và triển khai nhiều ứng dụng web mà không cần lấy xuống máy chủ sản xuất chính.

+0

nếu bạn muốn biết thêm về cách cấu hình một số trong những mảnh, tôi muốn được hạnh phúc để cung cấp một số các tập tin cấu hình của chúng tôi, đặc biệt đối với hành khách, vì đó là một trong của những mảnh khó khăn nhất của câu đố để có được ngay lúc đầu. – Lukas

2

Với việc chạm nhẹ vào trang chính, có thể sử dụng mã Ruby từ nó trong khi mở rộng các mẫu và thay đổi kiểu. Tôi đã làm việc trên đó rộng rãi trong Django và cách bố trí có thể trông giống như:

project/ 
    sites/ 
     site_one/ 
      templates/ 
      models.py 
      settings.py 
      urls.py 
      views.py 
     site_two/ 
      templates/ 
      models.py 
      settings.py 
      urls.py 
      views.py 
    base_app/ 
    settings.py 

Bạn có thể thử làm điều gì đó tương tự trong Rails:

main_webapp/ 
    app/ 
    config/ 
    ... 
    sites/ 
     site_one/ 
      controllers/ 
      models/ 
      views/ 
     site_two/ 
      controllers/ 
      models/ 
      views/ 

Giả sử các chức năng giống hệt nhau trên các trang web nhưng họ chỉ có khác nhau bố trí và phong cách, sẽ không có hoặc rất ít mô hình và mã điều khiển. Nếu bạn muốn thêm nhiều chức năng hơn cho các trang web cụ thể, chỉ cần dán mã vào thư mục trang web mong muốn.

Django cũng có khái niệm là Sitesability để tìm mẫu trong một thư mục dự án cụ thể và thư mục ứng dụng. Bạn có thể thử sao chép các tính năng đó và đưa chúng đến Rails để đạt được chạy nhiều trang web từ một codebase.

Tôi nhận ra rằng bạn đang tìm kiếm giải pháp Rails nhưng bạn vẫn có thể kiểm tra cách thực hiện trong Django và sao chép một số tính năng hữu ích sang phía bên kia. Nếu tôi thích một tính năng cụ thể của Rails, tôi sẽ chuyển nó sang Django/Python.

+0

Điều này có thể thực hiện được trong Rails một cách dễ dàng bằng cách đặt đường dẫn cụ thể của trang web. Ví dụ cho các khung nhìn '' config.paths ['app/views']. Unshift ("app/views/# {config.site_name}") '' nhưng có thể thực hiện điều này cho hầu hết mọi thứ. Điều này là dành cho Rails 4 nhưng các phiên bản trước cũng có điều này. Thậm chí có thể thực hiện điều này trong bộ điều khiển bằng '' prepend_view_path'' –

0

Tôi biết điều này có thể là có thể sử dụng Git Submodules

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