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: studiovà player, và các thư viện phụ thuộc core, graphvà network, nơi phụ thuộc như sau:
corelà độc lậpgraphphụ thuộc vàocore(mô-đun phụ tại./libs/core)networkcorephụ thuộc vào (mô-đun phụ tại./libs/core)studiophụ thuộc vàographvànetwork(các mô-đun phụ tại./libs/graphvà./libs/network)playerphụ thuộc vàographvànetwork(các mô-đun phụ tại./libs/graphvà./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 studiovà 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 studiodự á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 corehai 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
graphvànetworkcho 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ỏ đếncoremô đun con cục bộ . - Giới thiệu một phụ thuộc thêm:
studiovàocore. Sau đó,studioxây dựngcore, đặt đường dẫn bao gồm bản sao củacoremô-đun phụ, sau đó xây dựnggraphvà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 graphcũng có thể yêu cầu cập nhật corevà networkđể có phiên bản tương thích coretrong tất cả các dự án) .
Bất kỳ suy nghĩ về điều này?