Git repo को क्लोन करने के लिए PHP कंपोज़र का उपयोग करें


111

मैं कंपोजर का उपयोग करने की कोशिश कर रहा हूं कि स्वचालित रूप से गिट से एक गिट रिपॉजिटरी को क्लोन करना है जो कि पैकगिस्ट में नहीं है लेकिन यह काम नहीं कर रहा है और मैं यह पता नहीं लगा सकता कि मैं क्या गलत कर रहा हूं।

मुझे लगता है कि मुझे इसे "रिपॉजिटरी" में शामिल करना होगा जैसे:

"repositories": [
    {
        "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
        "type": "git"
    }
],

और फिर संभवतः इसे "आवश्यकता" अनुभाग में सूचीबद्ध करें। यह इस उदाहरण के समान होना चाहिए लेकिन यह काम नहीं करता है। यह सिर्फ यह त्रुटि देता है:

आपकी आवश्यकताओं को संकुल के संस्थापित सेट में हल नहीं किया जा सकता है।

क्या किसी ने पहले से ही ऐसा कुछ करने की कोशिश की है?

जवाबों:


109

2013 में लिखने के समय, यह ऐसा करने का एक तरीका था। संगीतकार ने बेहतर तरीकों के लिए समर्थन जोड़ा है: @igorw का जवाब देखें

क्या आप एक प्रतिनिधि है?

Git, Mercurial और SVN को संगीतकार का समर्थन प्राप्त है।

क्या आपको रिपोर्ट लिखने की आवश्यकता है?

हाँ?

प्रतिनिधि एक composer.jsonफाइल है

यदि आपके पास एक रिपॉजिटरी है, तो आप इसे लिख सकते हैं: एक composer.jsonफ़ाइल जोड़ें , या मौजूदा एक को ठीक करें, और नीचे दिए गए समाधान का उपयोग न करें।

@Igorw के जवाब पर जाएं

यदि आप इस रिपोर्ट का उपयोग नहीं करते हैं या केवल रिपोर्ट का उपयोग नहीं करते हैं, तो आप इसे नहीं कर सकते हैं और आप इसे नहीं जोड़ सकते हैं
composer.json

इससे वह सब कुछ ओवरराइड हो जाएगा जो कम्पोज़र मूल रिपॉजिटरी से पढ़ने में सक्षम हो सकता है composer.json, जिसमें पैकेज की निर्भरता और ऑटोलॉडिंग शामिल है।

packageप्रकार का उपयोग करने से आप पर सब कुछ ठीक से परिभाषित करने का भार स्थानांतरित हो जाएगा। आसान तरीका यह है composer.jsonकि रिपॉजिटरी में एक फाइल हो, और बस उसका उपयोग करें।

यह समाधान वास्तव में केवल उन दुर्लभ मामलों के लिए है जहां आपके पास एक छोड़ दिया गया ज़िप डाउनलोड है जिसे आप बदल नहीं सकते हैं, या एक रिपॉजिटरी जिसे आप केवल पढ़ सकते हैं, लेकिन यह अब भी बनाए नहीं रखा गया है।

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}

7
पैकेज रिपॉजिटरी के साथ वीसीएस रिपॉजिटरी को बदलना एक बुरा विचार है। लक्ष्य रेपो में पहले से ही एक है composer.json, इसलिए एक vcs रेपो का उपयोग करें। आपका उदाहरण ऑटोलडिंग को भी तोड़ता है और अनदेखा करता है branch-alias
igorw

1
क्या आप कृपया उस जानकारी को लिंक कर सकते हैं ताकि मैं और अन्य अंतर को समझ सकें? धन्यवाद।
माइक ग्राफ

5
जैसा कि रिपॉजिटरी पेज पर समझाया गया है कि एक पैकेज रेपो में सभी जानकारी शामिल होनी चाहिए। यदि आप autoloadफ़ील्ड नहीं जोड़ते हैं , तो इसे शामिल नहीं किया जाएगा। मूल रूप से आपको composer.jsonरेपो परिभाषा से सभी जानकारी कॉपी-पेस्ट करने की आवश्यकता होती है । वीसीएस रेपो सीधे वीसीएस से उस जानकारी को प्राप्त करता है। एलियास डॉक और मेरे द्वारा लिखे गए एक ब्लॉग पोस्टbranch-alias में इसके फायदे बताए गए हैं ।
igorw

2
यह अब भी क्यों उखाड़ा जा रहा है? संगीतकार डॉक्स भी स्पष्ट रूप से बताता है कि पैकेज रेपो से बचा जाना चाहिए। कृपया, बुरी प्रथाओं को प्रोत्साहित करना बंद करें।
igorw

1
आप मुझे इसे तब बदलने की क्या सलाह देते हैं?
माइक ग्राफ

146

वह पैकेज वास्तव में पैकगिस्ट के माध्यम से उपलब्ध है । आपको इस मामले में कस्टम रिपॉजिटरी परिभाषा की आवश्यकता नहीं है। बस सुनिश्चित करें कि आप requireएक मिलान संस्करण की कमी के साथ एक (जो हमेशा की जरूरत है) जोड़ते हैं ।

सामान्य तौर पर, यदि पैकेज पैकेजिस्ट पर उपलब्ध है, तो वीसीएस रेपो जोड़ें। यह बस चीजों को धीमा कर देगा।


उन पैकेजों के लिए जो पैकगिस्ट के माध्यम से उपलब्ध नहीं हैं, एक वीसीएस (या गिट) रिपॉजिटरी का उपयोग करें, जैसा कि आपके प्रश्न में दिखाया गया है। जब आप ऐसा करें, तो सुनिश्चित करें कि:

  • "रिपॉजिटरी" फ़ील्ड को रूट कंपोज़र में निर्दिष्ट किया गया है। Json (यह रूट-ओनली फ़ील्ड है, आवश्यक पैकेजों से रिपॉजिटरी परिभाषाओं को अनदेखा कर दिया जाता है)
  • रिपॉजिटरी की परिभाषा एक वैध वीसीएस रेपो की ओर इशारा करती है
  • यदि प्रकार "vcs" के बजाय "git" है (जैसा कि आपके प्रश्न में है), सुनिश्चित करें कि यह वास्तव में gitfo है
  • आपके पास requireप्रश्न में पैकेज के लिए है
  • requireVCS रेपो द्वारा प्रदान किए गए संस्करणों से मेल खाता है। आप composer show <packagename>उपलब्ध संस्करणों को खोजने के लिए उपयोग कर सकते हैं । इस मामले में ~2.3एक अच्छा विकल्प होगा।
  • में नाम requireदूरदराज में नाम से मेल खाता composer.json। इस मामले में, यह है gedmo/doctrine-extensions

यहाँ एक नमूना है composer.jsonजो VCS रेपो के माध्यम से एक ही पैकेज स्थापित करता है:

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

VCS डॉक्स रेपो यह सब बहुत अच्छी तरह से समझाने।


यदि कोई composer.jsonउपलब्ध के साथ एक गिट (या अन्य वीसीएस) भंडार है, तो "पैकेज" रेपो का उपयोग करें। पैकेज रिपॉज आपको परिभाषा में मेटाडेटा के सभी प्रदान करने की आवश्यकता है और किसी भी पूरी तरह से अनदेखा करेगाcomposer.json किए गए डिस्ट और स्रोत में मौजूद । उनके पास अतिरिक्त सीमाएं भी हैं, जैसे कि ज्यादातर मामलों में उचित अपडेट की अनुमति नहीं है।

पैकेज रिपोज ( डॉक्स भी देखें ) से बचें ।


1
औउ, धन्यवाद! मुझे यह नहीं मिला क्योंकि मुझे लगा कि इसे git repo DoctrineExtensions के बाद बुलाया जाएगा।
मार्टिन

2
हमेशा दिए गए नाम को देखें composer.json
१०

16
-1 इसे सही उत्तर के रूप में क्यों चिह्नित किया गया है? इसने निश्चित रूप से ओपी की समस्या को हल किया लेकिन क्लैरेंस और माइक ग्राफ ने इसके पीछे की सामान्य समस्या के जवाब दिए। यह अत्यधिक संभावना नहीं है कि कोई भी गैर-पैकगिस्ट परियोजनाओं को शामिल करने के तरीके की खोज कर रहा है, जो DoctrineExtensions को शामिल करना चाहते हैं।
एफ़एक्सएक्सएक्स

2
@aefxx मेरा जवाब होता है वास्तव में भी सामान्य सामान्य समस्या है, जो है कि समझाने के requireक्षेत्र निर्दिष्ट किया जाना चाहिए।
igorw

6
The VCS repo docs explain all of this quite well.... क्या?
hek2mgl

47

आप git रिपॉजिटरी को कंपोजर से जोड़ सकते हैं। इस तरह से करें:

"repositories": [
{
    "type": "package",
    "package": {
        "name": "example-package-name", //give package name to anything, must be unique
        "version": "1.0",
        "source": {
            "url": "https://github.com/example-package-name.git", //git url
            "type": "git",
            "reference": "master" //git branch-name
        }
    }
}],
"require" : {
  "example-package-name": "1.0"
}

1
जैसा कि ऊपर अन्य उत्तरों में बताया गया है: यदि आपके पास एक भंडार है, composer.jsonतो यदि संभव हो तो एक फ़ाइल जोड़ें ।
स्वेन

@Sven ... क्योंकि एक विशिष्ट प्रतिबद्ध को निर्दिष्ट करना असंभव है अन्यथा?
सेस टिम्मरमैन

साझा करने के लिए धन्यवाद, मुझे घंटों बचाया गया
मेटामेकर

यह सामान्य होने के लिए समायोजित किया गया है, लेकिन अन्यथा मूल रूप से माइक ग्रेफ के उत्तर की एक सादी प्रति है, इसलिए मुझे यकीन नहीं है कि सामान्य प्रश्न को उदाहरण के रूप में किसी विशेष पुस्तकालय को देखने से बेहतर है।
FantomX1

6

यदि उपलब्ध हो तो स्रोत का उपयोग करने के लिए संगीतकार को बताएं:

composer update --prefer-source

या:

composer install --prefer-source

तब आपको निकाले गए टारबॉल के बजाय क्लोन रिपोजिटरी के रूप में पैकेज मिलेंगे, इसलिए आप कुछ बदलाव कर सकते हैं और उन्हें वापस कर सकते हैं। बेशक, मान लें कि आपके पास रिपॉजिटरी को लिखने / पुश करने की अनुमति है और कंपोजर प्रोजेक्ट के रिपॉजिटरी के बारे में जानता है।

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

यदि कम्पोज़र को पता नहीं है, जहां प्रोजेक्ट का रिपॉजिटरी है, या प्रोजेक्ट के पास उचित कंपोजर नहीं है। स्थिति, स्थिति थोड़ी अधिक जटिल है, लेकिन दूसरों ने पहले से ही ऐसे परिदृश्यों का जवाब दिया है।


3

मैं निम्नलिखित त्रुटि का सामना कर रहा था: The requested package my-foo/bar could not be found in any version, there may be a typo in the package name.

यदि आप अपने स्वयं के परिवर्तन करने के लिए एक और रेपो का उपयोग कर रहे हैं, तो आप एक नए भंडार के साथ समाप्त हो जाएंगे।

उदाहरण के लिए:

https://github.com/foo/bar.git
=>
https://github.com/my-foo/bar.git

नए url को आपके कंपोज़र.जॉन के रिपॉजिटरी सेक्शन में जाना होगा।

याद रखें कि यदि आप अपने कांटे को my-foo/barअपने आवश्यकता खंड के रूप में संदर्भित करना चाहते हैं , तो आपको composer.jsonअपने नए रेपो के अंदर फ़ाइल में पैकेज का नाम बदलना होगा ।

{
    "name":         "foo/bar",

=>

{
    "name":         "my-foo/bar",

अगर आपने अभी-अभी सबसे आसान तरीका निकाला है तो इसे सही तरीके से संपादित करें।


ध्यान दें कि पैकेज का नाम किसी भी तरह से उस URL को नहीं दर्शाता है जहाँ से आप रिपॉजिटरी पढ़ सकते हैं! दोनों के बीच कोई स्वचालित लिंक नहीं है, दोनों को स्वतंत्र रूप से चुना जा सकता है। संगीतकार के बारे में एकमात्र प्रासंगिक जानकारी nameअंदर विशेषता में लिखा गया नाम है composer.json
स्वेन

2

मेरे मामले में, मैं Symfony2.3.x का उपयोग करता हूं और न्यूनतम-स्थिरता पैरामीटर डिफ़ॉल्ट रूप से "स्थिर" (जो अच्छा है) है। मैं एक पैकेज में नहीं रेपो आयात करना चाहता था, लेकिन एक ही मुद्दा था "आपकी आवश्यकताओं को पैकेजों के एक सेट पर हल नहीं किया जा सकता है।" ऐसा प्रतीत हुआ कि कंपोजर.जेन्सन रेपो में मैंने न्यूनतम-स्थिरता "देव" का उपयोग करने की कोशिश की।

इसलिए इस समस्या को हल करने के लिए, सत्यापित करना न भूलें minimum-stability । मैंने इस पोस्ट में बताए अनुसार dev-masterसंस्करण की आवश्यकता के द्वारा इसे हल किया ।master


4
मेरे पास वही मुद्दा था, जिसकी चर्चा यहां की गई है । यदि आपके पास एक स्पष्ट रेफरी (जैसे जीआईटी कमिट) है, तो ऐसा प्रतीत होता है कि आप कुछ ऐसा कर सकते हैं "dev-master#4536bbc166ada96ff2a3a5a4b6e636b093103f0e"
ब्लास्काकोवेज़

1

यदि आप composer.jsonGitHub से उपयोग करना चाहते हैं तो आप इस उदाहरण (VCS अनुभाग के तहत) को देखेंगे ।

पैकेज अनुभाग उन पैकेजों के लिए है, जिनमें नहीं है composer.json । हालाँकि, आपने उस उदाहरण का भी पालन नहीं किया या यह भी काम किया होगा। पैकेज रिपॉजिटरी के बारे में यह क्या कहता है पढ़ें:

मूल रूप से, आप उसी जानकारी को परिभाषित करते हैं जो संगीतकार रिपॉजिटरी में शामिल है packages.json, लेकिन केवल एक पैकेज के लिए। फिर, न्यूनतम आवश्यक फ़ील्ड नाम, संस्करण और या तो दूर या स्रोत हैं।


0

मैं यहां बताए गए समाधानों में शामिल होने की कोशिश करता हूं क्योंकि इसे सूचीबद्ध करने के लिए कुछ महत्वपूर्ण बिंदु हैं।

  1. जैसा कि @ igorw के उत्तर में रिपॉजिटरी के URL का उल्लेख किया जाना चाहिए, वह इस मामले में composer.json फ़ाइल में निर्दिष्ट होना चाहिए, हालाँकि दोनों ही मामलों में कंपोजर.json मौजूद होना चाहिए (दूसरे तरीके @Mike Graf के विपरीत) इसे Packagist पर प्रकाशित करना है। इतना अलग नहीं है (इसके अलावा गितुब वर्तमान में एनपीएम पैकेज के रूप में पैकेज सेवाएं भी प्रदान करता है), केवल शाब्दिक रूप से URL को पैकगिस्ट इंटरफ़ेस में एक बार साइन अप करने के बजाय अंतरित करना।

  2. इसके अलावा, इसकी एक कमी है कि यह एक बाहरी पुस्तकालय पर भरोसा नहीं कर सकता है जो पुनरावर्ती रिपॉजिटरी परिभाषाओं के रूप में इस दृष्टिकोण का उपयोग करता है जो कि संगीतकार में काम नहीं करता है। इसके अलावा, इसके कारण, इस पर एक "बग" प्रतीत होता है, क्योंकि पुनरावर्ती परिभाषा पर निर्भरता में विफल हो गया है, मूल रूप से रिपॉजिटरी को स्पष्ट रूप से मूल में पर्याप्त नहीं लगता है, बल्कि पैकेज से सभी निर्भरताएं होती हैं। सम्मानित होना।

साथ एक संगीतकार फ़ाइल (15:13 igorw पर अक्टू 18 '12 जवाब)

{
    "repositories": [
        {
            "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
            "type": "git"
        }
    ],
    "require": {
        "gedmo/doctrine-extensions": "~2.3"
    }
}

एक संगीतकार फ़ाइल के बिना (जनवरी 23 '13 17:28 माइक ग्रेफ का जवाब)

"repositories": [
    {
        "type":"package",
        "package": {
          "name": "l3pp4rd/doctrine-extensions",
          "version":"master",
          "source": {
              "url": "https://github.com/l3pp4rd/DoctrineExtensions.git",
              "type": "git",
              "reference":"master"
            }
        }
    }
],
"require": {
    "l3pp4rd/doctrine-extensions": "master"
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.