2009-12-07 7 views
9

Tôi đang sử dụng maven 2.2 với mối quan hệ 1.4.0maven triển khai thay đổi hiện vật chỉ

Hãy nói rằng tôi có một pom-cấu trúc như thế này (với các phiên bản tương ứng)

parentproj, v1.0.1 
- childproj1, v1.0.2 
- childproj2, v1.0.7 

childproj1 và childproj2 đại diện khác nhau các phần của ứng dụng (ví dụ gui và backend) và tôi muốn có thể giữ riêng các phiên bản của chúng để tôi có thể phát hành phiên bản mới của chương trình phụ trợ mà không cần phải phát hành phiên bản mới của gui.

Bây giờ, để triển khai cấu trúc này để Nexus nó sẽ là thuận tiện để đi đến parentproj và nói

mvn triển khai -DperformRelease = true

đó sẽ triển khai tất cả các hiện vật để kho Nexus realease . Này làm việc tốt lần đầu tiên tôi triển khai nó, nhưng lần thứ hai tôi chạy vào vấn đề: chúng ta hãy nói rằng tôi đã thực hiện một bản cập nhật để childproj1 để chúng tôi bây giờ có các phiên bản sau:

parentproj, v1.0.1 
- childproj1, v1.0.3 
- childproj2, v1.0.7 

Trong tình huống này Nexus sẽ không hãy để tôi làm mvn triển khai từ parentproj, vì nó đã có một bản sao của childproj2 trong phiên bản 1.0.7. Nexus sẽ nói "Tài nguyên, yêu cầu bất hợp pháp: Kho lưu trữ có ID = 'bản phát hành' không cho phép cập nhật các tạo tác". Điều này là tốt, tôi không muốn cập nhật các phiên bản hiện tại do nhầm lẫn. Nhưng tôi đoán rằng những gì tôi muốn làm là để có thể nói với maven một cái gì đó như "triển khai chỉ những hiện vật có phiên bản mà không có trong kho phát hành".

Có cách nào để thực hiện việc này hay tôi sẽ phải tự triển khai từng dự án?

Trả lời

3

Theo kinh nghiệm của tôi, việc triển khai mọi thứ dễ dàng hơn và thường sử dụng cùng một số phiên bản cho tất cả các thành phần. Ví dụ: nếu nhóm của tôi đang làm việc trên phiên bản 1.0.7, tất cả các mô-đun con đều có số phiên bản 1.0.7-SNAPSHOT, cho đến khi chúng tôi phát hành, ngay cả khi không có mã nào thay đổi trong một số mô-đun nhất định. Khi chúng tôi triển khai, chúng tôi sẽ triển khai toàn bộ ứng dụng. Tôi nghĩ rằng nó có một số lợi thế so với việc triển khai từng phần. Đầu tiên, nếu bạn phải khôi phục phiên bản ổn định cuối cùng, bạn chỉ cần quay lại 1.0.6 cho tất cả các mô-đun - bạn không cần phải nhớ rằng chương trình phụ trợ là 1.0.3 trong khi GUI là 1.0.6. Thứ hai, nó đảm bảo rằng tất cả các thành phần được biên dịch chính xác với nhau và đã được thử nghiệm như một nhóm logic.

Xin lỗi, tôi biết đây không phải là một câu trả lời cụ thể cho câu hỏi của bạn, nhưng, ít nhất là trong trường hợp đội của tôi, nó là hữu ích để suy nghĩ hơi khác

+1

Cảm ơn bạn đã trả lời John, chúng tôi cũng đang điều tra cách tiếp cận đó và nó có thể là một cách hoàn toàn phù hợp. Tôi đồng ý rằng phiên bản nhất quán mang lại rất nhiều giá trị, nhưng tôi cũng lo ngại rằng đối với một dự án lớn, quá trình xây dựng có thể quá cồng kềnh và tốn thời gian nếu bạn phải nâng cấp toàn bộ nền tảng cho bất kỳ thay đổi nào. – David

+0

+1 để gợi ý cách sử dụng (đúng và chính xác) của vòng loại SNAPSHOT trên phiên bản để giải quyết vấn đề này. – whaley

+0

Tôi không đồng ý với tuyên bố cuối cùng về việc được tổng hợp cùng nhau và kiểm tra cùng nhau. Nếu bạn có các phụ thuộc phiên bản cố định trên các JAR, Maven sẽ biên dịch dự án của bạn bằng các JAR đó để bạn vẫn sẽ nhận được mọi thứ được biên dịch cùng với các phụ thuộc phiên bản cố định hoặc SNAPSHOT. Đối với các bài kiểm tra, với các bài kiểm tra đơn vị thực sự, tôi nghĩ rằng các phụ thuộc lớp, đặc biệt là trên các ranh giới JAR, nên được chế giễu. Điều này có nghĩa là mã của bạn không bao giờ được thử nghiệm cùng nhau trừ khi bạn có một số loại kiểm tra chức năng/tích hợp chạy trên ứng dụng được triển khai, sau đó SNAPSHOT hoặc phiên bản cố định sẽ không thành vấn đề nữa. –

1

tôi sẽ đề nghị rằng nếu bạn có kế hoạch để duy trì, xây dựng và triển khai các mô-đun một cách độc lập, bạn nên cân nhắc thiết lập các công việc CI và mvn deploy riêng biệt cho mỗi mô-đun. Có các công việc độc lập mvn deploy sẽ cung cấp cho bạn hành vi mà bạn đang tìm kiếm. Điều này có nghĩa là không sử dụng tập hợp pom (parentprj) để cố gắng xây dựng và triển khai các mô-đun này.

Nếu bạn muốn làm mọi thứ từ pom tổng hợp, như xây dựng và triển khai, thì tôi sẽ đề xuất theo câu trả lời của John và giữ tất cả số phiên bản được đồng bộ hóa.

Nó chỉ phụ thuộc vào cách nhóm của bạn muốn xem xét cơ sở mã.Nếu bạn muốn giữ mọi thứ theo đúng kiểu mô-đun, bạn nên sử dụng các mô-đun maven của mình như khối xây dựng, xử lý chúng khác nhau, cho đến khi bạn sẵn sàng đưa toàn bộ ứng dụng lại với nhau. Nếu ứng dụng của bạn có nhiều nguyên khối hơn, hãy coi nó như vậy và giữ cho mọi thứ được đồng bộ hóa. Điều này không có nghĩa là bạn vẫn không thể tách ra các mô-đun maven riêng biệt để duy trì mô-đun cơ sở mã, chỉ cần nhận ra chúng không có bất kỳ giá trị nào bên ngoài ngữ cảnh của ứng dụng lớn hơn của bạn.

Một cách hay để đưa ra quyết định này là tự hỏi "Sẽ có bất kỳ dự án/ứng dụng nào khác cần tham chiếu đến mô-đun này làm phụ thuộc không?". Nếu vậy, cách tốt nhất là xây dựng, phiên bản và triển khai nó một cách độc lập. Nếu không, tôi không thấy bất kỳ cạm bẫy nào để làm cho các phiên bản phù hợp.

3

Trước hết, tôi nghĩ bạn nên phân biệt giữa dự án mẹ và dự án tổng hợp. Các dự án phụ huynh nên được sử dụng cho những cài đặt chung cho một số dự án, ví dụ: phiên bản phụ thuộc; các dự án tập hợp nên được sử dụng để xây dựng cùng lúc một nhóm các dự án, ví dụ: một bộ lọ và chiến tranh bao gồm chúng.

Hai loại dự án được giữ cách nhau tốt nhất. Dự án cha mẹ thường không thay đổi rất thường xuyên và khi nó thường là tốt nhất để phát hành phiên bản mới của tất cả các dự án phụ thuộc từ nó; mục đích duy nhất của dự án tập hợp là thúc đẩy xây dựng một loạt các dự án, vì vậy số phát hành của nó có thể thay đổi bất cứ khi nào một trong các dự án mà nó chứa cần phải được phát hành.

Khi bạn đã tách cha mẹ khỏi trình tổng hợp, bạn đang ở vị trí tốt hơn để chọn theo dõi lời khuyên của John Paulett và giữ mọi thứ ở cùng một số phiên bản hoặc thử và thay đổi số phiên bản của mỗi dự án khi bạn thực sự cần phát hành nó. Tùy chọn đầu tiên đơn giản hơn và ít bị lỗi hơn, nhưng làm cho bạn phát hành phiên bản mới của các thư viện chưa thay đổi. Ví dụ: điều này có thể không được chấp nhận nếu bạn cần gửi bản vá thay vì bản phát hành đầy đủ. Tùy chọn thứ hai phức tạp hơn và dễ bị lỗi hơn, nhưng làm cho số phát hành của bạn phù hợp với sự phát triển của phần mềm của bạn. Plugin phát hành Maven và công cụ tích hợp liên tục Jenkins có thể trợ giúp ở đó, tôi nghĩ bạn nên kiểm tra chúng. Ngoài ra, hãy xem liệu bạn có thể nâng cấp Maven lên ít nhất phiên bản 2.2.1 và Nexus lên phiên bản mới hơn không.

+0

+1 để phân biệt POM của cha mẹ so với người tổng hợp. Để biết thêm chi tiết về sự khác biệt, hãy đọc về kế thừa và tập hợp POM: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html –

1

Rõ ràng nhu cầu này không được giải quyết bởi maven, không phải bởi Nexus hoặc archiva. Hiện tại, nó chỉ có thể được giải quyết bằng các thủ thuật bổ sung do người quản lý xây dựng thiết lập như những gợi ý được đề xuất trong các bài viết trước.

Trong một thế giới lý tưởng

  • các pom sẽ bao gồm
    . cả phiên bản phát hành và phiên bản chụp nhanh của mô-đun
    . định nghĩa của các tệp, nếu thay đổi, biện minh cho việc sử dụng phiên bản ảnh chụp
    . kiểm soát nguồn hệ thống quản lý tài liệu tham khảo của các module phát hành

  • module phụ thuộc poms sẽ thêm trong phần phụ thuộc thích hợp các thông tin phiên bản phát hành bên cạnh các thông tin phiên bản ảnh chụp để nó liên kết đến các thư viện chụp nếu có trong repo và thư viện phát hành khác

  • lò phản ứng maven sẽ có một tùy chọn để đọc cả thứ bậc phụ thuộc và hồ sơ thay đổi thông tin (SCM diff) để biết liệu một mô-đun cho là sẽ được sử dụng trong phiên bản hoặc ảnh chụp phiên bản của nó .

  • plugin phát hành theo mặc định bỏ qua việc giải phóng các mô-đun whitch vẫn có thể được sử dụng với phiên bản phát hành dựa trên các thay đổi tệp và thông tin phụ thuộc.