2011-09-07 30 views
5

Tôi đang cố gắng tự động hóa quá trình xây dựng các dự án của mình (cả java và .net) bằng cách sử dụng Ant và MSBuild. Tôi đã đọc về chúng và biết cách viết các kịch bản xây dựng trong Ant và MSBuild. Nhưng tôi tự hỏi, liệu có bất kỳ nguyên tắc hay phương pháp hay nhất nào để viết kịch bản xây dựng nói chung không? Dưới đây là hai điều tôi đã tìm thấy, nhưng tôi muốn nghe nhiều hơn từ các nhà phát triển khác.Bất kỳ phương pháp hay nhất nào để viết kịch bản xây dựng trong Ant hoặc MSBuild

  • Trong khi viết một xây dựng kịch bản, chỉ cần dựa vào những yếu tố được đặt tại sự kiểm soát nguồn và có sẵn trong thư mục làm việc trong khi kiểm tra ra các nguồn. KHÔNG viết kịch bản xây dựng là phụ thuộc vào các mục không được giữ trên điều khiển nguồn.
  • Nếu dự án chứa một tập hợp các hệ thống con và mỗi hệ thống con có tập lệnh xây dựng riêng của nó, tệp xây dựng của dự án chỉ cần gọi tập lệnh xây dựng của hệ thống con. Bên cạnh đó, những tập tin này nên nhập một xây dựng tập tin phổ biến có chứa các mục tiêu như biên dịch, kiểm tra, đóng gói, vv

Tôi đã nhìn thấy this post là tốt, nhưng nó là chi tiết về cách viết các nhiệm vụ. Tôi cần hướng dẫn cấp cao hơn, như đã đề cập ở trên.

Dưới đây là những hướng dẫn tôi thu thập được từ câu trả lời:

  1. Run mỗi xây dựng trong một môi trường sạch sẽ. Điều đó có nghĩa là mỗi tập lệnh xây dựng cần có mục tiêu clean.
  2. Tạo tập lệnh thường bao gồm các mục tiêu compile, packagetest.
  3. Nếu một sản phẩm có các dòng phát triển khác nhau (ví dụ: dev, release), tất cả chúng phải có cùng một tập lệnh xây dựng. Tuy nhiên, các thông số khác nhau phải được chuyển cho các tập lệnh này.
  4. Các bản dựng được thực hiện trên các dòng phát triển thường chứa biên dịch, đóng gói, triển khai và cài đặt các bước. Nhưng xây dựng trên bản phát hành dòng bao gồm các bước tiếp theo, chẳng hạn như gắn thẻ sản phẩm và tạo ghi chú thay đổi nhật ký/phát hành.
  5. Tạo tập lệnh cũng phải được giữ trên kiểm soát nguồn.
  6. cố gắng giữ tất cả xây dựng thông tin trong xây dựng kịch bản, không phải trên máy chủ liên tục hội nhập (tre, TeamCity, vv)
  7. Nếu build của bạn sử dụng một tham số có thể thay đổi trong tương lai (ví dụ như địa chỉ mạng để sao chép xây dựng kết quả), không mã hóa nó thành tập lệnh xây dựng của bạn. thay vào đó, hãy sử dụng các thông số xây dựng để kiểm soát nó dễ dàng hơn .

Trả lời

4

Nếu bạn đang xây dựng các ứng dụng VisualStudio, bạn nên sử dụng msbuild hơn Ant. Lệnh msbuild sẽ thực hiện việc xây dựng bằng cách sử dụng tệp giải pháp mà các nhà phát triển của bạn đã tạo và về cơ bản mô phỏng cùng một bản dựng mà họ tạo.

Nếu bạn thực sự muốn tự động hóa mọi thứ, hãy xem Jenkins. Nó có một plugin có thể thực thi msbuild và sẽ tự động kích hoạt một bản dựng mỗi lần ai đó thực hiện thay đổi. Tôi sử dụng kết hợp fo msbuild và Ant với Jenkins. Tôi làm việc xây dựng bằng cách sử dụng msbuild, sau đó sử dụng Ant để thu thập và nén tất cả các tạo phẩm được tạo của tôi. Sau đó, mọi người có thể tải xuống các tạo tác được xây dựng trực tiếp từ Jenkins.

Bây giờ, với các ứng dụng Java của bạn, bạn sẽ phải sử dụng Ant. Tôi sử dụng các nguyên tắc sau đây

  • Mỗi tập lệnh xây dựng cần mục tiêu clean. Mục tiêu này loại bỏ bất kỳ tệp nào đã được thêm vào trong quá trình xây dựng, trả về thư mục làm việc về trạng thái trước khi số clean diễn ra.
  • tôi làm theo những gì Maven làm khi sử dụng tên mục tiêu, vì vậy mục tiêu của tôi là tên những thứ như sạch, biên dịch, và gói.
  • Cũng tuân thủ nguyên tắc Maven, tất cả các tệp được tạo của tôi được đặt trong thư mục target. Bằng cách đó, lệnh sạch sẽ của tôi chỉ đơn giản là có thể làm một <delete dir="${target.dir}/> và làm sạch tất cả mọi thứ lên tốt đẹp và lấp lánh.
  • Nếu tôi có tiểu dự án, mỗi tiểu dự án có tệp build.xml riêng. Tập tin build.xml của tôi chỉ đơn giản gọi tất cả các tệp build.xml của tiểu dự án.
  • Sử dụng Ivy. Thật dễ dàng để thiết lập và dễ sử dụng.Bạn không còn có vấn đề lưu trữ các tệp jar trong kho lưu trữ nguồn của bạn hoặc mất các phiên bản của tệp jar bạn đang phụ thuộc vào.
  • Heck, nếu bạn có thể, hãy sử dụng Maven và được thực hiện với nó. Thật không may, hầu hết các dự án cũ hơn khó khăn hơn để mavenize hơn là giá trị của nó.
  • Thực hiện các tác vụ của bạn bằng Jenkins làm máy chủ tạo liên tục. Và, tất cả các bản xây dựng rời khỏi bộ phận (UAT, QA và xây dựng bảo vệ) phải là một bản dựng của Jenkins.
  • Khuyến khích các nhà phát triển của bạn viết các bài kiểm tra Đơn vị. Trong thực tế, Jenkins có thể thực hiện các kiểm thử đơn vị và hiển thị kết quả của chúng trên trang xây dựng của nó.
  • Sử dụng những thứ khác như kiểu séc, PMD, CPD, Findbugs và các sản phẩm xác minh mã khác. Và, tất nhiên, Jenkins có thể chạy từng cái này và hiển thị các biểu đồ đẹp có thể được sử dụng để chỉ cho người quản lý của bạn mức độ bạn đang làm việc.
+0

Cảm ơn David. Nhận xét của bạn thực sự có giá trị. – hsalimi

1

Trong MSBuild, mục tiêu phải chỉ định đầu vào và đầu ra, nếu có thể (để bật tính phụ thuộc). Nếu cần, hãy sử dụng thuộc tính Returns để chỉ định một mục tiêu trả về các mục khác với các mục được sử dụng để tính toán phụ thuộc.

Các mục đầu vào và đầu ra cho một mục tiêu cụ thể sẽ được tạo bằng cách sử dụng các biến đổi mục (đối với phép biến đổi đơn giản, dựa trên đường dẫn) hoặc mục tiêu khác (để chuyển đổi phức tạp hơn).

Đối với MSBuild trước 4.x, cho các mục tiêu bạn xác định trong a.mục tiêu tập tin, xem xét sử dụng mẫu sau để cho phép người tiêu dùng để tiêm mục tiêu riêng của họ trước khi những người bạn đang xác định:

<PropertyGroup> 
    <MyTargetDependsOn> 
    Target1; 
    Target2; 
    SomeOtherTarget 
    </MyTargetDependsOn> 
</PropertyGroup> 
<Target 
    Name="MyTarget" 
    DependsOnTargets="$(MyTargetDependsOn)"> 

</Target> 

Điều này cho phép người tiêu dùng để bơm các mục tiêu của mình trước khi mục tiêu được quy định đơn giản bằng cách thay đổi giá trị của MyTargetsDependsOn thuộc tính:

<PropertyGroup> 
    <MyTargetDependsOn> 
    $(MyTargetDependsOn); 
    YetAnotherTarget 
    </MyTargetDependsOn> 
</PropertyGroup> 
<Target 
    Name="YetAnotherTarget"> 

</Target> 

Trong MSBuild 4.x, bạn có thể chỉ cần sử dụng thuộc tính BeforeTargets và AfterTargets.

+0

Điều quan trọng là nhiệm vụ không được trả lại danh sách các mục là kết quả đầu ra của chúng, nếu có thể. Thay vào đó, kết quả đầu ra của họ nên được tính toán ở cấp độ mục tiêu, và được chuyển đến nhiệm vụ (chứ không phải do tác vụ tạo ra). – tintoy

+0

Cảm ơn rất nhiều, nhưng tôi đang tìm kiếm các hướng dẫn cấp cao hơn, chứ không phải đề tài chi tiết. – hsalimi

4

Chỉ cần một lời nhận xét trên quan điểm viên đạn thứ hai bạn đề cập ở trên:

Nếu một dự án chứa một tập hợp các tiểu hệ thống và mỗi tiểu hệ thống có xây dựng các kịch bản của riêng mình, xây dựng hồ sơ của dự án chỉ cần gọi số tạo tập lệnh của các hệ thống phụ.

Mỗi hệ thống con phải có tệp xây dựng riêng nhưng tệp đó phải nhập tệp xây dựng chung. Phổ biến xây dựng tập tin sẽ chứa các mục tiêu như biên dịch, kiểm tra, đóng gói, vv

http://ant.apache.org/manual/Tasks/import.html

các hệ thống phụ xây dựng các file này sau đó được rất đơn giản, không chứa trùng lặp và chỉ chứa thông tin nào cụ thể về hệ thống phụ đó (ví dụ: compile.classpath).

+0

Rất cám ơn Kevin. Điều đó hoàn toàn đúng. – hsalimi

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