Kinh nghiệm khó giành được đã dạy tôi rằng hầu hết mọi thứ thuộc về kiểm soát nguồn. (Nhận xét của tôi ở đây được tô màu bởi một thập kỷ rưỡi phát triển cho các hệ thống nhúng / viễn thông trên phần cứng độc quyền với các công cụ độc quyền và đôi khi khó tìm.)
Một số câu trả lời ở đây cho biết "không đặt nhị phân trong kiểm soát nguồn". Sai rồi. Khi bạn đang làm việc trên một sản phẩm có nhiều mã bên thứ ba và nhiều thư viện nhị phân từ các nhà cung cấp, bạn hãy kiểm tra trong các thư viện nhị phân . Bởi vì, nếu bạn không, thì đến một lúc nào đó bạn sẽ nâng cấp và bạn sẽ gặp rắc rối: bản dựng bị hỏng vì máy dựng không có phiên bản mới nhất; ai đó đưa cho anh chàng mới đĩa CD cũ để cài đặt; wiki dự án có các hướng dẫn cũ về cài đặt phiên bản nào; v.v. Tệ hơn nữa, nếu bạn phải hợp tác chặt chẽ với nhà cung cấp để giải quyết một vấn đề cụ thể và họ gửi cho bạn năm bộ thư viện trong một tuần, bạn phảicó thể theo dõi tập hợp nhị phân nào thể hiện hành vi nào. Hệ thống kiểm soát nguồn là một công cụ giải quyết chính xác vấn đề đó.
Một số câu trả lời ở đây cho biết "không đặt toolchain trong kiểm soát nguồn". Tôi sẽ không nói sai, nhưng tốt nhất là đặt chuỗi công cụ trong kiểm soát nguồn trừ khi bạn có hệ thống quản lý cấu hình (CM) vững chắc cho nó . Một lần nữa, hãy xem xét vấn đề nâng cấp như đã đề cập ở trên. Tệ hơn nữa, tôi đã làm việc trong một dự án nơi có bốn hương vị riêng biệt của chuỗi công cụ nổi xung quanh khi tôi được thuê - tất cả chúng đều được sử dụng tích cực ! Một trong những điều đầu tiên tôi đã làm (sau khi tôi quản lý để có một bản dựng hoạt động) là đặt chuỗi công cụ dưới sự kiểm soát nguồn. (Ý tưởng về một hệ thống CM vững chắc đã vượt quá hy vọng.)
Và điều gì xảy ra khi các dự án khác nhau đòi hỏi các bộ công cụ khác nhau? Tình huống cụ thể: Sau một vài năm, một trong những dự án đã được nâng cấp từ một nhà cung cấp và tất cả các Makefiles đã bị phá vỡ. Hóa ra họ đang dựa vào một phiên bản GNU mới hơn. Vì vậy, tất cả chúng tôi nâng cấp. Rất tiếc, Makefiles của dự án khác đã phá vỡ tất cả. Bài học: cam kết cả hai phiên bản GNU tạo và chạy phiên bản đi kèm với kiểm tra dự án của bạn.
Hoặc, nếu bạn làm việc ở một nơi mà mọi thứ khác vượt quá tầm kiểm soát, bạn sẽ có những cuộc trò chuyện như "Này, anh chàng mới bắt đầu hôm nay, CD cho trình biên dịch ở đâu?" "Dunno, đã không thấy họ kể từ khi Jack bỏ cuộc, anh ấy là người bảo vệ đĩa CD." "Uhh, không phải là trước khi chúng ta di chuyển lên từ tầng 2 sao?" "Có lẽ họ đang ở trong một cái hộp hoặc một cái gì đó." Và vì các công cụ này đã được ba năm tuổi, không có hy vọng có được đĩa CD cũ đó từ nhà cung cấp.
Tất cả các tập lệnh xây dựng của bạn thuộc về kiểm soát nguồn. Mọi điều! Tất cả các cách xuống các biến môi trường. Máy xây dựng của bạn sẽ có thể chạy bản dựng của bất kỳ dự án nào của bạn bằng cách thực thi một tập lệnh duy nhất trong thư mục gốc của dự án. ( ./build
là một tiêu chuẩn hợp lý; ./configure; make
gần như là tốt.) Kịch bản nên thiết lập môi trường theo yêu cầu và sau đó khởi chạy bất kỳ công cụ nào xây dựng sản phẩm (make, ant, v.v.).
Nếu bạn nghĩ rằng nó quá nhiều công việc, thì không. Nó thực sự tiết kiệm được một tấn công việc. Bạn cam kết các tệp một lần vào đầu thời gian, và sau đó bất cứ khi nào bạn nâng cấp. Không một con sói đơn độc nào có thể nâng cấp máy của chính mình và cam kết một loạt mã nguồn phụ thuộc vào phiên bản mới nhất của một số công cụ, phá vỡ bản dựng cho mọi người khác. Khi bạn thuê các nhà phát triển mới, bạn có thể bảo họ kiểm tra dự án và chạy ./build
. Khi phiên bản 1.8 có nhiều điều chỉnh hiệu năng và bạn tinh chỉnh mã, cờ trình biên dịch và biến môi trường, bạn muốn đảm bảo rằng các cờ trình biên dịch mới không vô tình được áp dụng cho các bản dựng phiên bản 1.7, vì chúng thực sự cần mã những thay đổi đi cùng với chúng hoặc bạn thấy một số điều kiện cuộc đua đầy lông.
Tuyệt vời nhất , nó sẽ cứu lấy mông của bạn một ngày nào đó: hãy tưởng tượng rằng bạn sẽ gửi phiên bản 3.0.2 cho sản phẩm của mình vào thứ Hai. Hoan hô, ăn mừng. Vào sáng thứ Ba, một khách hàng VIP gọi đến đường dây nóng hỗ trợ, phàn nàn về lỗi khẩn cấp, siêu tới hạn này trong phiên bản 2.2.6 mà bạn đã vận chuyển 18 tháng trước. Và bạn vẫn phải hỗ trợ nó theo hợp đồng và họ từ chối nâng cấp cho đến khi bạn có thể xác nhận chắc chắn rằng lỗi đã được sửa trong mã mới và chúng đủ lớn để khiến bạn nhảy. Có hai vũ trụ song song:
Trong vũ trụ nơi bạn không có thư viện, chuỗi công cụ và xây dựng tập lệnh trong kiểm soát nguồn và bạn không có hệ thống CM vững chắc .... Bạn có thể kiểm tra phiên bản mã phù hợp, nhưng nó mang lại bạn tất cả các loại lỗi khi bạn cố gắng xây dựng. Hãy xem, chúng ta đã nâng cấp các công cụ vào tháng 5 chưa? Không, đó là các thư viện. Ok, quay trở lại các thư viện cũ - chờ đã, có hai bản nâng cấp? À đúng rồi, có vẻ tốt hơn một chút. Nhưng bây giờ sự cố liên kết kỳ lạ này trông quen thuộc. Ồ, đó là vì các thư viện cũ không hoạt động với chuỗi công cụ mới, đó là lý do tại sao chúng tôi phải nâng cấp, phải không? (Tôi sẽ dành cho bạn sự đau đớn của phần còn lại của nỗ lực. Phải mất hai tuần và không có ai hạnh phúc khi kết thúc nó, không phải bạn, không phải quản lý, không phải khách hàng.)
Trong vũ trụ nơi mọi thứ đều nằm trong kiểm soát nguồn, bạn kiểm tra thẻ 2.2.6, chuẩn bị sẵn bản sửa lỗi trong một giờ hoặc lâu hơn, dành một hoặc hai ngày để tạo lại "lỗi VIP", theo dõi nguyên nhân, khắc phục bản phát hành hiện tại và thuyết phục khách hàng nâng cấp. Căng thẳng, nhưng gần như không tệ như vũ trụ khác nơi chân tóc của bạn cao hơn 3cm.
Như đã nói, bạn có thể đưa nó đi quá xa:
- Bạn nên cài đặt hệ điều hành chuẩn mà bạn có "bản sao vàng". Tài liệu về nó, có lẽ trong README nằm trong kiểm soát nguồn, để các thế hệ tương lai biết rằng phiên bản 2.2.6 trở về trước chỉ được xây dựng trên RHEL 5.3 và 2.3.0 và sau đó chỉ được xây dựng trên Ubuntu 11.04. Nếu bạn dễ dàng quản lý chuỗi công cụ theo cách này, hãy tìm kiếm nó, chỉ cần đảm bảo rằng đó là một hệ thống đáng tin cậy.
- Tài liệu dự án là cồng kềnh để duy trì trong một hệ thống kiểm soát nguồn. Các tài liệu dự án luôn đi trước mã, và không có gì lạ khi làm việc trên tài liệu cho phiên bản tiếp theo trong khi làm việc với mã cho phiên bản hiện tại. Đặc biệt nếu tất cả các tài liệu dự án của bạn là tài liệu nhị phân mà bạn không thể tìm hoặc hợp nhất.
- Nếu bạn có một hệ thống kiểm soát các phiên bản của mọi thứ được sử dụng trong bản dựng, hãy sử dụng nó ! Chỉ cần đảm bảo rằng nó dễ dàng đồng bộ hóa trên toàn bộ nhóm, để mọi người (bao gồm cả máy xây dựng) được kéo từ cùng một bộ công cụ. (Tôi đang nghĩ về các hệ thống như pbuilder của Debian và việc sử dụng virtualenv của python có trách nhiệm.)