2009-07-31 27 views
10

Tôi hiện đang trong một dự án phát triển bằng cách sử dụng một khuôn khổ được phát triển bởi một bộ phận khác làm cơ sở. Chúng tôi hiện đang giới thiệu các tiêu chuẩn chất lượng (cuối cùng, yay!) Trong bộ phận của chúng tôi, nhưng hiện tại không thể giới thiệu các tiêu chuẩn đó cho bộ phận khác. Kết quả là, chúng tôi đang làm việc chống lại một mục tiêu di chuyển liên tục mà không có sự ổn định của API hoặc các bản phát hành ổn định, điều này ít gây căng thẳng nhất.Làm cách nào để quản lý các phụ thuộc của mô-đun Perl?

Vì chúng tôi đang cố gắng khắc phục mọi thứ ở đầu của chúng tôi trước tiên, chúng tôi muốn đảm bảo chính mình cho đến khi nó chống lại những thay đổi trong mã khung "a.k.a.". Chúng tôi đã hình dung các phụ thuộc của mô-đun cứng:

  1. Chỉ sử dụng một số phiên bản khuôn mẫu nhất định, được xác định trong mã.
  2. Sử dụng kiểm tra đơn vị kiểm tra để đảm bảo rằng tất cả các phiên bản cần thiết vẫn có sẵn.
  3. Mọi tiện ích mở rộng phạm vi phiên bản yêu cầu đánh giá ngang hàng mã khung.

Đó là kế hoạch từ trước đến nay. Bây giờ các câu hỏi:

  1. Có hợp lý không? Nếu không, bất kỳ ý tưởng nào khác?
  2. Làm thế nào để thực hiện điều này trong perl? Sử dụng use Module, chúng tôi chỉ có thể xác định mã phiên bản thấp nhất được cho là hoạt động.

Trả lời

2

Trong khi tôi hy vọng CPAN ổn định hơn mô-đun bạn đang dựa vào, hãy để tôi hỏi một câu hỏi tương tự: làm thế nào bạn tự bảo vệ mình trước những thay đổi bất ngờ trong mô-đun CPAN?

Một câu trả lời: bạn sẽ tải xuống mô-đun và lấy lại mã của bạn dựa vào nó trong môi trường thử nghiệm.

Có thể sử dụng tương tự ở đây không? Bạn có phải trỏ đến các bản sao "sống" của các mô-đun của họ hay bạn có thể trỏ đến các bản sao của riêng mình không?

+1

CPAN không ổn định theo nghĩa là bạn không thể ngăn bất kỳ ai làm bất cứ điều gì. Một mô-đun cụ thể có thể hoàn toàn bị lỗi, nhưng ngay cả một thay đổi giao diện cũng có thể phá vỡ mã dựa vào nó. Thủ phạm lớn là thiết kế của chuỗi công cụ CPAN trong đó phiên bản mới nhất là phiên bản mà khách hàng cố gắng cài đặt. –

2

Tôi sẽ thực hiện việc này bằng cách tạo một bản sao riêng của thư viện mà mã của tôi phụ thuộc vào và đưa chúng vào thư mục lib của dự án của tôi với sự hiểu biết rằng tôi sẽ không bao giờ sửa đổi các bản sao đó.

14

Đó là một kế hoạch rất hợp lý và tôi triển khai nó thông qua kho lưu trữ giống như CPAN riêng mà tôi đã gọi là 'DPAN'. Bạn chọn các bản phân phối và phiên bản mà bạn muốn từ CPAN thực (hoặc BackPAN), và tạo kho lưu trữ của riêng bạn từ nó. Các khách hàng CPAN của bạn chỉ trỏ vào kho lưu trữ này, các phiên bản đóng băng hiệu quả đến chính xác những gì bạn muốn. Bạn chỉ nâng cấp khi bạn muốn. Ngoài ra, DPAN cho phép bạn dễ dàng thêm vào không chỉ mã cục bộ, riêng của bạn mà còn sửa đổi các gói của bên thứ ba để khắc phục sự cố cài đặt của họ, v.v. Tôi có một lý giải hoàn chỉnh cho ý tưởng trong ấn bản Mùa hè 2009 của The Perl Review. Bạn cũng có thể xem các trang trình bày của tôi từ số Creating Your Own CPAN nói chuyện của mình tại YAPC :: Nga.

Nếu bạn quan tâm đến loại giải pháp này, hãy xem mô-đun MyCPAN::App::DPAN của tôi. Phải mất một thư mục của distro và làm phần còn lại cho bạn. Bạn trỏ máy khách CPAN của bạn vào nó (và đảm bảo rằng nó sẽ không kết nối với internet) và đó là điều đó.

Khi bạn có thể tạo kho lưu trữ của riêng mình, bạn có thể dễ dàng tạo kho thử nghiệm.Dump các phiên bản mà bạn nghĩ rằng bạn muốn nâng cấp vào nó, triển khai mã trên máy chủ thử nghiệm của bạn và thu thập kết quả. Nếu bạn không thích kết quả, bạn có thể dễ dàng thay đổi kho lưu trữ.

Bước tiếp theo trong công việc DPAN của tôi là thực hiện cài đặt Perl hiện có, với bất kỳ mô-đun nào bạn có thể đã cài đặt và tạo kho lưu trữ cho bạn trạng thái cài đặt đó. Tôi có tất cả các phần chính tôi cần để làm công việc, nhưng tôi đã được một chút bận rộn nhận được một vài khách hàng đang chạy với các bit đầu tiên.

Nếu bạn muốn nghe thêm về nội dung này, hãy cho tôi biết. :)

+1

DPAN âm thanh tuyệt vời. Khi tôi lập chỉ mục các mô-đun của mình, làm thế nào để tôi trỏ máy khách CPAN của tôi đến nó? – jeje

+1

Nếu bạn đang sử dụng CPAN.pm, bạn có thể sửa đổi cài đặt urllist thành một tệp: /// URL. Đó là điều tương tự bạn sẽ làm cho một miniCPAN. Tôi đi làm bây giờ, nhưng hãy bắn cho tôi một email ([email protected]) nếu bạn gặp rắc rối. –

+0

Tôi sẽ thử điều đó. Cảm ơn! – jeje

4

Hãy xem PAR. Nó cho phép bạn kết hợp một nhóm phụ thuộc vào một tệp. Bạn có thể lấy các mô-đun mà họ phát hành, ném chúng vào một tệp PAR và chỉ nâng cấp tệp PAR khi bạn muốn chấp nhận các thay đổi của chúng.

+1

Điều này không có vấn đề về tính di động. PAR có vấn đề với mã được biên dịch và thư viện động. Có lẽ điều đó không quan trọng trong trường hợp này, nhưng nó có quan trọng đối với một số khách hàng m. –

+0

Tại sao bạn không báo cáo những điều này là lỗi? Nó không giống như bạn không biết làm thế nào để tiếp cận với tôi. Hơn nữa, nó có vấn đề với mã được biên dịch như thế nào? Theo tôi biết, điều này đơn giản có nghĩa là bạn sẽ phải tạo một .par cho mỗi nền tảng đích: Đó là một định dạng nhị phân. Về nguyên tắc, nó sẽ xử lý các thư viện được chia sẻ. – tsee

-1

Nếu bạn muốn kiểm tra phiên bản của module bên ngoài, bạn có thể (nếu có ít nhất họ báo cáo $ VERSION họ đúng) sử dụng một cái gì đó như thế này:

BEGIN { 
    use foo; 
    use bar; 

    die "Ghaaaa" if $foo::VERSION < 2.1; 
    die "Aaaargh" if $foo::VERSION > 3.12; 
} 
+1

Trong thực tế điều này không làm việc bởi vì bạn phải làm điều đó cho mỗi mô-đun. Có lẽ bạn có thể hạn chế foo, nhưng điều đó không bảo vệ chống lại các cập nhật cho các phụ thuộc của foo. –

+0

Tương tự: sử dụng foo 2.1; (chỉ tối thiểu) –

1

Có người chỉ ra PAR rồi. Hãy để tôi đề cập đến PAR::Repository và mô-đun đi kèm của nó PAR::Repository::Client. Họ thực hiện một cơ sở hạ tầng máy khách/máy chủ có thể tự động tải bất kỳ phụ thuộc nào không được tìm thấy cục bộ (hoặc thậm chí có thể thích các gói của máy chủ). Là quản trị viên, bạn có thể chỉ cần thêm hoặc xóa các gói đến hoặc từ kho lưu trữ của mình. Việc phục vụ thực tế các gói được thực hiện với các máy chủ hoàn toàn bình thường: Bất kỳ máy chủ http nào hay chỉ đơn giản là file: // sẽ thực hiện. Các giao thức khác nên khá đơn giản để thực hiện.

Nó có tính năng tự động tải cơ chế ma thuật nói trên, cài đặt gói và nâng cấp gói tự động. Ngoài các tài liệu mô-đun, bạn có thể có một cái nhìn tại một presentation on PAR from YAPC::Europe 2008 mà bao gồm điều này để mở rộng một số.

Tôi phải thừa nhận rằng việc nâng cấp tự động là công nghệ đủ tiên tiến có thể ăn một hoặc hai đứa bé nếu nó chạy hết mèo con để gặm nhấm.

1

Tôi nghĩ rằng Carton là thứ mà bạn đang tìm kiếm (bộ đóng gói cho perl). Kết hợp với plenv tôi tin rằng sẽ làm được điều này.

Các vấn đề liên quan