पैकेज की पहली स्थापना के दौरान और अपग्रेड के दौरान ही स्क्रिप्ट कैसे चलाएं?


14

मैंने हाल ही में अपने कुछ सॉफ्टवेयर की पैकेजिंग शुरू की और इसे लॉन्चपैड पर प्रकाशित किया। स्थापना और निष्कासन ठीक काम करता है, लेकिन पैकेज के एक संस्करण को अगले संस्करण में अपग्रेड करना समस्याग्रस्त है।

समस्या यह है कि कुछ स्क्रिप्ट हैं जिन्हें केवल पैकेज की पहली स्थापना के दौरान चलाने की आवश्यकता है। ये स्क्रिप्ट DB को पॉप्युलेट करते हैं, एक उपयोगकर्ता बनाते हैं, आदि। उन्हें वर्तमान में package.postinst configure)अनुभाग में बुलाया जाता है । हालांकि यह परिणाम उन्हें अपग्रेड के दौरान बुलाया जा रहा है और साथ ही आरेख में दिखाया गया है

क्या एक .deb पैकेज में एक अनुरक्षक स्क्रिप्ट को शामिल करने का एक तरीका है जो केवल पैकेज की पहली स्थापना के दौरान निष्पादित होता है और अपग्रेड के दौरान नहीं? या .deb पैकेज में कुछ प्रारंभिक सेटअप स्क्रिप्ट को शामिल करने का एक सुंदर तरीका क्या होगा?

जवाबों:


15

एक debian/preinstफ़ाइल के साथ आप इंस्टॉल पर कार्रवाई कर सकते हैं, लेकिन अपग्रेड नहीं।

#!/bin/sh
set -e

case "$1" in
    install)
        # do some magic
        ;;

    upgrade|abort-upgrade)
        ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 0
        ;;
esac

#DEBHELPER#

exit 0

हालाँकि जैसा कि नाम से ही स्पष्ट है, यह आपके पैकेज के स्थापित होने से पहले चलाया जाता है। इसलिए आप यहां वह नहीं कर सकते जो आपको चाहिए। अधिकांश पैकेज केवल postinstअगर उपयोगकर्ता पहले से ही बनाया गया है के कॉन्फ़िगर चरण में परीक्षण करें। यहां बताया गया हैcolord

$ cat  /var/lib/dpkg/info/colord.postinst
#!/bin/sh

set -e

case "$1" in
    configure)

# create colord group if it isn't already there
    if ! getent group colord >/dev/null; then
            addgroup --quiet --system colord
    fi

# create the scanner group if it isn't already there
    if ! getent group scanner >/dev/null; then
        addgroup --quiet --system scanner
    fi

# create colord user if it isn't already there
    if ! getent passwd colord >/dev/null; then
            adduser --system --ingroup colord --home /var/lib/colord colord \
        --gecos "colord colour management daemon"
        # Add colord user to scanner group
        adduser --quiet colord scanner
    fi

# ensure /var/lib/colord has appropriate permissions
    chown -R colord:colord /var/lib/colord

    ;;
esac    



exit 0

28

डेबियन विकी से इस आरेख को देखें कि अनुचर लिपियों को कैसे कहा जाता है: डेबियन अनुरक्षक स्क्रिप्ट फ़्लोचार्ट

यदि आप बाएं हाथ की ओर का अनुसरण करते हैं ("सब कुछ ठीक है" पथ) तो आप देखेंगे कि postinstस्क्रिप्ट को सबसे हाल ही में कॉन्फ़िगर किए गए संस्करण के साथ कहा जाता है। यह आपको एक अपग्रेड और एक ताजा इंस्टॉलेशन के बीच अंतर करने का मौका देता है - अपग्रेड केस में, आपके पोस्टस्टीन को बुलाया जाएगा

postinst configure 1.23-0ubuntu1

1.23-0ubuntu1आपके पैकेज का पहले से इंस्टॉल किया गया संस्करण कहां है, जबकि एक ताजा इंस्टॉल के लिए इसे कहा जाएगा

postinst configure

यह आपको मामले को संभालने की भी अनुमति देता है जब आपको किसी विशेष संस्करण से अपग्रेड करते समय कार्रवाई करने की आवश्यकता होती है - आप postinstउस संस्करण के लिए जांच कर सकते हैं ।

इससे यह जांचना आसान हो जाता है कि स्क्रिप्ट 'इंस्टॉल' या 'अपग्रेड' पर की जा रही है या नहीं। यदि $ 2 शून्य है, तो यह एक स्थापित है। इसलिए:

if [ -z "$2" ]; then
  do install stuff
else
  do upgrade stuff
fi

1
ध्यान दें कि अतिरिक्त पैरामीटर उस मामले में भी पारित हो गया है जब आपने पैकेज को हटा दिया है (लेकिन इसे शुद्ध नहीं किया गया है) और इसे फिर से स्थापित करता है।
19

3

आप पोस्टस्टीन के साथ संयोजन में एक डेबियन / प्रीस्टन स्क्रिप्ट का उपयोग करने में सक्षम हो सकते हैं।

प्रीस्टाइन स्क्रिप्ट में, एक फ़ाइल की जांच करें जो आपका pkg निश्चित रूप से इंस्टॉल करता है। यदि यह मौजूद है, तो कुछ भी न करें (क्योंकि आपका पैकेज पहले स्थापित किया गया था), अन्यथा, अपना सेटअप चरण करें।

यदि आपके सेटअप चरणों के लिए आवश्यक है कि आपका pkg स्थापित है (जिस स्थिति में ऊपर काम नहीं करेगा क्योंकि स्थापना से पहले preinst चलता है), तो आपकी preinst स्क्रिप्ट एक फ़ाइल लिख सकती है, उदाहरण के लिए: / tmp / setupmypkg। आपकी पोस्टस्टैंड स्क्रिप्ट बस यह जांच सकती है कि क्या वह फ़ाइल मौजूद है और यदि ऐसा है तो दो चीजें:

  • आपके प्रारंभिक सेटअप चरण
  • / tmp / setupmypkg फ़ाइल हटाएं

1
हां यह काम करेगा और मैं वर्तमान में कुछ ऐसा ही कर रहा हूं। लेकिन यह अभी भी थोड़ा हैकरी लग रहा है ... मैं इसे करने के लिए और अधिक देशी तरीके की उम्मीद कर रहा था। यह इस तरह के एक विदेशी अनुरोध सही नहीं लगता है?
फिरोज

1

मैंने पाया कि आपके "पोस्टस्टीन कॉन्फ़िगर" स्क्रिप्ट में $ 2 के लिए परीक्षण ठीक से काम नहीं करता है यदि आपने अपना पैकेज पहले एक बार पहले ही स्थापित कर लिया है, तो इसे अनइंस्टॉल कर दिया है (लेकिन बिना शुद्ध किए), फिर से पुन: स्थापित करने का प्रयास करें। इस स्थिति में, पोस्टस्टाइन स्क्रिप्ट को अभी भी "पोस्टस्टीन कॉन्फ़िगर" चरण के लिए एक संस्करण तर्क मिलता है।

हालाँकि, यदि आपने पहले पैकेज स्थापित किया है, तो उसे हटा दें और शुद्ध कर लें, फिर से फिर से इंस्टॉल करें, "पोस्टस्टीन कॉन्फ़िगर" स्क्रिप्ट को $ 2 में संस्करण तर्क नहीं मिलेगा


0

मुझे ऐसा नहीं लगता है, लेकिन आप आसानी से प्रीस्टीन / पोस्टस्टीन स्क्रिप्ट को संशोधित कर सकते हैं कि क्या पहली बार पैकेज स्थापित किया जा रहा है और मानक कार्रवाई करें।

कुछ इस तरह हो सकता है,

पूर्व में।

if not is_package_istalled():
    export MY_PACKAGE_FIRST_INSTALL

पोस्टस्टीन में,

if MY_PACKAGE_FIRST_INSTALL:
    Do First Install Setup 

संपादित करें

हम्म, हो सकता है कि आप सीधे पोस्टस्टीन में यह सब देख सकते हैं क्योंकि मुझे लगता है कि dpkg पैकेज की स्थिति सेट नहीं करेगा जैसा कि पोस्टस्टीन को निष्पादित करने से पहले स्थापित किया गया है, लेकिन मुझे यकीन नहीं है। तो ऊपर आ सकता है,

पोस्टस्टीन में,

if not is_package_istalled():
    Do First Install Setup 

जहां, is_package_installed आप स्थापना स्थिति का पता लगाने के लिए कार्य कर सकते हैं। 'Dpkg --status packagename' जैसा कुछ हो सकता है

या

यदि आप जो बदलाव करना चाहते हैं, तो केवल जांच ही क्यों न करें और यदि वे नहीं हैं तो ही आगे बढ़ें।


मुझे समझ नहीं आ रहा है। IS_INSTALLED कहां से आता है?
जीरन

कोई IS_INSTALLED नहीं है, यह सिर्फ छद्म कोड है। बस एक उदाहरण है। IS_INSTALLED 'dpkg --status package_name' जैसी कमांड का आउटपुट हो सकता है। मेरा मतलब था कि आप जांच सकते हैं कि क्या पैकेज को पूर्व-स्थापना में स्थापित किया गया है, एक राज्य संस्करण सेट करें और फिर इस राज्य के आधार पर पोस्टस्टीन में कार्रवाई करें।
ओवैस लोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.