2012-09-03 29 views
9

के लिए पथ की आवश्यकता है I पैकेज - myvendor/mylib - मैं पैकेजर के माध्यम से संभवतः संगीतकार का उपयोग करके वितरित करने की योजना बना रहा हूं। इस पैकेज में - अन्य चीजों के साथ - एक कमांडलाइन PHP स्क्रिप्ट bin/console.php है कि मैं परियोजनाओं के लिए उपलब्ध करना चाहता हूं - myvendor/mymain कहें - जो mylib पैकेज आयात करता है।निर्भरता में स्क्रिप्ट कंपोज़र ऑटोलोडर

मुझे पता है कि मैं डिब्बे की एक सरणी के साथ composer.json में एक config सेटिंग आयात करने के लिए mylib पैकेज में निर्दिष्ट कर सकते हैं हूँ:

{ 
    "name": "myvendor/mylib", 
    "config" : { 
     "bin" : ["bin/console.php"] 
    } 
} 

mymain परियोजना एक संगीतकार/अद्यतन को स्थापित करता है, तो यह mylib/bin/console.php है mymain/bin/console.php इसके अलावा के रूप में सांकेतिक रूप से लिंक, मुझे पता है कि mymain परियोजना निर्दिष्ट कर सकते हैं कर रहा हूँ - अपने ही में composer.json - जहां वह चाहता निर्भरता डिब्बे सांकेतिक रूप से लिंक किया जाना है:

{ 
    "name": "myvendor/mymain", 
    "config": { 
     "bin-dir": "scripts" 
    } 
} 

इस मामले में, कंसोल स्क्रिप्ट को scripts/console.php के रूप में सिम्लिंक किया जाता है।

यह ठीक काम करता है - और जैसा कि सभी बाहर निकलते हैं, उतना ही अच्छा है। ;-)

हालांकि, स्क्रिप्ट bin/console.php को कंपोज़र से उत्पन्न vendor/autoloader.php शामिल करने की आवश्यकता है। अलगाव में mylib विकसित करते समय, स्क्रिप्ट bin/console.phpvendor/autoloader.php से संबंधित अपने स्थान को जानता है, इसलिए वह इसे आसानी से शामिल कर सकता है। लेकिन एक बार इसे किसी अन्य प्रोजेक्ट में निर्भरता के रूप में आयात किया जाता है - myvendor/mymain, इस मामले में - तो केवल mymain/vendor/autoloader.php स्क्रिप्ट है। सिद्धांत रूप में, कंसोल स्क्रिप्ट यह नहीं जान सकती कि वह उस ऑटोलोडर स्क्रिप्ट के सापेक्ष कहां रहता है।

क्या संगीतकार कुछ पर्यावरण चर प्रदान करता है - कंसोल स्क्रिप्ट के लिए सुलभ - जो स्क्रिप्ट को सही vendor/autoloader.php स्क्रिप्ट का पता लगाने की अनुमति देता है?

Btw: मैं Composer CLI environment variable के बारे में पता कर रहा हूँ, इसलिए मुझे लगता है कि मैं इसे एक आवश्यकता है कि आयात करने परियोजना बना सकता है - mymain - परिभाषित वर COMPOSER_VENDOR_DIR (और निर्यात!)। फिर प्रोजेक्ट के ऑटोलोडर को खोजने के लिए मेरी कंसोल स्क्रिप्ट इसका उपयोग कर सकती है। लेकिन उस कि में संभावित रूप से समस्या लगता है:

  1. हम सेटिंग केवल करने के लिए इस परियोजना लागू करना चाहते हैं, लेकिन एक खोल वर (और एक निर्यात) सभी परियोजनाओं खोल सत्र से पहुँचा पर लागू होगा। एक आयात परियोजना पर लगाए जाने के लिए - मेरी छोटी निर्भरता - myvendor/mylib - की प्रस्तुति के बारे में लगता है।

  2. सिद्धांत रूप में, निर्भरता स्वयं - myvendor/mylib - उसे जो चाहिए उसे ढूंढने में सक्षम होना चाहिए। आयातक पर ऑनस डालने का अधिकार प्रतीत नहीं होता है।

WDYT? अग्रिम में धन्यवाद। विचारों का स्वागत है।

उत्तर

3

एक दृष्टिकोण (जो कि मैं टीका कर रहा हूँ और जिस पर मैं कुछ हद तक विस्तार हो रहा आईआरसी freenode #composer पर @igorw के साथ विचार विमर्श से बाहर आया) बिन स्क्रिप्ट console.php फाइल सिस्टम ऊपर पुनरावृति, __DIR__ से शुरू की तलाश में जाने के लिए है autoload.php की उपस्थिति।

+2

आपको वास्तव में दोहराने की आवश्यकता नहीं है, तो आप केवल दो डीआईआरएस देख सकते हैं क्योंकि /<पैकेज-नाम>/ – Seldaek

+0

@ सेल्डेक: ठीक है, मैं अंत में [नमूना] से आपका नमूना समझ गया [https: // github.com/Seldaek/jsonlint/blob/master/bin/jsonlint) और इस तरह से लागू किया। बहुत बहुत धन्यवाद! –

+0

लगता है कि लोगों के पास अभी भी समस्याएं हैं (मुझे!) यहां एक उत्तर मिला: http://stackoverflow.com/questions/35271282/how-can-i-provide-a-script-for-php-cli-via -composer के रूप में स्टैंडअलोन और के रूप में-निर्भरता – VladFr