Làm thế nào một người sẽ xử lý các phụ thuộc bên ngoài trong một dự án nguồn mở?


23

Khi một người viết một dự án nguồn mở và sử dụng Google Code hoặc GitHub và muốn sử dụng một thư viện như Lua, người ta nên làm điều này như thế nào?

  • Có nên phụ thuộc vào kho lưu trữ?
  • Có nên xây dựng sự phụ thuộc từ bên trong cùng một tập lệnh xây dựng với phần còn lại của dự án hoặc từ một tập lệnh xây dựng riêng biệt không?

Cho rằng thư viện không cần cài đặt trước khi biên dịch.

Câu trả lời:


10

Tôi đặc biệt khuyên bạn nên đọc qua tài liệu của Git về các mô hình con ; nó giải quyết vấn đề này rất lớn, giả sử rằng tất cả các nguồn của bạn sử dụng Git. Nếu họ không, bạn luôn có thể thiết lập một repo git cho mục đích tích hợp. Nỗ lực là không đáng kể, và mức chi trả là rất đáng kể.


1
Các mô hình con thực hiện khá yếu trong quản lý phụ thuộc chung và trong Git. Ít nhất git Subree lặp lại tốt hơn rất nhiều
Lazy Badger

4
-1 Vui lòng bao gồm các chi tiết của liên kết trong câu trả lời của bạn nếu không câu trả lời là vô ích khi liên kết biến mất - như trường hợp bây giờ. Thật không may, tôi không có đại diện để downvote, tuy nhiên
Chính xác là

@Precastic: Nếu bạn google văn bản liên kết, nó sẽ đưa bạn thẳng đến trang mới; Tôi không chắc có bao nhiêu thông tin có thể.
Bryan Agee

1
Vui lòng đọc stackoverflow.com/help/how-to-answer - cụ thể là phần có tiêu đề "Cung cấp ngữ cảnh cho các liên kết" (trích dẫn: "Luôn trích dẫn phần có liên quan nhất của một liên kết quan trọng, trong trường hợp trang đích không thể truy cập được hoặc ngoại tuyến vĩnh viễn . ")
Chính xác

17

Có nên phụ thuộc vào kho lưu trữ?

Tôi nghĩ rằng các phụ thuộc phải luôn được đưa vào kho lưu trữ miễn là chúng không vi phạm bất kỳ điều khoản sử dụng nào. Vài điều khó chịu hơn là phải tìm đúng phiên bản của các phụ thuộc đúng theo cách thủ công trước khi bạn có thể tạo bản dựng. Chắc chắn, điều này thật dễ dàng khi bạn có các công cụ tự động để làm điều này cho bạn, có thể tìm và tải xuống đúng phụ thuộc, nhưng nếu bạn không kết nối với web vào lúc này hoặc máy chủ bị hỏng hoặc dự án của phụ thuộc đã bị ngưng hoàn toàn và lấy ngoại tuyến? Luôn bao gồm các phụ thuộc nếu có thể.

Có nên xây dựng sự phụ thuộc từ bên trong cùng một tập lệnh xây dựng với phần còn lại của dự án hoặc từ một tập lệnh xây dựng riêng biệt không?

Trừ khi có một lý do chính đáng để biên dịch từ nguồn, hãy sử dụng các phiên bản được biên dịch trước.

Và tại sao không cung cấp tùy chọn trong tập lệnh xây dựng? Một chuyển đổi đơn giản để chọn liệu các phụ thuộc cũng nên được biên dịch hay không. Nếu người dùng cũng chọn biên dịch các phụ thuộc, thì chỉ cần gọi các tập lệnh xây dựng riêng của họ từ tập lệnh xây dựng sản phẩm của bạn. Vì vậy, người dùng có thể gọi thủ công các tập lệnh xây dựng của người phụ thuộc hoặc chọn để tạo một bản dựng đầy đủ của mọi thứ. Nhưng tôi chỉ cung cấp các phụ thuộc dưới dạng nhị phân nếu không có lý do chính đáng để biên dịch chúng từ các nguồn. Tôi nghĩ trong thế giới Nguồn mở, một số giấy phép yêu cầu bạn phân phối các nguồn cùng với sản phẩm của bạn nhưng điều đó không có nghĩa là bạn không thể biên dịch trước chúng.

Tóm lại: Cung cấp toàn bộ gói độc lập, làm việc nếu có thể. Điều này sẽ cung cấp sự tiện lợi nhất cho người dùng của bạn.


1
@tdammers: Tôi biết, nếu phần mềm cài đặt của bạn trên hệ thống linux, trình quản lý gói sẽ thực hiện tất cả công việc cho bạn. Nhưng điều đó đòi hỏi phải có kết nối internet và gói phải ở một định dạng nhất định và tôi tuyên bố rõ ràng rằng các công cụ tự động hóa có thể giúp với điều này. Bạn không thể sử dụng một hệ thống như vậy cho các công cụ nguồn mở .NET chẳng hạn. Nếu bạn xem các công cụ sourceforge như NHibernate hoặc Castle Windsor, thì bạn sẽ thấy rằng tất cả các phụ thuộc được đưa vào dưới dạng nhị phân. Và đó là điều hợp lý duy nhất để làm.
Falcon

1
@tdammers: Thật tình cờ, hôm nay tôi phải cài đặt SDK SDK trên máy linux. Vì SDK không thể được cài đặt thông qua trình quản lý gói, tôi đã lấy RPM từ trang web. Bạn nghĩ thông điệp đầu tiên tôi nhận được khi cố chạy "vòng / phút" là gì? lỗi: Không phụ thuộc thất bại: ooobocation3.3-core01 là cần thiết bởi ooobocation3.3-sdk-3.3.0-9567.x86_64 - OH JOY!
Falcon

2
@tdammers: bạn đúng, nhưng trong trường hợp tôi muốn có sự dư thừa này nếu chỉ cài đặt và cài đặt dễ dàng. Và khi bạn muốn thấy một địa ngục phụ thuộc, hãy xem thư mục / usr / lib. Có tất cả mọi thứ: dự phòng, lật đổ và bạn thậm chí không biết chương trình nào sử dụng libs nào. Chắc chắn, hãy để người quản lý gói xử lý nó! Nhưng điều gì sẽ xảy ra nếu người quản lý gói không thể xử lý nó như trong trường hợp văn phòng mở mà tôi đã đề cập. Điều đó về cơ bản có nghĩa là bạn bị lừa và bạn sẽ gặp khó khăn khi cài đặt một cái gì đó.
Falcon

2
@tdammers: Và tôi càng nghĩ về điều này và kinh nghiệm của mình: Tôi thậm chí không thể đếm được số lần tôi phải tạo liên kết tượng trưng trong thư mục này chỉ vì phụ thuộc không thành công hoặc một số chương trình từ chối chạy, ngay cả khi được cài đặt qua trình quản lý gói. Có thể bây giờ tình hình đã trở nên tốt hơn, nhưng thường thì vẫn chỉ cần chăm chỉ để có một số thứ để chạy. Các vấn đề có thể tránh được nếu họ vừa giao phụ thuộc với ứng dụng. Tôi sẵn sàng trả vài MB dung lượng bổ sung chỉ để tránh rắc rối đó.
Falcon

2
@tdammers: Vô số hướng dẫn trên web về cách cài đặt một chương trình cụ thể trên một hệ thống linux cụ thể là nhân chứng cho vấn đề này.
Falcon

3

Điều này có thể hoặc không thể áp dụng cho trường hợp sử dụng của bạn, nhưng những gì chúng tôi làm tại nơi làm việc bao gồm thư mục "Tài liệu tham khảo" trong mỗi chi nhánh. Chúng tôi đặt DLL của bên thứ 3 ở đây. Điều này gây ra nhiều sự trùng lặp của các nhị phân tương đối không thay đổi trong kiểm soát nguồn, nhưng lưu trữ thì rẻ và tại bất kỳ thời điểm nào, mỗi nhánh & thẻ đều có chính xác các phụ thuộc (và phiên bản!) Mà nó mong đợi.

Chúng tôi tự biên dịch trước các phụ thuộc và di chuyển các nhị phân đã biên dịch vào thư mục đó. Thư viện dùng chung trong nhà của chúng tôi cũng được đối xử theo cách này. Bằng cách đó, kỹ thuật tương tự hoạt động đối với các thư viện độc quyền được biên dịch trước, thư viện nguồn mở và thư viện nội bộ.


Theo như thực sự trả lời câu hỏi của bạn bây giờ tôi đã đọc lại nó, hãy làm điều tương tự và chỉ đề cập rằng dự án của bạn sử dụng phiên bản Lua 1.3.5 được biên dịch sẵn.


1

Có nên phụ thuộc vào kho lưu trữ?

Nó có thể được tham chiếu trong kho lưu trữ (bởi bất kỳ phương thức SCM nào có thể sử dụng được), nếu phụ thuộc này là một phần không thể thiếu của sản phẩm (phụ thuộc nguồn), không phụ thuộc nhị phân, có thể được giải quyết riêng

Có nên xây dựng sự phụ thuộc từ bên trong cùng một tập lệnh xây dựng với phần còn lại của dự án hoặc từ một tập lệnh xây dựng riêng biệt không?

Không có vấn đề gì cả. Bạn có thể thích bất kỳ phương pháp nào, theo yêu cầu của bạn (tốc độ / minh bạch / khả năng quản lý / v.v.)


0

Là một cửa hàng Eclipse, chúng tôi mới bắt đầu sử dụng Buckminster để quản lý quá trình xây dựng / lắp ráp / triển khai của chúng tôi.

Giai đoạn đầu tiên của chúng tôi là rút ra tất cả các thư viện phụ thuộc hiện có của chúng tôi và để buckEGA chăm sóc cụ thể hóa các thư viện chính xác. Điều này làm cho việc triển khai nhanh hơn và nhỏ hơn nhiều.

Bước tiếp theo sẽ chuyển svnkho lưu trữ nguyên khối của chúng tôi sang một loạt các gitkho lưu trữ mô-đun .

Tôi không biết buckEGA sẽ tích hợp tốt như thế nào với các gitmô đun con (hoặc phụ đề đồng bóng cho vấn đề đó), nhưng thật tuyệt khi buckminster không liên quan đến VCS được sử dụng cho bất kỳ thành phần nào.

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.