2014-09-25 20 views
7

Tôi duy trì nhiều ứng dụng được viết bằng Perl (unix-ish) có quá trình cài đặt hiện tại bao gồm viết một cách thủ công Makefile và cài đặt các tệp cấu hình vào /etc/.Làm thế nào để tạo một Dist :: Zilla dựa trên mô-đun Perl (hoặc ứng dụng) cài đặt các tập tin vào/etc /?

Tôi thực sự muốn chuyển đổi phát triển của họ để sử dụng Dist::Zilla, nhưng cho đến nay tôi đã không tìm thấy bất kỳ plugin Quận :: Zilla hoặc tính năng cho phép tôi để đưa các tập tin được vào /etc/ khi make install (hoặc ./Build install trong trường hợp sử dụng Module::Build thay vì ExtUtils::MakeMaker) được điều hành bởi quản trị viên cục bộ đang cài đặt ứng dụng của tôi.

Với tinh khiết ExtUtils::MakeMaker, tôi có thể xác định mục tiêu bổ sung trong MY::postamble và để cho mục tiêu install phụ thuộc vào một trong số chúng thông qua thuộc tính depend { install => … }. Làm một cái gì đó tương tự, nhưng thông qua dzil build, có lẽ sẽ đủ, nhưng tôi sẽ đánh giá cao một cách rõ ràng hơn.

Một cách tiếp cận trực giao sẽ làm cho ứng dụng không yêu cầu tệp dưới /etc/ để tồn tại, nhưng chỉ cần chuyển sang Dist :: Zilla dường như thay đổi nhiều trong mã thực tế mặc dù tôi chỉ muốn thay đổi hệ thống xây dựng cho bây giờ.

Đối với những người tò mò: hai ứng dụng tôi hiện có trong tâm trí để chuyển sang Dist :: Zilla là xen-toolsunburden-home-dir.

+0

Thực ra cái gì đó như file '/ install' debian trong bao bì Debian sẽ gọn gàng. –

Trả lời

2

Đối với porting một trình cài đặt mô-đun phức tạp một phần quận :: Zilla, tôi khuyên bạn nên bổ sung của tôi MakeMaker::Custom hoặc ModuleBuild::Custom, tùy thuộc vào cài đặt mà bạn thích. Điều này cho phép bạn giữ Makefile.PL hoặc Build.PL hiện tại của mình và chỉ cần có Dist :: Zilla cắm các bit cần thiết như phụ thuộc.

+0

Hrm. Theo tóm tắt của Quận :: Zilla :: Plugin :: MakeMaker :: Tuỳ chỉnh, nó đòi hỏi khá nhiều mã boilerplate (trong đó tôi vẫn chưa chắc chắn những gì tất cả của nó thực sự thực hiện). Tôi thấy rằng một đặc điểm là các 'Makefile.PL' vẫn hoạt động mà không có 'dzil build', nhưng tôi không cần điều đó chút nào và đúng hơn là mong đợi cái gì đó chỉ có' ​​## {$ ALL_EXCEPT_WriteMakefile ##} 'rồi thêm rất ít dòng mã bổ sung có thể sửa đổi'% args', và cuối cùng 'WriteMakefile (% args);', tức là với toàn bộ tệp không cần nhiều hơn một vài dòng cộng với các bổ sung của tôi. –

+1

@XTaran, hầu hết các bản mẫu soạn thảo chỉ là những gì một truyền thống 'Makefile.PL' trông giống như. Tất cả các công cụ 'trừ ... eval' đang làm là thêm khả năng tương thích với các phiên bản cũ của [ExtUtils :: MakeMaker] (https://metacpan.org/pod/ExtUtils::MakeMaker). Thay vào đó, bạn có thể nâng cao phiên bản tối thiểu của ExtUtils :: MakeMaker hoặc chỉ không cố gắng sử dụng các tính năng đó. – cjm

+0

Xin cảm ơn, điều đó khiến nó ngắn hơn và dễ hiểu hơn. :-) Tôi đề nghị thêm thông tin đó vào POD _before_ đoạn "Tất nhiên, Makefile.PL của bạn sẽ phức tạp hơn thế, hoặc bạn không cần plugin này." mà nhiều hay ít cho thấy rằng nó có thể phức tạp hơn, nhưng không kém phức tạp. Và có thể thay thế rằng "nên" với "có thể" và thả cụm từ "hoặc bạn không cần plugin này". –

4

Điều tốt nhất cần làm là tránh cài đặt tệp vào /etc từ bất kỳ phân phối Perl nào. Bạn không thể đảm bảo rằng trình khách cpan (hoặc người dùng cài đặt) có quyền cài đặt ở đó và có thể có nhiều Perls được cài đặt trên một hệ thống, vì vậy mỗi một trong số chúng sẽ nén các tệp /etc của một cài đặt khác. Bạn thực sự không thể ngăn tệp bị ghi đè bởi cài đặt tiếp theo, vì vậy bạn không nên đặt dữ liệu cấu hình ở đó mà bạn không muốn mất.

Bạn có thể đặt tệp cấu hình trong /etc /, nếu ứng dụng biết tìm ở đó, nhưng bạn nên cho phép đường dẫn đó được tùy chỉnh (nói trên hệ thống thử nghiệm, tìm tệp trong thư mục cục bộ, hoặc trong thư mục chính của người dùng).

Để cài đặt dữ liệu chỉ dành riêng cho mô-đun chỉ đọc, phương pháp hay nhất trong Perl là cài đặt vào vị trí cụ thể cài đặt Perl và mô-đun để làm điều đó là File::ShareDir::Install. Bạn có thể sử dụng nó từ Dist::Zilla bằng cách sử dụng plugin [ShareDir], Dist::Zilla::Plugin::ShareDir. Nó thậm chí còn được bao gồm trong gói [@Basic] cắm, vì vậy nếu bạn sử dụng [@Basic] trong dist.ini của bạn, bạn không cần phải làm bất cứ điều gì ở tất cả, khác hơn là thả các file dữ liệu của bạn vào thư mục share/ trong kho phân phối của bạn .

Để truy cập vào các nội dung của sharedir từ mã, sử dụng File::ShareDir.

+1

Một cách khác để đặt nó: Cho phép người dùng ghi vào '/ etc /', nhưng làm cho người dùng có khả năng ghi vào '/ etc /', và sau đó, chỉ khi họ muốn ghi đè các giá trị mặc định. Nếu họ không muốn ghi đè các giá trị mặc định, thì chúng sẽ vui khi sử dụng bất kỳ bản phân phối nào của bạn được gửi trong thư mục 'share /' mà bạn có thể xóa theo ý muốn mà không cần khóc. –

+0

Tất nhiên, đường dẫn cài đặt cho các tệp cấu hình cần được cấu hình cho những trường hợp không có quyền ghi. Mặc dù tôi chưa có ý tưởng hay về việc ghi đè. Cho đến nay nó được xử lý bởi các gói đóng gói phân phối cho hai ứng dụng đó, nhưng các gói cần/thích ứng dụng để cài đặt các tệp cấu hình vào '$ PREFIX/etc /' như là nơi chúng đặt nó. Dữ liệu chỉ dành riêng cho mô-đun chỉ đọc là một chủ đề khác, nhưng thực tế không có trí tuệ. –

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