2011-11-04 15 views
7

डीपीकेजी (डेबियन) नियंत्रण फ़ाइल में अधिकांश फ़ील्ड सीधा हैं। मुश्किल एक निर्भरता की सूची निर्धारित कर रहा है (निर्भर करता है :)। मैं उम्मीद कर रहा था कि पैकेज निर्देशिका में निष्पादन योग्य के लिए ldd आउटपुट देखकर dpkg-gencontrol मेरे लिए ऐसा कर सकता है। शायद यह कर सकता है, लेकिन मैं इसे काम करने के लिए नहीं मिल सकता है।क्या डीपीकेजी नियंत्रण फ़ाइल सेट करते समय स्वचालित रूप से निर्भरताओं को निर्धारित करने का कोई तरीका है?

यदि यह क्या dpkg-gencontrol के लिए है, त्रुटि मैं हो रही है:

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

संदर्भ के लिए, आदेश dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian है। यदि यह नहीं है क्या dpkg-gencontrol के लिए है

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 

, किसी को भी मैं क्या कर सकता है, या कैसे, निर्भरता सूची स्थापित करने के लिए आदर्श स्वचालित रूप से के बारे में सलाह के रूप में किसी भी सुझाव है: control_template फ़ाइल इस में शामिल है?

मान्य है, सामान्य रूप से निर्भरता को निर्भर करना शायद एक बहुत ही मुश्किल समस्या है, खासकर यदि आप स्क्रिप्ट और अन्य कार्यक्रमों की खोज बढ़ाते हैं। मुझे उम्मीद है कि कुछ औजार मौजूद हैं जो अधिकांश समय काम करता है।

ध्यान दें कि यह केवल आंतरिक वितरण के लिए है। मैं लिनक्स वितरण में जाने के लिए या यहां तक ​​कि आम जनता द्वारा डाउनलोड करने के लिए एक पैकेज नहीं बना रहा हूं, इसलिए यदि आवश्यक हो तो मुझे मानक नियमों को झुकाव/तोड़ने में खुशी होगी।

उत्तर

10

थिटन के उत्तर से प्रेरित कुछ खुदाई के बाद, और पूरी तरह से परीक्षण और त्रुटि, मुझे अंत में मेरी समस्या का समाधान मिला। यह पता चला है कि dpkg-gencontrol एक्जिक्यूटिव से पैकेज निर्भरताओं को अनुमानित करने का टूल नहीं है, dpkg-shlibdeps है। हालांकि, पैकेज तैयार करने में मदद के लिए दोनों कार्यक्रमों के लिए चीजों को ध्यान से स्थापित करने की आवश्यकता है। पढ़ें ....

dpkg-shlibdeps -O <executable> रनिंग के परिणामस्वरूप उस निष्पादन योग्य के लिए स्थापित किए जाने वाले संकुल और संस्करणों की एक सूची में परिणाम होता है। उत्तम। लगभग। आदर्श रूप से dpkg-gencontrol इसकी प्रसंस्करण में इसका उपयोग कर सकता है, जो कि इसके परिवर्तनीय प्रतिस्थापन सुविधा के माध्यम से करने में सक्षम होने का दावा करता है।

इसे आसानी से करने के लिए, मुझे एक निर्देशिका संरचना बनाना पड़ा जो डेबियन पैकेजिंग टूल की अपेक्षा से मेल खाता था। यह इस तरह से मूल रूप से दिखता है:

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) 

ध्यान दें कि डेबियन पैकेजिंग उपकरण के तहत डेबियन/tmp/मालिक और सभी फ़ाइलों के समूह की रक्षा। इस प्रकार यदि आप रूट या स्वामित्व वाले किसी अन्य उपयोगकर्ता के स्वामित्व वाली फाइलें चाहते हैं, तो चीजें मुश्किल हो जाती हैं। एक विकल्प है कि डेबियन निर्देशिका पेड़ को रूट के रूप में तैयार करना है, और मालिकों को अपनी पसंद के अनुसार सेट करना है। यदि आप रूट के रूप में नहीं चलना पसंद करते हैं, या इसकी अनुमति नहीं है, तो दूसरा तरीका है।

dpkg-deb -b debian/tmp . (जो .deb पैकेज बनाता है, उदाहरण के लिए नीचे देखें) के साथ स्वामित्व को समायोजित करने के लिए चोटी इत्यादि जैसी एक स्क्रिप्ट बनाएं। फेकरूट के माध्यम से इसे चलाएं, एक अन्य डेबियन टूल, जैसे: fakeroot ./fix_ownerships_and_build.sh। फ़करूट प्रोग्राम को व्यवहार करने देता है जैसे कि वे मूल थे, वास्तव में चीजों को बदलने के बिना रूट करते थे। यह सिर्फ इस परिदृश्य के लिए बनाया गया था।

मैंने देखा कि क्यों डीपीकेजी-जेनस्ट्रक्चर "पहले ब्लॉक में स्रोत क्षेत्र की कमी" त्रुटि उत्पन्न कर रहा था, यहां तक ​​कि अपने पर्ल स्रोत को पढ़ने के लिए भी जा रहा है। जैसे-जैसे होता है, त्रुटि कोड पर्याप्त संदर्भ प्रदान किए बिना सटीक है, यह जानने के लिए कि क्या करना है: नियंत्रण फ़ाइल को वास्तव में "स्रोत" नामक फ़ील्ड की आवश्यकता होती है, जिसमें पहले (दो) ब्लॉक होते हैं।

दो प्रकार के डेबियन पैकेज, स्रोत और बाइनरी हैं। मैंने सोचा कि मुझे बाइनरी की जरूरत है क्योंकि मैं बस इसमें संकलित निष्पादन योग्य रखना चाहता हूं, लेकिन मैं इसे काम नहीं कर सका। मैंने एक स्रोत पैकेज की कोशिश की, और मेरी नियंत्रण फ़ाइल में एक स्रोत फ़ील्ड जोड़ा। यह "पहले ब्लॉक में स्रोत क्षेत्र की कमी" त्रुटि से छुटकारा पा लिया, लेकिन दूसरे का नेतृत्व किया। दस्तावेज़ीकरण को और अधिक बारीकी से पढ़ते हुए, मुझे एहसास हुआ कि स्रोत संकुल need two "paragraphs" उनकी नियंत्रण फ़ाइलों में। एक बार जब मैं अपने नियंत्रण फ़ाइल इस तरह देखने के लिए बदल गया है, यह (लगभग) काम करना शुरू किया:

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. 

क्या अभी भी याद आ रही थी एक बदलाव का फ़ाइल था। यह महत्वपूर्ण परिवर्तन, संस्करण संख्या, तिथियां, और जिम्मेदार लोगों के साथ पैकेज की रिलीज का इतिहास रखने के लिए एक फ़ाइल है। मैं आमतौर पर इस तरह की चीज को अपने प्रारूप में बनाए रखता हूं, जिसे मैंने ध्यान से डेबियन चेंजलॉग प्रारूप में परिवर्तित कर दिया। किसी कारण से, बदलाव का अंतिम पैकेज से निकाल दिया गया है, इसलिए मैं अपने इतिहास फ़ाइल अकेला छोड़ दिया और बदले में एक प्लेसहोल्डर इस्तेमाल किया है, जो इस प्रकार है:

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 

* के साथ लाइन पर दो प्रमुख रिक्त स्थान के लिए आवश्यक हैं , जैसा कि ईमेल पते और तारीख के बीच दो रिक्त स्थान हैं, के साथ लाइन पर एकल अग्रणी स्थान है। और हां, तारीख को सटीक, टाइमज़ोन और सभी होने की आवश्यकता है, भले ही इसे सटीक होने की आवश्यकता न हो।

सब कुछ एक साथ लाना, एक डेबियन निर्देशिका वृक्ष जैसा कि ऊपर वर्णित की स्थापना के साथ, एक पैकेज बनाने की जरूरत आदेशों के अनुक्रम इस प्रकार हैं:

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 

जहां fix_ownerships_and_build.sh इस तरह दिखता है:

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) 

तो यह है। उम्मीद है कि यह जवाब दूसरों की प्रगति को तेज़ी से करने में मदद करेगा।

+0

अच्छा काम, लेकिन आपने डीपीकेजी-बिल्डपैकेज का एक अच्छा हिस्सा पुन: प्रोग्राम किया। आप उस उपकरण से अवगत हैं, है ना? – thiton

+0

कुछ हद तक। दर्जनों डीपीकेजी से संबंधित उपकरण हैं, और मुझे चीजों को सरल रखने में दिलचस्पी थी। डेबियन उपकरण भी डेबियन के साथ वितरण के लिए अपस्ट्रीम स्रोतों से संकुल बनाने पर केंद्रित थे, जो कि मैं ऐसा करने की कोशिश नहीं कर रहा था। मैंने एक साधारण निर्देशिका पेड़, न्यूनतम नियंत्रण फ़ाइल, और 'डीपीकेजी-डीबी-बी' के लिए एक एकल कॉल बनाने के साथ शुरुआत की थी। मैं जो चाहता था उसे पाने के लिए उस आधार पर न्यूनतम जोड़ों को खोजने की कोशिश कर रहा था। यह तरह बढ़ गया। :) मैं dpkg-buildpackage में देखता हूँ। व्हील पुनर्विचार अक्सर चीजों को सीखने का एक बड़ा हिस्सा होता है। –

1

असल में, शामिल पुस्तकालयों की सूची को देखना सी कार्यक्रमों के लिए काफी आम है और केवल श्लिब्स सहायक (dpkg-shlibdeps) का काम है। मदद के लिए अपने मैनपेज को देखें, लेकिन मूल रूप से यह आपकी निर्भर रेखा में ${shlibs:Depends} का उपयोग करने के लिए उबलता है।

+0

यह वह सुराग था जिसने मुझे समाधान की ओर शुरू किया। धन्यवाद, थिलटन। और संदर्भ के लिए, यह dh_shlibdeps नहीं था जिसने मदद की, लेकिन dpkg-shlibdeps। –

+0

@randallecook: संकेत के लिए धन्यवाद, तदनुसार संपादित करें। – thiton

संबंधित मुद्दे

 संबंधित मुद्दे