Câu trả lời:
Cờ tính năng là một thiết bị kỹ thuật có thể được sử dụng để tránh chi nhánh tồn tại lâu dài và xung đột trong phát triển sản phẩm. Dưới đây là cách nó có thể được sử dụng bối cảnh của ngôn ngữ hướng đối tượng để giúp các nhà phát triển cộng tác trên một tính năng sản phẩm cụ thể trong khi một ngôn ngữ xử lý một phiên bản mới. Giải pháp này cũng có thể được sử dụng trong các bối cảnh không hướng đối tượng, với điều kiện là tồn tại một giao diện. ( xem hệ thống mô-đun OCaml.)
Với mục đích minh họa, chúng tôi giả sử một công cụ trình bày các báo cáo về dữ liệu được lưu trữ trong cơ sở dữ liệu. Mã này thực hiện một lớp DatabaseClient được sử dụng để thực hiện các yêu cầu. Khi tập dữ liệu phát triển, rõ ràng là một số bố cục dữ liệu thay thế sẽ cải thiện hiệu suất ứng dụng. Do đó Alice sẽ phát triển một phiên bản mới của DatabaseClient có thể truy xuất dữ liệu từ các cấu trúc với bố cục được cải thiện, trong khi Bob sẽ duy trì DatabaseClient lịch sử .
Với các bước sau, Alice và Bob có thể hợp tác trên các nhánh sống ngắn trong khi giảm thiểu xung đột của họ.
Alice đổi tên DatabaseClient thành DatabaseClient_v1 và tạo một lớp ủy nhiệm có tên là DatabaseClient sử dụng một đối tượng DatabaseClient_v1 và thực hiện một giao diện gọi là DatabaseClientInterface. (Nếu có thể, DatabaseClientInterface này phải là một mã xác thực nhưng các ngôn ngữ gõ vịt không phải lúc nào cũng hỗ trợ điều này.)
Bob xem xét các thay đổi được thực hiện bởi Alice trong 1 và biết rằng công việc bảo trì của anh ta sẽ xảy ra trên DatabaseClient_v1 .
Alice giới thiệu một cờ cấu hình mới trong ứng dụng chi phối hành vi của đại biểu DatabaseClient và thực hiện một trình giữ chỗ DatabaseClient_v2 , một lớp thực hiện DatabaseClientInterface mà tất cả các phương thức của họ đều ném ngoại lệ.
Sau này, Alice và Bob có thể hợp tác mà không cần đồng bộ hóa rõ ràng, bởi vì mã được viết trong các lần lặp tương ứng của họ phải tuân theo DatabaseClientInterface . Điều này giảm thiểu rủi ro của một cuộc xung đột do công việc đồng thời của họ.
Lặp đi lặp lại từ Alice có thể rất ngắn, như thực hiện thử nghiệm, thực hiện phương pháp hoặc thậm chí làm một phần, bởi vì trong sản xuất, mã không được chọn để sử dụng và không cần phải có đầy đủ chức năng. Testsuite tự động phải được cấu hình để DatabaseClientInterface luôn sử dụng DatabaseClient_v1 trong khi Alice có thể dễ dàng chuyển đổi sang DatabaseClient_v2 khi chạy testsuite cục bộ - hoặc trong thiết lập CI tùy chỉnh. Khi mọi thứ đã sẵn sàng, một cam kết duy nhất có thể thực hiện thay đổi, bằng cách cập nhật giá trị cấu hình chi phối đại biểu DatabaseClient .
Các bước khá "dễ dàng", để chuyển sang ứng dụng cờ tính năng, bạn cần hai điều cơ bản:
Cơ bản của cờ tính năng là bật / tắt chúng, nhưng nhanh chóng bạn sẽ muốn phát hành một tính năng mới theo cách tăng tốc, ví dụ: 1 máy chủ trên 5 lưu trữ ứng dụng có tính năng "bật" để bắt đầu, sau đó bạn bật tính năng này trên một máy chủ khác, cho đến khi tất cả các máy chủ có tính năng "bật".
Điều này có nghĩa là bạn phải cẩn thận về tính năng của mình để tương thích với ứng dụng mà không có nó (ví dụ: cột thêm trong DB).
Khung tồn tại trong ngôn ngữ khác nhau để tránh reinventing the wheel, bây giờ bỏ duy trì một từ của Etsy có một thú vị readme để giải thích cách hoạt động.
Thế giới phần mềm nhúng thường sử dụng các cờ thời gian xây dựng, trong chính mã ứng dụng ( ví dụ #define
/ #ifdef
câu lệnh) và / hoặc trong các tệp cấu hình của công cụ xây dựng ( makefile
ví dụ: s).
Xây dựng cờ có thể được sử dụng, theo cách tương tự, không chỉ cho các tính năng, mà còn cho tất cả các loại tái cấu trúc mã, di chuyển, hỗ trợ gỡ lỗi, v.v.). Chúng cho phép cam kết trong nhánh tích hợp thay đổi một phần hoặc chưa được xác minh mà không phá vỡ bản dựng hoặc gây ra hồi quy trong các tính năng / dự án đã hoạt động trong chi nhánh. Tuyệt vời để xử lý các sửa lỗi điểm cùng với các thay đổi tiến độ lớn / rủi ro / chậm (nếu không sẽ yêu cầu một nhánh tồn tại lâu) theo cách tích hợp liên tục.
Nhưng ngoài việc xác minh mã chi nhánh đã có cho hồi quy, bạn cũng có thể thực hiện xác minh tiến trình / độ ổn định của mã mới. Đối với điều này, các cờ thời gian xây dựng cần phải được bật.
Một cách để chuyển đổi các cờ sẽ được sử dụng, trong một đường dẫn xác minh riêng của hệ thống CI của cùng một chi nhánh (nếu nó có hỗ trợ cho chức năng đó), một bản vá để chuyển cờ - được áp dụng cho một không gian làm việc riêng trước khi xây dựng. Một bộ tạo tác khác nhau sẽ được xây dựng trong không gian làm việc này và sau đó được xác minh.
Ngoài ra, một nhánh tính năng tồn tại lâu có thể được kéo từ nhánh tích hợp chính, nhưng thay đổi duy nhất trong nhánh tính năng này sẽ là cờ được bật. Do sự thay đổi nhỏ này, nhánh tính năng có thể được tự động đồng bộ hóa cực kỳ nhanh - thực tế che khuất rất gần nhánh tích hợp chính. Một thực thi CI riêng trên nhánh này sẽ không cần một bản vá sơ bộ nữa. Sẽ rất tầm thường khi mang theo nhánh tính năng như vậy ngay cả trong một khoảng thời gian dài.
Cũng có thể tạo ra, trong nhánh tích hợp chính, các tạo phẩm xây dựng mới thực sự sẽ chỉ là bản sao của các tạo phẩm xây dựng hiện có nhưng với các cờ được bật. Bằng cách này, cả patchfile sơ bộ lẫn nhánh tính năng đều không cần thiết để xác minh mã mới, ngay trong nhánh chính.