2012-10-19 42 views
9

Tôi đang cố gắng tạo ra một cách thức mà các bản dựng kín có thể đạt được trong khi vẫn dựa vào các phụ thuộc SNAPSHOT trong dự án của bạn.Tạo Ẩn Maven Xây dựng

Theo mục đích của ví dụ, nói rằng tôi có một dự án trong đó có một cấu trúc phụ thuộc như thế này:

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

Những gì tôi muốn làm là giải quyết tất cả các phụ thuộc SNAPSHOT tại địa phương để một cái gì đó có liên quan đến tôi phiên bản hiện tại và sau đó triển khai phiên bản đó dưới dạng bản phát hành cho kho lưu trữ bản phát hành của Nexus của tôi. Không phải tất cả những phụ thuộc này đều là nội bộ nên tôi không thể chỉ đơn giản là tạo ra một bản phát hành trên mỗi phần.

Vì vậy, trong ví dụ này, other-1.2-SNAPSHOT sẽ trở thành một cái gì đó như other-1.2-mine-1.2.3thing-3.1-SNAPSHOT sẽ trở thành thing-3.1-mine-1.2.3. Điều này là tương đối tầm thường trong khoảng 60 dòng trăn.

Sự cố, tuy nhiên, là trong việc giải quyết SNAPSHOTs chuyển tiếp sang phiên bản cụ thể. Vì vậy, tôi cũng cần phải chuyển đổi gizmo-6.1.3-SNAPSHOT thành gizmo-6.1.3-mine.1.2.3 và có thing-3.1-mine-1.2.3 phụ thuộc vào nó.

Đây chỉ là một ví dụ về một cách để đạt được những gì tôi muốn. Mục tiêu là trong một hoặc hai năm sau, tôi có thể kiểm tra nhánh phát hành của mình cho phiên bản 1.2.3 và có thể chạy mvn clean package hoặc tương tự mà không phải lo lắng về việc giải quyết các phụ thuộc SNAPSHOT từ lâu.

Điều quan trọng là nhánh này phải có khả năng tương thích và không chỉ giữ lại tất cả các phụ thuộc bằng cách sử dụng chức năng jar-and-dependencies của plugin lắp ráp. Tôi muốn có khả năng có thể sửa đổi các tệp nguồn và tạo một bản phát hành bản phát hành khác (ví dụ: áp dụng hotfix).

Vì vậy,

  • Có điều gì như sẵn này sẽ có khả năng chuyển đổi phụ thuộc SNAPSHOT theo kiểu đệ quy là bê tông?
  • Có plugin nào quản lý loại điều này cho bạn không? Plugin phát hành đã hứa hẹn với một số tùy chọn cấu hình trên mục tiêu branch của nó nhưng nó không giải quyết các dep bên ngoài theo mức độ mà tôi muốn.
  • Các kỹ thuật khác có sẵn để tạo bản dựng Maven kín không?
+3

Âm thanh như một cuộc tấn công chống Maven với tôi. Trong Maven, một trong những quy tắc cơ bản cơ bản là ** Convention Over Configuration **. Nếu các phụ thuộc được tạo ra bởi chính bạn, bạn nên tự quản lý/sử dụng phiên bản SNAPSHOT/RELEASE chính xác. Nếu họ đến từ nơi khác, bạn nên luôn sử dụng phiên bản phát hành mới nhất (không phải phiên bản SNAPSHOT). Hãy xem lại lần thứ hai trong [Maven Tham chiếu đầy đủ - phần 3.3.1] (http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships -sect-versions) và xem tại sao SNAPSHOT được sử dụng trong Maven. – yorkw

+0

Tôi rất thấu hiểu các nguyên tắc cơ bản của Maven. Tuy nhiên, tôi sống trong thế giới thực với thời hạn và thư viện của bên thứ ba vô cùng hữu ích nhưng vẫn ngồi trên các phiên bản SNAPSHOT trong thời gian dài. Jason Van Zyl, ai đó bạn có thể biết, thậm chí thừa nhận khái niệm có một hệ thống xử lý nặng xung quanh bản phát hành là một sai lầm rất lớn (và đang thay đổi với tesla). Ngắn của việc duy trì dĩa nội bộ của tất cả các dự án chúng tôi tiêu thụ, những gì tôi đang làm thực sự là nhảy và giới hạn tốt hơn so với hầu hết sẽ. –

+1

cũng ngay cả trong thế giới thực một số lý do nên được đưa vào tài khoản. Bạn đang chiến đấu với hệ thống ở đây. Như bạn đã đề cập Snapshots không sống đủ lâu - ngay cả khi bạn đang sử dụng ảnh chụp nhanh thời gian đóng dấu để dựa vào cho độ phân giải tạo tác. Cách tiếp cận của tôi sẽ sử dụng sự phụ thuộc và triển khai các trình bổ sung để lấy tất cả các tạo tác và triển khai các phụ thuộc snapshot đã biết vào repo maven của chính nó bằng cách sử dụng một kịch bản hoặc một số plugin tự tạo. Có thể nói chuyện với các Gizmos khác cũng giúp: nếu họ có thể phát hành phiên bản beta của hiện vật của họ, bạn có thể dựa vào những người mà không có rất nhiều lộn xộn xung quanh. – wemu

Trả lời

2

Đây không phải là một kỹ thuật được sử dụng rộng rãi, nhưng bạn luôn có thể kiểm tra phụ thuộc SNAPSHOT cụ thể của bạn vào dự án của bạn là một kho lưu trữ "dự án", như được mô tả trong bài đăng blog: Maven is to Ant as a Nail Gun is to a Hammer

Nói tóm lại, sử dụng Dependencies Plugin để tạo kho lưu trữ trong thư mục dự án của bạn. Dưới đây được sao chép từ các bài viết trên blog liên kết (mà bạn nên đọc):

1) Chạy mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

"Điều này tạo ra/target/phụ thuộc với một bố trí repo giống như của tất cả các dự án phụ thuộc của bạn"

2) Sao chép target/dependencies/ một cái gì đó giống như libs/

3) Thêm một tuyên bố kho như sau để POM của bạn:

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 

Bạn thực hiện việc này là một phần tự động của quá trình xây dựng/phát hành của bạn: bước 1 bằng cách định cấu hình plugin Phụ thuộc cho vòng đời phasephase và bước 2 bằng cách sử dụng AntRun Plugin để di chuyển các phụ thuộc đã tải xuống về đúng vị trí.

Hy vọng điều này việc cho bạn. Tôi phải đi tắm ngay bây giờ ...

+0

Tôi đã không làm điều này chính xác, nhưng du khách trong tương lai có lẽ sẽ muốn giải pháp này. Tôi đã tạo một kho lưu trữ nexus đặc biệt và triển khai các phiên bản tùy chỉnh vào nó và sau đó cập nhật pom thông qua một kịch bản, giống như tôi đã mô tả trong bài đăng gốc. Tuy nhiên, tôi đã sử dụng kỹ thuật này ở công việc cuối cùng của mình và nó hoạt động rất tốt cho một trường hợp sử dụng tương tự. –

2

Plugin phiên bản maven sẽ thực hiện hầu hết những gì bạn muốn.

http://mojo.codehaus.org/versions-maven-plugin/

Tuy nhiên, bạn sẽ gần như certianly cần phải chạy nó trong một pre-build bước mà bạn giải quyết tất cả các phụ thuộc và cập nhật các tập tin pom cho phù hợp. Sau đó, chạy lại maven (mà đọc lại pom) để chạy xây dựng thực sự. Bạn có thể cấu hình mọi thứ bên trong pom được kích hoạt với một mục tiêu riêng biệt, do đó tránh được một kịch bản riêng biệt.

Điều này hoạt động tốt hơn nếu bạn sử dụng các phiên bản cụ thể thay vì phụ thuộc SNAPSHOT và để cho bước xây dựng trước nâng cấp chúng nếu cần. Sự khác biệt thực sự duy nhất cho độ phân giải phụ thuộc là maven sẽ luôn tải xuống lại các phụ thuộc SNAPSHOT trong khi nó sẽ chỉ tải xuống các phụ thuộc bình thường nếu có một phiên bản mới. Tuy nhiên nhiều plugin (bao gồm cả plugin phiên bản) xử lý các phụ thuộc -SNAPSHOT khác nhau gây ra vấn đề.Vì mọi bản dựng CI đều có một số phiên bản mới mà tôi không bao giờ sử dụng -SNAPSHOT, thích một thẻ khác như -DEV với hành vi có thể đoán trước được nhiều hơn cho những thứ như xây dựng địa phương của nhà phát triển, v.v.

Tôi đã dành rất nhiều thời gian để làm maven những thứ tương tự như thế này Hầu hết các dự án maven tôi biết có một số loại bước xây dựng trước để thiết lập số phiên bản hoặc có được xung quanh các hạn chế khác như thế này. Cố gắng làm tất cả điều này trong một bước thường không thành công vì maven chỉ đọc pom một lần, thay thế chuỗi không hoạt động ở một vài nơi và pom được triển khai/cài đặt thường không chứa kết quả của chuỗi thay thế hoặc thay đổi được thực hiện trong quá trình xây dựng.

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