Nếu bạn làm theo các đề xuất của tôi bên dưới (tôi đã làm trong nhiều năm), bạn sẽ có thể:
- đặt mỗi dự án ở bất kỳ đâu trong quyền kiểm soát nguồn, miễn là bạn giữ nguyên cấu trúc từ thư mục gốc của dự án trở xuống
- xây dựng từng dự án ở bất kỳ đâu trên mọi máy, với rủi ro tối thiểu và sự chuẩn bị tối thiểu
- xây dựng mỗi dự án hoàn toàn độc lập, miễn là bạn có quyền truy cập vào các phụ thuộc nhị phân của nó (thư mục "thư viện" và "đầu ra" cục bộ)
- xây dựng và làm việc với bất kỳ tổ hợp dự án nào, vì chúng độc lập
- xây dựng và làm việc với nhiều bản sao / phiên bản của một dự án duy nhất, vì chúng độc lập
- tránh làm lộn xộn kho lưu trữ kiểm soát nguồn của bạn với các tệp hoặc thư viện được tạo
Tôi đề nghị (đây là thịt bò):
Xác định từng dự án để tạo ra một có thể phân phối chính, chẳng hạn như .DLL, .EXE hoặc .JAR (mặc định với Visual Studio).
Cấu trúc mỗi dự án như một cây thư mục với một gốc duy nhất.
Tạo một tập lệnh xây dựng tự động cho từng dự án trong thư mục gốc của dự án để xây dựng nó từ đầu, KHÔNG phụ thuộc vào IDE (nhưng không ngăn nó được xây dựng trong IDE, nếu khả thi).
Xem xét nAnt cho các dự án .NET trên Windows hoặc thứ gì đó tương tự dựa trên hệ điều hành, nền tảng mục tiêu của bạn, v.v.
Làm cho mọi tập lệnh xây dựng dự án tham chiếu đến các phụ thuộc bên ngoài (bên thứ 3) của nó từ một thư mục "thư viện" được chia sẻ cục bộ duy nhất, với mọi nhị phân HOÀN TOÀN được xác định theo phiên bản: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Làm cho mọi tập lệnh xây dựng dự án xuất bản có thể phân phối chính đến một thư mục "đầu ra" được chia sẻ cục bộ duy nhất: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Làm cho mọi tập lệnh xây dựng dự án tham chiếu đến các phụ thuộc của nó thông qua các đường dẫn tuyệt đối có thể định cấu hình và được tạo phiên bản đầy đủ (xem ở trên) trong thư mục "thư viện" và "đầu ra" VÀ KHÔNG CÓ Ở ĐÂU.
KHÔNG BAO GIỜ để một dự án tham chiếu trực tiếp đến một dự án khác hoặc bất kỳ nội dung nào của nó - chỉ cho phép tham chiếu đến các phân phối chính trong thư mục "đầu ra" (xem ở trên).
Làm cho mọi tập lệnh xây dựng dự án tham chiếu các công cụ xây dựng cần thiết của nó bằng một đường dẫn tuyệt đối có thể định cấu hình và có phiên bản đầy đủ: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Làm cho mỗi dự án xây dựng kịch bản nội dung nguồn tài liệu tham khảo bằng một đường dẫn tuyệt đối so với thư mục gốc của dự án: ${project.base.dir}/src
, ${project.base.dir}/tst
(cú pháp khác nhau theo từng công cụ xây dựng).
LUÔN LUÔN yêu cầu tập lệnh xây dựng dự án tham chiếu MỌI tệp hoặc thư mục thông qua một đường dẫn tuyệt đối, có thể định cấu hình (bắt nguồn từ một thư mục được chỉ định bởi một biến có thể định cấu hình): ${project.base.dir}/some/dirs
hoặc ${env.Variable}/other/dir
.
KHÔNG BAO GIỜ cho phép một tập lệnh xây dựng dự án tham chiếu BẤT CỨ ĐIỀU GÌ với một đường dẫn tương đối như .\some\dirs\here
hoặc ..\some\more\dirs
, LUÔN LUÔN sử dụng đường dẫn tuyệt đối.
KHÔNG BAO GIỜ cho phép tập lệnh xây dựng dự án tham chiếu BẤT CỨ ĐIỀU GÌ bằng cách sử dụng một đường dẫn tuyệt đối không có thư mục gốc có thể định cấu hình, như C:\some\dirs\here
hoặc \\server\share\more\stuff\there
.
Đối với mỗi thư mục gốc có thể định cấu hình được tham chiếu bởi một kịch bản xây dựng dự án, hãy xác định một biến môi trường sẽ được sử dụng cho các tham chiếu đó.
Cố gắng giảm thiểu số lượng biến môi trường bạn phải tạo để cấu hình từng máy.
Trên mỗi máy, hãy tạo một tập lệnh shell xác định các biến môi trường cần thiết, các biến này cụ thể cho máy THAT (và có thể cụ thể cho người dùng đó, nếu có liên quan).
KHÔNG đưa tập lệnh shell cấu hình máy cụ thể vào điều khiển nguồn; thay vào đó, đối với mỗi dự án, hãy cam kết một bản sao của tập lệnh trong thư mục gốc của dự án dưới dạng mẫu.
YÊU CẦU mỗi tập lệnh xây dựng dự án để kiểm tra từng biến môi trường của nó và hủy bỏ bằng một thông báo có ý nghĩa nếu chúng không được xác định.
YÊU CẦU mỗi tập lệnh xây dựng dự án để kiểm tra từng tệp thực thi của công cụ xây dựng phụ thuộc của nó, tệp thư viện bên ngoài và tệp có thể phân phối dự án phụ thuộc và hủy bỏ với một thông báo có ý nghĩa nếu những tệp đó không tồn tại.
CHỐNG lại cám dỗ đưa BẤT KỲ tệp được tạo nào vào kiểm soát nguồn - không có dự án phân phối, không có nguồn được tạo, không có tài liệu được tạo, v.v.
Nếu bạn sử dụng IDE, hãy tạo bất kỳ tệp điều khiển dự án nào bạn có thể và không cam kết chúng với quyền kiểm soát nguồn (điều này bao gồm các tệp dự án Visual Studio).
Thiết lập một máy chủ với bản sao chính thức của tất cả các thư viện và công cụ bên ngoài, để sao chép / cài đặt trên máy trạm của nhà phát triển và máy xây dựng. Sao lưu nó, cùng với kho lưu trữ kiểm soát nguồn của bạn.
Thiết lập một máy chủ tích hợp liên tục (máy xây dựng) KHÔNG có bất kỳ công cụ phát triển nào.
Hãy xem xét một công cụ để quản lý các thư viện và phân phối bên ngoài của bạn, chẳng hạn như Ivy (được sử dụng với Ant).
KHÔNG sử dụng Maven - ban đầu nó sẽ khiến bạn hạnh phúc, và cuối cùng khiến bạn khóc.
Lưu ý rằng không có điều nào trong số này là cụ thể cho Subversion và hầu hết nó là chung cho các dự án được nhắm mục tiêu đến bất kỳ hệ điều hành, phần cứng, nền tảng, ngôn ngữ nào, v.v. Tôi đã sử dụng một chút cú pháp dành riêng cho hệ điều hành và công cụ, nhưng chỉ để minh họa- -Tôi tin rằng bạn sẽ dịch sang hệ điều hành hoặc công cụ bạn chọn.
Lưu ý bổ sung liên quan đến các giải pháp Visual Studio: không đặt chúng trong kiểm soát nguồn! Với cách tiếp cận này, bạn không cần chúng hoặc bạn có thể tạo chúng (giống như các tệp dự án Visual Studio). Tuy nhiên, tôi thấy tốt nhất nên để các tệp giải pháp cho các nhà phát triển cá nhân tạo / sử dụng khi họ thấy phù hợp (nhưng không đăng ký kiểm soát nguồn). Tôi giữ một Rob.sln
tệp trên máy trạm của mình mà từ đó tôi tham chiếu (các) dự án hiện tại của mình. Vì tất cả các dự án của tôi đều độc lập, tôi có thể thêm / bớt các dự án theo ý muốn (có nghĩa là không có tham chiếu phụ thuộc dựa trên dự án).
Vui lòng không sử dụng các công cụ bên ngoài Subversion (hoặc tương tự trong các công cụ khác), chúng là một phản mẫu và do đó, không cần thiết.
Khi bạn triển khai tích hợp liên tục hoặc thậm chí khi bạn chỉ muốn tự động hóa quá trình phát hành, hãy tạo một tập lệnh cho nó. Tạo một tập lệnh shell duy nhất: lấy các tham số của tên dự án (như được liệt kê trong kho lưu trữ) và tên thẻ, tạo một thư mục tạm thời trong một thư mục gốc có thể định cấu hình, kiểm tra nguồn cho tên dự án và tên thẻ đã cho (bằng cách xây dựng URL thích hợp trong trường hợp Subversion) đến thư mục tạm thời đó, thực hiện một bản dựng sạch chạy các thử nghiệm và đóng gói tệp có thể phân phối. Tập lệnh shell này nên hoạt động trên bất kỳ dự án nào và phải được kiểm tra nguồn kiểm soát như một phần của dự án "công cụ xây dựng" của bạn. Máy chủ tích hợp liên tục của bạn có thể sử dụng tập lệnh này làm nền tảng để xây dựng các dự án hoặc thậm chí có thể cung cấp tập lệnh này (nhưng bạn vẫn có thể muốn tập lệnh của riêng mình).
@VonC: Bạn KHÔNG muốn làm việc mọi lúc với "ant.jar" chứ không phải "ant-abcdjar" sau khi bạn bị cháy khi tập lệnh xây dựng của bạn bị hỏng vì bạn vô tình chạy nó với phiên bản Ant không tương thích. Điều này đặc biệt phổ biến giữa Ant 1.6.5 và 1.7.0. Nói chung, bạn LUÔN muốn biết phiên bản cụ thể nào của MỌI thành phần đang được sử dụng, bao gồm cả nền tảng của bạn (Java ABCD) và công cụ xây dựng của bạn (Ant EFGH). Nếu không, cuối cùng bạn sẽ gặp phải một lỗi và vấn đề LỚN đầu tiên của bạn sẽ là theo dõi phiên bản của các thành phần khác nhau của bạn có liên quan. Nó chỉ đơn giản là tốt hơn để giải quyết vấn đề đó trước.