Tôi là một fan hâm mộ lớn của các mô-đun Git . Tôi muốn có thể theo dõi một phụ thuộc cùng với phiên bản của nó, để bạn có thể quay lại phiên bản trước của dự án và có phiên bản phụ thuộc tương ứng để xây dựng an toàn và sạch sẽ. Hơn nữa, việc phát hành các thư viện của chúng tôi dưới dạng các dự án nguồn mở dễ dàng hơn vì lịch sử của các thư viện tách biệt với các ứng dụng phụ thuộc vào chúng (và chúng sẽ không được mở nguồn).
Tôi đang thiết lập quy trình làm việc cho nhiều dự án tại nơi làm việc và tôi đã tự hỏi sẽ thế nào nếu chúng ta thực hiện phương pháp này một chút cực đoan thay vì có một dự án nguyên khối. Tôi nhanh chóng nhận ra đó là một lon tiềm năng của sâu trong thực sự sử dụng sub-module.
Giả sử một cặp ứng dụng: studio
và player
, và các thư viện phụ thuộc core
, graph
và network
, nơi phụ thuộc như sau:
core
là độc lậpgraph
phụ thuộc vàocore
(mô-đun phụ tại./libs/core
)network
core
phụ thuộc vào (mô-đun phụ tại./libs/core
)studio
phụ thuộc vàograph
vànetwork
(các mô-đun phụ tại./libs/graph
và./libs/network
)player
phụ thuộc vàograph
vànetwork
(các mô-đun phụ tại./libs/graph
và./libs/network
)
Giả sử rằng chúng tôi đang sử dụng CMake và mỗi dự án này đều có các bài kiểm tra đơn vị và tất cả các công việc. Mỗi dự án (bao gồm studio
và player
) phải có thể được biên dịch độc lập để thực hiện các số liệu mã, kiểm tra đơn vị, v.v.
Điều này là, một đệ quy git submodule fetch
, sau đó bạn có được cấu trúc thư mục sau:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
Lưu ý rằng core
được nhân bản hai lần trong studio
dự án. Ngoài việc lãng phí dung lượng ổ đĩa này, tôi gặp vấn đề về hệ thống xây dựng vì tôi đang xây dựng core
hai lần và tôi có khả năng nhận được hai phiên bản khác nhau core
.
Câu hỏi
Làm cách nào để tổ chức các mô-đun phụ để tôi có được sự phụ thuộc theo phiên bản và xây dựng độc lập mà không nhận được nhiều bản sao của các mô-đun phụ lồng nhau phổ biến?
Giải pháp có thể
Nếu phần phụ thuộc thư viện có phần gợi ý (nghĩa là trong "thời gian được biết là hoạt động với phiên bản X" hoặc "chỉ phiên bản X được hỗ trợ chính thức") và các ứng dụng hoặc thư viện phụ thuộc tiềm năng chịu trách nhiệm xây dựng với bất kỳ phiên bản nào họ thích, sau đó Tôi có thể tưởng tượng kịch bản sau đây:
- Có hệ thống xây dựng
graph
vànetwork
cho họ biết nơi cần tìmcore
(ví dụ: thông qua trình biên dịch bao gồm đường dẫn). Xác định hai mục tiêu xây dựng, "độc lập" và "phụ thuộc", trong đó "độc lập" dựa trên "phụ thuộc" và thêm đường dẫn bao gồm để trỏ đếncore
mô đun con cục bộ . - Giới thiệu một phụ thuộc thêm:
studio
vàocore
. Sau đó,studio
xây dựngcore
, đặt đường dẫn bao gồm bản sao củacore
mô-đun phụ, sau đó xây dựnggraph
vànetwork
ở chế độ "phụ thuộc".
Cấu trúc thư mục kết quả trông như sau:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
Tuy nhiên, điều này đòi hỏi một số phép thuật hệ thống xây dựng (tôi khá tự tin điều này có thể được thực hiện với CMake) và một chút công việc thủ công trên một phần của các bản cập nhật phiên bản (cập nhật graph
cũng có thể yêu cầu cập nhật core
và network
để có phiên bản tương thích core
trong tất cả các dự án) .
Bất kỳ suy nghĩ về điều này?