2011-11-04 25 views
7

Hầu hết các trường trong tệp điều khiển dpkg (Debian) rất đơn giản. Một trong những khó khăn là xác định danh sách các phụ thuộc (Phụ thuộc :). Tôi đã hy vọng rằng dpkg-gencontrol có thể làm điều này cho tôi bằng cách nhìn vào đầu ra ldd cho các tập tin thực thi trong thư mục gói. Có lẽ nó có thể, nhưng tôi không thể làm cho nó hoạt động được.Có cách nào để tự động xác định các phụ thuộc khi thiết lập một tệp điều khiển dpkg không?

Nếu đây là dpkg-gencontrol là để làm gì, lỗi Tôi nhận được là:

dpkg-gencontrol: error: syntax error in control_template at line 7: first block lacks a source field. 

Để tham khảo, lệnh là dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. Các tập tin control_template chứa này:

Package: my-package 
Maintainer: Joe Coder <[email protected]> 
Description: The my-package system 
A longer description that runs to the end of one line and then 
extends to another line. 
Priority: optional 

Nếu đây không phải là dpkg-gencontrol là để làm gì, không ai có bất cứ đề nghị như những gì tôi có thể làm, hoặc tư vấn về làm thế nào để thiết lập danh sách phụ thuộc, lý tưởng tự động?

Phải thừa nhận rằng, suy ra các phụ thuộc theo cách tổng quát có lẽ là một vấn đề rất khó, đặc biệt nếu bạn mở rộng tìm kiếm sang tập lệnh và các chương trình khác. Tôi hy vọng rằng một số công cụ tồn tại hoạt động phần lớn thời gian.

Lưu ý rằng điều này chỉ dành cho phân phối nội bộ. Tôi không xây dựng một gói để đi vào một bản phân phối Linux hoặc thậm chí được tải xuống bởi công chúng, vì vậy tôi rất vui khi bẻ cong/phá vỡ các quy tắc tiêu chuẩn nếu cần.

Trả lời

10

Sau khi đào một số lấy cảm hứng từ câu trả lời của thiton, và rất nhiều thử nghiệm và lỗi, cuối cùng tôi đã tìm thấy một giải pháp cho vấn đề của tôi. Nó chỉ ra rằng dpkg-gencontrol không phải là công cụ để suy ra các gói phụ thuộc từ thực thi, dpkg-shlibdeps là. Tuy nhiên, mọi thứ cần phải được thiết lập cẩn thận cho hai chương trình để giúp tạo ra một gói. Đọc trên ....

Chạy dpkg-shlibdeps -O <executable> dẫn đến danh sách các gói và phiên bản cần được cài đặt để thực thi để chạy. Hoàn hảo. Hầu hết. Lý tưởng dpkg-gencontrol có thể sử dụng điều này trong quá trình xử lý của nó, mà nó tuyên bố có thể thực hiện thông qua tính năng thay thế biến của nó.

Để thực hiện điều này suôn sẻ, tôi phải tạo cấu trúc thư mục phù hợp với kỳ vọng của các công cụ đóng gói Debian. Về cơ bản có vẻ như sau:

my_project_directory/ 
    main.c (or other source code, etc.) 
    debian/ 
    changelog (created by hand; see below) 
    control  (this is basically a template, created by hand; see below) 
    files  (created by dpkg-gencontrol) 
    substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol) 
    tmp/   (tmp is the root of the target system's filesystem) 
     path/ 
     to/ 
      my/ 
      project/ 
       executable_1 (this will be installed at /path/to/my/project) 
       executable_2 (this, too) 
     var/ 
     www/ 
      index.php (this will be installed at /var/www on target systems) 
     DEBIAN/  (create this by hand) 
     control  (created by dpkg-gencontrol and used in the final package) 

Lưu ý rằng các công cụ đóng gói Debian bảo toàn chủ sở hữu và nhóm tất cả các tệp theo debian/tmp /. Vì vậy, nếu bạn muốn các tập tin thuộc sở hữu của root hoặc một số người dùng khác khi cài đặt, mọi thứ trở nên phức tạp. Một tùy chọn là chuẩn bị cây thư mục debian dưới dạng root và đặt chủ sở hữu theo ý muốn. Nếu bạn không muốn chạy root, hoặc không được phép, có một cách khác.

Tạo tập lệnh gọi là chown, v.v. để điều chỉnh quyền sở hữu tùy thích, với dòng cuối cùng là dpkg-deb -b debian/tmp . (xây dựng gói .deb, xem bên dưới để biết ví dụ). Chạy qua fakeroot, một công cụ Debian khác, như sau: fakeroot ./fix_ownerships_and_build.sh. Fakeroot cho phép các chương trình hoạt động như thể chúng là root, mà không thực sự thay đổi những thứ như root sẽ làm. Nó được tạo ra chỉ cho kịch bản này.

Tôi đã xem xét lý do tại sao dpkg-gencontrol tạo ra lỗi "khối đầu tiên thiếu một trường nguồn", thậm chí đi xa đến mức đọc nguồn Perl của nó. Như thường xảy ra, mã lỗi chính xác mà không cung cấp đủ ngữ cảnh để biết phải làm gì: tệp kiểm soát thực sự cần một trường được gọi là "nguồn", trong khối đầu tiên (của hai).

Có hai loại gói Debian, nguồn và nhị phân. Tôi nghĩ rằng tôi cần một nhị phân kể từ khi tôi chỉ muốn đưa thực thi biên dịch vào nó, nhưng tôi không thể có được rằng để làm việc. Tôi đã thử một gói nguồn và thêm một trường nguồn vào tệp điều khiển của tôi. Điều này đã loại bỏ các "khối đầu tiên thiếu một lĩnh vực nguồn" lỗi, nhưng dẫn đến khác. Đọc tài liệu kỹ hơn, tôi nhận ra rằng các gói nguồn need two "paragraphs" trong các tệp điều khiển của chúng. Khi tôi thay đổi tệp điều khiển của mình để trông như thế này, nó bắt đầu hoạt động (hầu như):

Source: my-package 
Maintainer: Joe Coder <[email protected]> 

Package: my-package 
Priority: optional 
Architecture: amd64 
Depends: ${shlibs:Depends}, apache2, php5 
Description: The My-Package System 
A longer description that runs to the end of one line and then 
extends to another line. 

Điều còn thiếu là một tệp thay đổi. Đây là một tập tin để giữ một lịch sử phát hành của một gói, với những thay đổi đáng kể, số phiên bản, ngày tháng, và những người chịu trách nhiệm. Tôi thường duy trì một thứ như vậy theo định dạng của riêng mình, mà tôi đã chuyển đổi một cách cẩn thận sang định dạng thay đổi Debian chính xác. Đối với một số lý do, changelog được bỏ qua từ gói cuối cùng, vì vậy tôi một mình rời tập tin lịch sử của tôi và sử dụng một placeholder thay vào đó, trông như thế này:

my-package (1.0) unstable; urgency=low 
    * placeholder changelog to satisfy dpkg-gencontrol 
-- Joe Coder <[email protected]> Thu, 3 Nov 2011 16:49:00 -0700 

Hai không gian hàng đầu trên phù hợp với * là rất cần thiết , như là không gian hàng đầu duy nhất trên dòng với -, như là hai không gian giữa địa chỉ email và ngày tháng. Và có, ngày cần phải là chính xác, múi giờ và tất cả, mặc dù nó không cần phải chính xác.

Đưa tất cả mọi thứ với nhau, với một cây thư mục debian thiết lập như mô tả ở trên, trình tự các lệnh cần thiết để xây dựng một gói như sau:

dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \ 
       debian/tmp/path/to/my/project/executable_2 
dpkg-gencontrol -v1.1 (or whatever version you are building) 
fakeroot ./fix_ownerships_and_build.sh 

nơi fix_ownerships_and_build.sh trông như thế này:

chown -R root:root debian/tmp/path (or whatever user is appropriate) 
chown -R www-data:www-data debian/tmp/var/www/* (same goes here) 
dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file) 

Vậy là xong. Hy vọng câu trả lời này sẽ giúp người khác tiến bộ nhanh hơn tôi.

+0

Công việc tuyệt vời, nhưng bạn lập trình lại một phần tốt của dpkg-buildpackage. Bạn biết về công cụ đó, phải không? – thiton

+0

Hơi. Có hàng tá công cụ liên quan đến dpkg và tôi quan tâm đến việc giữ mọi thứ đơn giản. Các công cụ Debian cũng dường như tập trung vào việc tạo ra các gói từ các nguồn ngược dòng để phân phối với Debian, mà không hoàn toàn là những gì tôi đang cố gắng làm. Tôi đã bắt đầu xây dựng một cây thư mục đơn giản, tệp điều khiển tối thiểu và một cuộc gọi duy nhất tới 'dpkg-deb -b'. Tôi đã cố gắng tìm những bổ sung tối thiểu cho căn cứ đó để có được những gì tôi muốn. Nó phát triển. :) Tôi sẽ xem xét dpkg-buildpackage. Tái chế bánh xe thường là một phần quan trọng trong học tập. –

1

Thực ra, xem danh sách các thư viện được bao gồm là khá phổ biến đối với các chương trình C và chỉ là công việc của trình trợ giúp shlibs (dpkg-shlibdeps). Hãy xem manpage của nó để được trợ giúp, nhưng về cơ bản nó sẽ được sử dụng ${shlibs:Depends} trong dòng phụ thuộc của bạn.

+0

Đây là đầu mối khiến tôi bắt đầu hướng tới một giải pháp. Cảm ơn, thilton. Và để tham khảo, nó không phải là dh_shlibdeps đã giúp, nhưng dpkg-shlibdeps. –

+0

@randallecook: Cảm ơn bạn đã gợi ý, chỉnh sửa cho phù hợp. – thiton

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