2009-08-17 7 views
11

Tôi làm việc trong một cửa hàng nhỏ, nơi chúng tôi có rất nhiều mã Cobol cũ và nơi một methology đã được thông qua để cho phép chúng tôi giảm thiểu forking và phân nhánh càng nhiều càng tốt.Một methology cho phép một mã Java đơn cơ sở bao gồm nhiều phiên bản khác nhau?

Đối với một thông cáo cho chúng tôi có ba cấp độ:

  • CORE - lớp dưới cùng, mã này là chung cho tất cả các phiên
  • GROUP - Mã bắt buộc chung cho một số khách hàng.
  • KHÁCH HÀNG - mã tùy chọn dành riêng cho một khách hàng.

Khi chương trình là cần thiết, nó được tìm kiếm lần đầu tiên trong CUSTOMER, sau đó trong GROUP và cuối cùng là CORE. Một ứng dụng đã cho chúng ta gọi nhiều chương trình mà tất cả đều được tìm kiếm trong chuỗi này (nghĩ rằng các tệp exe và PATH trong Windows).

Chúng tôi cũng có các chương trình Java tương tác với mã di sản này, và khi nhóm khách hàng tìm kiếm cốt lõi không cho vay dễ dàng với Java, nó có xu hướng phát triển trong một chi nhánh CVS cho mỗi khách hàng, đòi hỏi quá nhiều duy trì. Phần Java và phần phụ trợ có xu hướng được phát triển song song.

Tôi đã được chỉ định để tìm ra cách để làm cho hai thế giới gặp nhau. Về cơ bản chúng tôi muốn một môi trường Java cho phép chúng tôi có một cơ sở mã duy nhất với các nguồn cho mỗi bản phát hành, nơi chúng tôi có thể dễ dàng chọn nhóm và khách hàng và làm việc với ứng dụng như nó đi cho khách hàng đó, và sau đó dễ dàng chuyển sang một bộ mã hóa khác và khách hàng R THNG đó. Tôi đã nghĩ về một kịch bản có lẽ với một dự án Eclipse cho mỗi lõi, khách hàng và nhóm và sau đó sử dụng Bộ dự án để chọn những dự án cần thiết cho một kịch bản nhất định. Vấn đề tôi không thể hiểu được, là cách chúng tôi tạo ra mã mạnh mẽ trong các dự án CORE sẽ hoạt động bất kể nhóm và khách hàng nào được chọn. Một lớp nhà máy mà biết lớp con của một đối tượng Class được truyền để gọi thay cho mỗi và mỗi mới?

Những người khác phải có các vấn đề về quản lý cơ sở mã tương tự. Bất kỳ ai có kinh nghiệm chia sẻ?


EDIT: Kết luận cho vấn đề này ở trên đã được rằng CVS cần phải được thay thế bằng một hệ thống quản lý mã nguồn phù hợp hơn để đối phó với nhiều chi nhánh kiêm nhiệm và sự di cư của nguồn từ một thành phần cho người khác trong khi vẫn giữ lịch sử. Lấy cảm hứng từ việc di chuyển gần đây bởi slf4j và logback, chúng tôi hiện đang xem xét git khi nó xử lý các nhánh rất tốt. Chúng tôi đã xem xét subversion và mercurial quá nhưng git xuất hiện để được tốt hơn cho vị trí duy nhất, các dự án multibranched. Tôi đã hỏi về Perforce trong một câu hỏi khác, nhưng khuynh hướng cá nhân của tôi hướng tới các giải pháp nguồn mở cho một cái gì đó quan trọng như thế này.


EDIT: Sau khi cân nhắc kỹ hơn, chúng tôi thấy rằng điểm đau thực tế của chúng tôi là sử dụng chi nhánh trong CVS và dễ dàng làm việc với chi nhánh! Kết luận được sửa đổi là chúng tôi có thể làm điều này với CVS một mình, bằng cách chuyển sang một khu rừng của các dự án java, mỗi dự án tương ứng với một trong các cấp trên và sử dụng các đường dẫn xây dựng Eclipse để gắn chúng lại với nhau để mỗi phiên bản CUSTOMER kéo vào dự án GROUP và CORE thích hợp. Chúng tôi vẫn muốn chuyển sang một hệ thống phiên bản tốt hơn nhưng đây là một quyết định rất quan trọng nên chúng tôi muốn trì hoãn nó càng nhiều càng tốt.


EDIT: Bây giờ tôi đã thực hiện bằng chứng khái niệm CORE-GROUP-CUSTOMER bằng cách sử dụng Google Guice 2.0 - thẻ @ImplementedBy chỉ là những gì chúng tôi cần. Tôi tự hỏi mọi người khác làm gì? Sử dụng nếu tất cả các nơi trên?


EDIT: Bây giờ tôi cũng cần chức năng này cho các ứng dụng web. Guice cho đến khi JSR-330 được đặt đúng vị trí. Bất kỳ ai có trải nghiệm phiên bản?


EDIT: JSR-330/299 hiện đang ở vị trí với việc thực hiện tham khảo JEE6 Weld dựa trên JBoss Seam và tôi đã thực hiện lại các proof-of-concept với Weld và có thể thấy rằng nếu chúng tôi sử dụng @Alternative cùng với ... trong beans.xml chúng ta có thể nhận được hành vi mà chúng ta mong muốn. I E. cung cấp một triển khai mới cho một chức năng nhất định trong CORE mà không thay đổi một chút trong các lọ CORE. Đọc ban đầu về đặc tả Servlet 3.0 cho biết nó có thể hỗ trợ cùng chức năng cho ứng dụng web tài nguyên (không phải mã). Bây giờ chúng ta sẽ thử nghiệm ban đầu trên ứng dụng thực tế.

+8

+1 vì đây không phải là vấn đề của tôi. :) – cletus

+0

Cletus, heh, vì vậy tôi chỉ liệt kê tất cả các công việc được giao cho tôi, và ngay lập tức 100k nghiệp? –

+0

Nếu họ chắc chắn và đáng sợ như công việc này, chắc chắn rồi. :) – cletus

Trả lời

2

Tôi xin lỗi trước vì không trả lời trực tiếp câu hỏi của bạn. Bạn đang hỏi "làm thế nào chúng ta có thể thiết kế phần mềm của chúng tôi để tránh phải làm một loại kỹ thuật phát hành? Tôi không biết câu trả lời cho câu hỏi đó, nhưng tôi đã đọc mô tả của bạn và tôi lo lắng về nó. root, tôi nghĩ rằng đó là một trò chơi bị mất để làm cho công nghệ phần mềm cốt lõi của bạn cần được trợ giúp cho các công nghệ kỹ thuật phát hành của bạn. Những gì tôi đọc bạn nói là bạn muốn sử dụng Eclipse để thực hiện công việc mà phần mềm điều khiển phiên bản của bạn nên làm cho bạn.Điều đó không tấn công tôi như một giải pháp khả thi. Nếu vấn đề là "phân nhánh trong CVS quá đau đớn," thì tôi nghĩ giải pháp kỹ thuật là "di chuyển ra CVS đến cái gì đó cho phép phân nhánh và tích hợp mạnh mẽ hơn và dễ dàng hơn."

Trong thế giới phần mềm tự do, điều đó thường có nghĩa là Subversion. Một lựa chọn thương mại tốt là Perforce. Tôi có thể nói rằng tôi đã làm việc cho một công ty phát hành nhiều phiên bản phần mềm cho nhiều khách hàng và thường xuyên thay đổi tích hợp chéo từ một chi nhánh này sang chi nhánh khác. Chúng tôi sử dụng Perforce, và phân nhánh (và tích hợp) là đủ dễ dàng mà bất kỳ kỹ sư nào có thể và đã làm điều đó một cách thường xuyên mà không làm gián đoạn công việc hàng ngày của họ.

Hy vọng điều này sẽ hữu ích.

+0

Bạn có thể đúng trong quan sát của mình.Chúng tôi phân nhánh toàn bộ các dự án quá cứng nhắc cho nhu cầu của mình, vì vậy chúng tôi cần một kho lưu trữ nguồn phù hợp với chúng tôi. CVS đã "đủ tốt" trong một thời gian dài, vì vậy tôi đã không suy nghĩ bên ngoài hộp đó. –

+0

Được chọn làm câu trả lời khi bạn chỉ ra chính xác điểm đau là hệ thống quản lý nguồn. –

+0

+1, câu trả lời hay nhất không phải là khi bạn thêm thứ gì đó ngoài việc loại bỏ thứ gì đó – Gorgen

1

Phải đồng ý với @peterb, Eclipse không phải là cách để quản lý việc này. Việc phân nhánh trong hệ thống kiểm soát nguồn của bạn có nghĩa là để phục vụ cho mục đích này, vì vậy hãy chọn một cái làm cho việc này dễ dàng nhất có thể (Subversion sẽ hoạt động tốt).

Bạn cũng có thể muốn xem xét sử dụng Maven (hoặc một cái gì đó tương tự) để sau đó xác định quản lý phụ thuộc của bạn cho các tình huống khách hàng khác nhau của bạn. Sau đó, bạn có thể tạo ra cả hai dự án nhật thực của bạn từ maven để làm phát triển thực tế của bạn, cũng như bản phát hành được xây dựng.

+0

Tôi đã nghĩ đến "mvn eclipse: eclipse" nhưng chúng tôi rất muốn tránh xa maven vì chúng tôi không đồng ý với nó nên được thực hiện :) –