कम्पोज़र में एक विशिष्ट प्रतिबद्धताओं को सही ढंग से कैसे करने की आवश्यकता है ताकि यह निर्भर पैकेजों के लिए उपलब्ध हो?


108

मेरे पास एक पुस्तकालय है foo/foo-lib जो requiresगीथहब से एक विशिष्ट प्रतिबद्धता है:

{
    "name": "foo/foo-lib",
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/KnpLabs/Gaufrette.git"
        }
    ],
    "require": {
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

और यह ठीक काम करता है:

$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)                                 
  - Updating knplabs/gaufrette dev-master (2633721 => 2633721)
    Checking out 2633721877cae79ad461f3ca06f3f77fb4fce02e

Generating autoload files

लेकिन जब मुझे अन्य प्रोजेक्ट में उस लाइब्रेरी की आवश्यकता होती है:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master"
    }
}

यह निर्भरता त्रुटि देता है:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for foo/foo-lib dev-master -> satisfiable by foo/foo-lib[dev-master].
    - foo/foo-lib dev-master requires knplabs/gaufrette dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e -> no matching package found.

तो मेरा सवाल यह है: requireमेरी लाइब्रेरी में GitHub से विशिष्ट प्रतिबद्धताओं को सही ढंग से कैसे किया जाए, ताकि यह आश्रित पैकेजों में उपलब्ध हो?


3
ध्यान रखें कि जब एक प्रतिबद्ध की आवश्यकता होती है, तो संगीतकार आवश्यकताओं (cmoposer.json) का सम्मान नहीं करेगा। इसके बजाय यह शाखा प्रमुख आवश्यकता की गणना करता है जो समय के साथ बदल जाएगा। तो यह कुछ समय के लिए काम कर सकता है, लेकिन भविष्य में निश्चित रूप से टूट जाएगा।
एस्टनी

जवाबों:


157

आपको स्पष्ट रूप से उस हैश में Gaufrette लाइब्रेरी की आवश्यकता होगी, जिसमें devआपकी लाइब्रेरी और आपके आवेदन दोनों में एक ध्वज होगा। कुछ इस तरह से आवेदन में काम करना चाहिए composer.json:

{
    "name": "bar/bar-app",
    "repositories": [
        {
            "type": "vcs",
            "url": "ssh://git.example.com/foo-lib"
        }
    ],
    "require-dev": {
        "foo/foo-lib": "dev-master",
        "knplabs/gaufrette": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e"
    }
}

से प्रलेखन :

यदि आपकी एक निर्भरता एक अस्थिर पैकेज पर निर्भरता है, तो आपको इसकी पर्याप्त स्थिरता ध्वज के साथ-साथ स्पष्ट रूप से इसकी आवश्यकता है।

दस्तावेज़ीकरण से यह भी पता चलता है कि आपको अपनी bar/bar-appसंगीतकार फ़ाइल में Gaufrette के लिए भंडार को शामिल करना होगा , हालांकि ऐसा लगता है कि इस मामले में यह आवश्यक नहीं था। मुझे यकीन नहीं है कि क्यों।


मैं पहले से ही यह कोशिश कर रहा हूँ, या तो काम नहीं करता है। मुझे लगता है कि यह कुछ विशेष रूप से GitHub पर Packagist पसंद संगीतकार के साथ क्या करने के लिए हो सकता है?
मैकीज एसज

नहीं, मैंने अपने स्थानीय रिपॉजिटरी के साथ जाँच की है - यह एक GitHub विशिष्ट मुद्दा नहीं है।
मैकियाज एसज

मुझे पूरा यकीन है कि मुझे इससे पहले काम करने के लिए मिला था। यदि आप आवश्यकताओं "minimum-stability": "dev"को जोड़ते हैं तो क्या होगा bar/bar-app?
क्रिस

3
ऐसा लगता है कि आपको अपनी लाइब्रेरी और अपने आवेदन दोनों में उस हैश में स्पष्ट रूप से Gaufrette की आवश्यकता होगी। "यदि आपकी एक निर्भरता अस्थिर पैकेज पर निर्भरता है, तो आपको इसकी पर्याप्त स्थिरता ध्वज के साथ-साथ स्पष्ट रूप से इसकी आवश्यकता है।" ध्यान दें कि आपके पास कुछ पैकेज हो सकते हैं, जैसे कि Gaufrette, devस्थिरता पर, और stableबाकी सब चीजों के लिए डिफ़ॉल्ट ।
क्रिस

2
ऐसा लगता है कि GitHub को बॉक्स के बाहर संगीतकार द्वारा समर्थित किया गया है - मैंने अभी "url": "https://github.com/KnpLabs/Gaufrette.git"पहले पैकेज से हटा दिया है और यह अभी भी काम करता है।
मैकीज एसज

15

यहाँ आप इसे कमांड लाइन पर कैसे करते हैं:

composer update knplabs/gaufrette:dev-master#2633721 --with-dependencies

आपको पूरे हैश का उपयोग करने की ज़रूरत नहीं है, एक हैश सात वर्ण लंबे समय से चाल को कम करने के लिए लगता है। जैसा कि ऊपर उल्लेख किया गया है, आपकी परियोजना को देव का समर्थन करने की आवश्यकता होगी - जो इसके बारे में शिकायत करेगा यदि पहले से सेट नहीं है। इसके अलावा, --with-dependenciesआपके द्वारा अपडेट किए जा रहे किसी भी निर्भरता को प्राप्त करने के लिए उपयोग करें।


0

यदि आप एक जाली रिपॉजिटरी के लिए परिवर्तन करके यह सुनिश्चित कर रहे हैं कि आप पैकेज नाम का उपयोग करते हैं, तो वास्तव में पैकेज की अपनी कंपोज़र.जसन फ़ाइल में परिभाषित किया जाता है - इसलिए भले ही मैंने पैकेज को अपने स्वयं के joshuapaling लिथब खाते में, और पैकेज अब URL https://github.com/joshuapaling/Cake-Resque.git पर निवास कर रहा था, जिसने संगीतकार परिप्रेक्ष्य से पैकेज के नाम को बिल्कुल प्रभावित नहीं किया था।

एक बेवकूफ त्रुटि - लेकिन मैं संगीतकार के लिए नया हूं, और यह पहली बार में स्पष्ट नहीं था! इसलिए, मुझे आशा है कि यह किसी और को उसी समस्या के साथ मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.