Có phải là thực hành tốt để lưu trữ thời gian chạy khung dưới sự kiểm soát nguồn?


9

Tôi biết rất nhiều cửa hàng phần mềm giữ nhị phân dưới sự kiểm soát nguồn . Tuy nhiên, cửa hàng của chúng tôi đã đến để lưu trữ toàn bộ khung trên kho lưu trữ: DirectX runtime, CUDA, nVidia Optix, bất cứ điều gì.

Nó được cho là để làm cho một thiết lập máy dev dễ dàng hơn (được cho là, nhận bản mới nhất và bắt đầu mã hóa). Tuy nhiên, nó làm phình to kho lưu trữ và gánh nặng nó với lịch sử không liên quan.

Tôi chưa bao giờ thấy một mô hình sử dụng như vậy. Bạn có coi đó là một thực hành tốt?

[EDIT:] Tôi không gặp vấn đề gì với các nhị phân của bên thứ 3 bị cô lập kiểm soát nguồn. Câu hỏi đề cập đến toàn bộ thời gian chạy của khung, thường bao gồm 10+ nhị phân. Như một ví dụ cực đoan, hãy lấy Windows SDK (mà chúng tôi không giữ trên kho lưu trữ, cảm ơn chúa, nhưng tôi thấy không có sự khác biệt nào về nguyên tắc).


1
Bạn có thể tạo một tập lệnh tải xuống các thời gian chạy khung mới nhất hoặc có liên quan và đặt tập lệnh đó dưới sự kiểm soát phiên bản.
Basile Starynkevitch

2
Tại sao bạn nghĩ rằng nó gánh nặng [kho lưu trữ] với lịch sử không liên quan ? Cụ thể hơn, tại sao bạn nghĩ rằng lịch sử là không liên quan ? Nếu mã của bạn tham chiếu các khung và thư viện đó, sẽ rất hữu ích khi biết phiên bản nào đang được sử dụng tại một phiên bản cụ thể trong kho lưu trữ.
James McNellis

Tôi đồng ý về sự phình to (đặc biệt nếu các thời gian chạy đó được chia sẻ giữa nhiều dự án) nhưng tôi không hiểu phần nào về lịch sử không liên quan. Ví dụ, một thay đổi trong phiên bản thời gian chạy mà bạn đang sử dụng khá phù hợp ...
6502

Sẽ không dễ dàng hơn để tạo hình ảnh của máy phát triển khi các bản cập nhật xuất hiện?
Ramhound

@Ramhound: đó là hướng chính xác mà tôi đang cố gắng đẩy. Tôi tự hỏi nếu có những nhược điểm tôi đang thiếu.
Ofek Shilon

Câu trả lời:


6

Các mã nhị phân thường không phù hợp với hệ thống kiểm soát phiên bản vì:

  • họ không được hưởng lợi từ các tính năng kiểm soát phiên bản (hợp nhất, khác)
  • họ tăng kích thước của repo ...
  • ... Điều này quan trọng bởi vì bạn không dễ dàng xóa phiên bản khỏi VCS (VCS được tạo để giữ lịch sử), trái ngược với kho lưu trữ giả như Nexus , là các thư mục được chia sẻ đơn giản (dễ dọn dẹp: cd+ rm!)
  • chúng nên được tham chiếu trong một VCS dưới dạng văn bản , khai báo đường dẫn + phiên bản: bạn có thể giữ lịch sử liên quan theo cách đó , ghi lại mọi thay đổi của phiên bản nhị phân dưới dạng thay đổi trong tệp văn bản đó (như pom.xml nếu bạn đang sử dụng Nexus ví dụ)

1
Điểm cuối cùng là rất có giá trị.
Noufal Ibrahim

Cảm ơn! Bạn có biết một kho lưu trữ tạo tác tương tự cho các dự án C ++ không? Thậm chí tốt hơn - có thể một trong đó tích hợp với TFS?
Ofek Shilon

2
@OfekShilon: Về lý thuyết, Nexus có thể lưu trữ bất kỳ loại vật phẩm nào. Nhưng để quản lý lưu trữ và phụ thuộc cho .NET / C ++, bạn cũng có NuGet: nuget.codeplex.com . Ví dụ cho .Net: Lostechies.com/derekgreer/2011/09/20/ . Nó cũng hỗ trợ các dự án C ++: nuget.codeplex.com/discussions/280649 .
VonC

@OfekShilon Bạn có thể liên kết TFS với NuGet (ví dụ: coolthingoftheday.blogspot.com/2011/08/iêu , hanselman.com/blog/ Lỗi ). Xem thêm TFSNuGetter: nugetter.codeplex.com
VonC

6

Tôi ổn với phiên bản kiểm soát tài sản nhị phân. Tôi chống lại phiên bản kiểm soát các tập tin được tạo .

Ngoài ra, thiết lập môi trường là một cái gì đó khác với phát triển. Chúng tôi chủ yếu phát triển bằng Python và nó có một công cụ gọi là virtualenv cho phép bạn tạo một môi trường biệt lập nhẹ (bao gồm các thư viện) cho một dự án. Khi chúng tôi kiểm tra các nguồn của mình, chúng tôi có một tập lệnh thiết lập trong đó xây dựng virtualenv này. Sử dụng một bảng kê khai, điều này xác định những phiên bản nào của thư viện là cần thiết và những thứ khác như vậy. Không ai trong số này là phiên bản được kiểm soát. Chỉ có kịch bản thiết lập là.

Ném toàn bộ khuôn khổ theo dự án chính của bạn sẽ làm lộn xộn lịch sử của bạn và làm mọi thứ rối tung nghiêm trọng. Nó không phải là một phần của dự án của bạn và nên được đối xử khác nhau.


3

Nói chung nên làm quản lý cấu hình với các phiên bản khung. Nếu mã của bạn cần một phiên bản DirectX cụ thể, phiên bản đó sẽ dễ dàng có sẵn và nếu bạn kiểm tra phiên bản cũ hơn của phần mềm, bạn sẽ dễ dàng xác định được phụ thuộc bên ngoài nào.

Điều tôi không nghĩ là một ý tưởng tốt ở đây là sử dụng hệ thống kiểm soát phiên bản điển hình của bạn để lưu trữ các tệp nhị phân đó. Trong công ty của chúng tôi, chúng tôi lưu trữ mọi phiên bản của khung, thư viện và các công cụ bên ngoài trong cấu trúc thư mục con trên ổ đĩa mạng. Nếu chúng tôi nghĩ nó hợp lý, chúng tôi có các tệp readme để ghi lại phiên bản công cụ nào thuộc phiên bản phần mềm nào, hoặc, nếu có thể, chúng tôi có các tập lệnh để cài đặt hoặc sử dụng một phiên bản cụ thể. Chỉ những tập tin readme và script đi vào kiểm soát phiên bản.

Chúng tôi cũng giữ các phiên bản cũ hơn của các công cụ và thư viện miễn là chúng tôi nghĩ rằng có thể chúng tôi phải xây dựng lại và phiên bản cũ hơn tùy thuộc vào các công cụ đó. Bằng cách đó, nó cho chúng tôi khả năng xóa một số lib & công cụ rất cũ khỏi ổ đĩa mạng của chúng tôi khi chúng bị phản đối (tất nhiên, chỉ trong trường hợp chúng tôi có tài liệu lưu trữ trên phương tiện truyền thông bên ngoài).


2

Tôi nghĩ rằng các nhị phân nên được lưu trữ ở đâu đó. Tôi sẽ đề nghị lưu trữ chúng bên ngoài một kho lưu trữ, đặc biệt nếu chúng lớn và dẫn đến thời gian kiểm tra lớn. Tôi sẽ không thấy nó thực hành kém, nhưng nó cũng không phải là một trong những tôi đã thấy.

Đây thực sự có thể là một ý tưởng tốt nếu tổ chức của bạn có nhiều dự án nhắm mục tiêu các phiên bản thời gian chạy khác nhau. Nó đảm bảo rằng bạn có nhị phân thời gian chạy phù hợp khi bạn làm việc trên các dự án phù hợp.


Tôi đã làm rõ câu hỏi để giải quyết vấn đề này.
Ofek Shilon

1

Cá nhân tôi coi đây là một thực hành rất xấu. Tôi thích thiết lập một wiki với các hướng dẫn cài đặt và tải lên các tệp nhị phân cần thiết cho nó. Những tệp này chỉ cần thiết cho các nhà phát triển mới, không cần phải kho lưu trữ kho của mọi người khác.


1

Có một lý do chính đáng để làm điều này, cụ thể là bạn có tất cả những gì bạn cần ở một địa điểm duy nhất , không có bất kỳ sự phụ thuộc bên ngoài nào.

Điều này quan trọng hơn nhiều so với bạn nghĩ. Về cơ bản, nó đảm bảo rằng bạn không dựa vào một vật phẩm trên máy chủ của nhà cung cấp có thể biến mất sau một vài năm, vì bạn có mọi thứ trong nhà.

Liên quan đến kho lưu trữ. Đây chỉ là một vấn đề nếu VCS của bạn giữ một bản sao cục bộ đầy đủ (git làm điều này, cvs không) vì việc nhân bản và / hoặc cập nhật sẽ bị chậm. Đổi lại, bạn sẽ có các bản sao trên mỗi máy phát triển, điều này có thể cứu công ty của bạn nếu kế hoạch sao lưu trung tâm của bạn vì một số lý do thất bại một ngày nào đó.

Đây là một vấn đề ưu tiên hoặc chính sách. Miễn là quyết định có chủ ý, tôi sẽ ổn với điều này.


2
Nếu bạn lưu trữ thư viện bên thứ ba của mình trên kho lưu trữ giả như máy chủ Nexus hoặc NuGet của riêng bạn, bạn sẽ không phải lo sợ máy chủ "nhà cung cấp" sẽ biến mất. Vì vậy, bằng mọi cách, lưu trữ chúng tại địa phương. Chỉ không sử dụng một VCS. Họ không có nghĩa là để giữ loại tập tin đó.
VonC

@VonC phụ thuộc vào cơ sở hạ tầng và phương pháp đo lường làm việc của bạn. Đối với "chỉ lưu trữ một nhị phân một lần", một VCS có thể tốt như một kho lưu trữ đầy đủ. Nó cũng giữ cho cơ sở hạ tầng đơn giản. Tôi không ủng hộ - OP hỏi liệu có ai đã nhìn thấy một mô hình sử dụng như vậy không.

Đồng ý. Tôi đã thấy một mô hình sử dụng như vậy. AndI đã phải quản lý các repos như vậy (Tập trung vào VCS như SVN hoặc ClearCase, chưa bao giờ thấy việc sử dụng cho DVCS như Git). Và điều này nói chung là một mớ hỗn độn. Thư viện nhà cung cấp, bạn hiếm khi chỉ lưu trữ một nhị phân một lần. Bạn phải đối phó với các bản vá. Rất nhiều trong số họ. Cộng với lưu trữ không phải là mục tiêu duy nhất (nếu có, VCS có thể được coi là một giải pháp tiềm năng). Quản lý phụ thuộc là. Và đó là những gì Nexus hoặc NuGet cung cấp (ngoài việc dễ dàng quản trị và dọn dẹp).
VonC
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.