Cách tốt nhất để cấu trúc kho Git cho Maven


19

Tôi cần một số lời khuyên về cách cấu trúc các dự án của chúng tôi trong Git. Chúng tôi sử dụng Java và Maven là công cụ xây dựng của chúng tôi. Maven kinda giả định rằng tất cả các dự án của bạn có một tổ tiên chung cuối cùng. Maven cũng có thể là một nữ hoàng phim truyền hình thực sự khi mọi thứ không thiết lập chính xác cách mà nền tảng Apache thiết lập các dự án của họ (bất kỳ ai sử dụng plugin phát hành có thể biết tôi đang nói về điều gì).

Chúng tôi muốn một pom cha cấp cao nhất kiểm soát các phiên bản plugin và cấu hình xây dựng (cấu hình repo, tạo tác phẩm gì để xây dựng, quy ước đặt tên, phiên bản plugin, v.v.). Maven muốn tất cả các dự án CNTT của chúng tôi nằm trong các thư mục con của dự án chính đó. Điều này ngụ ý một repo Git lớn cho tổ chức.

Điều này sẽ làm cho một môi trường rất ồn ào. Nếu có hai nhóm làm việc trong các dự án không liên quan, họ sẽ liên tục phải kéo vào sáp nhập từ nhóm khác. Lý tưởng nhất là tôi muốn có một repo cho mỗi dự án.

Nhưng kiểu xung đột với mô hình cực kỳ phân cấp của Maven, đòi hỏi các dự án con là các thư mục con.

Tôi cần một số lời khuyên về cách mọi người đã hòa giải hai mô hình này ... cảm ơn bạn!


Câu trả lời:


19

Bạn có 2 tùy chọn:
1. bằng cách git: sử dụng mô hình con. Dưới đây là một tài liệu về cách git quản lý các mô đun con git mô đun con . Cá nhân tôi đã không sử dụng nó nhưng có vẻ phù hợp với vấn đề của bạn.
2. bằng cách maven: trong maven, không bắt buộc rằng dự án gốc (cấu hình) của bạn phải được phân cấp theo thư mục mẹ của tất cả các dự án của bạn. Bạn có thể có một cấu trúc như thế:

configuration
 +-- pom.xml (configuration:XXX)
project1
 +-- pom.xml (project1:1.0-SNAPSHOT)
 !
 +-- module11 
 !     +-- pom.xml (1.0-SNAPSHOT)
 +-- module12
       +-- pom.xml (1.0-SNAPSHOT)
project2
 +-- pom.xml (project2:2.0-SNAPSHOT)
 !
 +-- module21 
 !     +-- pom.xml (2.0-SNAPSHOT)
 +-- module22
       +-- pom.xml (2.0-SNAPSHOT)

cấu hình, project1 và project2 nằm trên cùng một cấp thư mục và mỗi cái có thể là một kho git. Khi xây dựng project1 hoặc project2, bạn chạy lệnh maven từ cấp project1 hoặc project2 và maven sẽ cố gắng tìm nạp cha (cấu hình) từ kho lưu trữ maven chứ không phải từ thư mục mẹ. Bạn nên chú ý đến các phiên bản. Tôi muốn giới thiệu trong project1 hoặc project2 để giữ tham chiếu đến cha mẹ (cấu hình) với phiên bản phát hành. Để thực hiện một bản phát hành, bạn phải thực hiện theo 2 bước: phát hành cấu hình trước và phát hành dự án thứ hai. Project1 và project2 có thể phát triển độc lập và không cần phải có phiên bản cấu hình giống như cha mẹ.

Chỉ dành cho các trường hợp đặc biệt khi bạn muốn có cả cấu hình và dự án dưới dạng phiên bản SNAPSHOT, trong project1 hoặc project2, bạn có thể sử dụng <relativePath>thẻ bên trong <parent>thẻ để trỏ đến đường dẫn cấu hình cục bộ của bạn. Tôi không khuyến nghị điều này vì sẽ tạo ra các vấn đề trên môi trường phát triển (ít nhất là đối với tôi trong Eclipse)

Xin thứ lỗi cho trình độ tiếng Anh của tôi.


3

Maven muốn tất cả các dự án CNTT của chúng tôi nằm trong các thư mục con của dự án chính đó

Không, Maven chỉ đơn giản muốn có thể lấy lại những cổ vật mà nó cần. Cách tốt nhất để làm điều này là với một kho lưu trữ giả, chẳng hạn như Nexus hoặc Artifactory . Mỗi dự án có thể có kho Git riêng.

Chúng tôi muốn một pom cha cấp cao nhất kiểm soát các phiên bản plugin và cấu hình xây dựng (cấu hình repo, những gì tạo tác để xây dựng , quy ước đặt tên, phiên bản plugin, v.v.

Có vấn đề thực sự của bạn. Thật hợp lý khi sử dụng POM gốc để thực thi cấu hình, nhưng không có lý do gì để kết hợp cấu hình với kiểm soát bản dựng. Trên thực tế, ngoại trừ một dự án đa mô-đun độc lập, tôi nói rằng đó là một ý tưởng cực kỳ tồi tệ, chỉ vì những lý do mà bạn nêu ra (cộng với thực tế là bạn phải xây dựng tất cả các dự án của mình, tất cả thời gian).


Tôi rất quen thuộc với cách thức hoạt động của maven. Và không, tôi không muốn các đội của mình xây dựng toàn bộ cơ sở mã. Thông thường, bạn sẽ chọn một số lượng nhỏ các dự án và kéo chúng ra khỏi tầm kiểm soát nguồn. Chúng tôi có một máy chủ nexus để lưu trữ các tạo phẩm đã hoàn thành, vì vậy không có lý do gì để xây dựng toàn bộ cơ sở mã. Và một khi tổ chức của bạn có quy mô nhất định, chạy trên cơ sở hạ tầng dùng chung sẽ tiết kiệm tiền. Có một cấu hình trung tâm để làm điều đó là cách duy nhất để đảm bảo rằng nó hoạt động mọi lúc.
Jonathan S. Fisher

Xin chào @parsifal, xin hãy xem câu hỏi của tôi về việc tạo java stackoverflow.com/questions/49562268/iêu
Hosein Aqajani 30/03/18
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.