रूबी Gemspec निर्भरता: क्या एक शाखा शाखा निर्भरता संभव है?


83

क्या mygem.gemspec के अंदर एक git शाखा निर्भरता संभव है?

मैं निम्नलिखित के समान कुछ सोच रहा हूं:

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'

... लेकिन यह काम नहीं करता है।


मेरे पास यह एक ही मुद्दा है, सिवाय इसके कि मैं एक पथ निर्भरता चाहता हूं, न कि एक निर्भरता। वहाँ किसी भी तरह से यह चारों ओर पाने के लिए एक रास्ता नहीं है? हो सकता है कि रत्नों में कहीं हैकिश रूबी कोड चिपका कर?
अजादी 32

जवाबों:


44

यह संभव नहीं है, और संभावना कभी नहीं होगी क्योंकि यह मणि डेवलपर्स को अनुमति देने के लिए रूबीगम्स के लिए भारी-भरकम होगा ताकि उपयोगकर्ताओं को एक मणि तक पहुंचने के लिए उपयोगकर्ताओं को एक विशिष्ट संस्करण नियंत्रण प्रणाली स्थापित करने की आवश्यकता हो। रत्नों को कम से कम निर्भरता के साथ स्व-निहित होना चाहिए ताकि लोग उन्हें यथासंभव विस्तृत रूप से उपयोग कर सकें।

यदि आप अपनी स्वयं की आंतरिक परियोजनाओं के लिए ऐसा करना चाहते हैं, तो मेरा सुझाव बुंदेलर का उपयोग करना होगा जो इसे काफी समर्थन करता है।


22
... हां, लेकिन मैं यह कैसे कर सकता हूं?
लुका जी। सोवे

33
लेकिन क्या होगा यदि आपका रत्न बाद में किसी अन्य रत्न में शामिल किया जाए (जैसे। foobar_gem)? जब foobar_gem आपके मणि में निर्भरता को हल करना चाहता है, तो क्या यह विशेष रूप से रत्नों की फाइल में नहीं दिखेगा?
इरमेज़िट

7
क्या तुमने कभी इसका हल ढूंढा मुझे ठीक वैसी ही समस्या है?
msaspence

14
@eremzeit और msaspence - जब से आपके पास बहुत सारे upvotes हैं, मैं जवाब देने के लिए मजबूर महसूस करता हूं। इसका कोई हल नहीं है क्योंकि आप इसे गलत कर रहे हैं । बुंडलर का उपयोग करके किसी एकल एप्लिकेशन के लिए गिट रेपो पर निर्भर रहना ठीक है, रिलीज रत्न के लिए गीथहब या किसी अन्य स्रोत कोड रिपॉजिटरी पर निर्भर करना पूरी तरह से गलत है। यदि आप एक रत्न जारी कर रहे हैं, तो इसकी सभी निर्भरता भी रत्न के रूप में जारी की जानी चाहिए। एक औपचारिक पैकेज बनाने के लिए जैसे कि मणि पर भरोसा नहीं किया गया स्रोत कोड घोड़े के सामने गाड़ी रखना है। कृपया ऐसा करने का प्रयास न करें
GTD

23
@gtd रत्न बनाना और माणिक पर रत्न जारी करना दो अलग चीजें हैं। यह संभव है कि एक निजी अप्रकाशित मणि की अपनी निजी निर्भरता हो। जो मुझे ठीक लगता है। RubyGems इस उपयोग के मामले को पूरा नहीं करता है, लेकिन मुझे यकीन नहीं है कि यह गलत है। इसका समर्थन करने के लिए बहुत कुछ नहीं है। क्या मै गलत हु?
स्टीफन क्रॉसबी

14

संपादित करें

एक टिप्पणीकार के अनुसार, यह अब सच नहीं है। ऐतिहासिक संदर्भ के लिए पूर्व सूचना बरकरार रखी गई है।

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

जानकारी निकली

येहुदा काट्ज़ के इस लेख ने मेरे लिए इसी तरह के भ्रम को दूर किया। यह कहता है कि, केवल विकास में उपयोग के लिए, मणिभ में गिट सामान जोड़ना सबसे अच्छा है, लेकिन यह बंडलर अभी भी रत्नों से निर्भरता / संस्करण जानकारी का उपयोग करेगा (मेरे लिए जादुई लगता है, लेकिन मुझे येहुदा पर भरोसा है)।


3
उसके बारे में इतना जादुई क्या है? बुंडलर केवल जेमफाइल से पढ़ता है — सिवाय इसके कि अगर आप gemspecवहां डालते हैं, तो वह रत्नों से भी पढ़ता है। इसलिए जब आप दौड़ते हैं bundle install, तो मैं मानता हूं (लेकिन परीक्षण नहीं किया गया है) कि ऐसा क्या होता है कि बुंडलर जेमफाइल में निर्दिष्ट रत्न को स्थापित करता है। चूंकि बंडलर ने पहले ही इसे स्थापित कर लिया है, यह मणि मणि के लिए उपलब्ध है require, इस तथ्य की परवाह किए बिना कि यह मणि भंडार से नहीं आया था। कोई जादू नहीं, बस बुंदेलर हमेशा की तरह काम कर रहा है।
मार्नेन लाईबो-कोसर

2
जेमफाइल और .gemspec में एक मणि के संदर्भ को दोहराते हुए अब बुंडलर में एक चेतावनी संदेश प्रकट होता है, इसलिए यह उत्तर अब सच नहीं होगा ...
एंडी जोन्स

7

मैं बस इस समस्या का पता लगाने की कोशिश कर रहा था। और मैं बस निम्नलिखित समाधान के साथ आया (जो कि मुझे यकीन नहीं है कि अगर आपका रत्न प्रकाशित हो रहा है या उस ऊह रत्न को पुनर्वितरित करने का अधिकार है)।

अपने रत्न में जिसे oauth2 रत्न की आवश्यकता होती है, उसे चलाएं।

git submodule add git@github.com:lgs/oauth2.git lib/oauth2

यदि आपको डिफ़ॉल्ट से अलग शाखा की आवश्यकता है

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"

अपने रत्नों में अपनी आवश्यकता संस्करण रेखा से ऊपर जोड़ें

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

इसके अलावा, आपको अपने रत्न के लिए oauth2 मणि ​​के रनटाइम निर्भरता के सभी को जोड़ना होगा। मैंने अभी तक इसके आसपास कोई रास्ता नहीं निकाला है।

यह वही है जो मैंने किया था, और यह हमारे लिए काम करता है क्योंकि हमारे मणि की आवश्यकता गिट के माध्यम से होती है इसलिए मुझे यकीन नहीं है कि यह रगड़ से प्रकाशित रत्न के लिए काम करेगा।


यदि आप दोनों रत्नों को लेखक और सक्रिय विकास में हैं, तो सबमॉडल के रूप में निर्भरता जोड़ना सही समाधान है।
बेन्जाइनेर

महत्वपूर्ण रूप से यदि आप ऐसा करते हैं, तो आपको gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: trueअपने होस्ट एप्लिकेशन में उपयोग करने की आवश्यकता हो सकती है यदि आप जीथब से इंस्टॉल कर रहे हैं।
जो एडगर

1

मुझे एक काम के आस-पास काफ़ी सीधा दिखाई दिया:

कहते हैं कि आप एक परियोजना में हैं Pऔर आप स्व-निर्मित मणि का उपयोग करना चाहते हैं toolsजो स्वयं एक OS मणि का उपयोग करता है oauth2

यदि आपने एक पैच बनाया है oauth2और toolsआपको अपने रत्न में उस पैच की आवश्यकता है , तो आप स्वीकृत उत्तर के अनुसार रत्न में इस समस्या को ठीक नहीं कर पाएंगे ।

हालाँकि, आप अपने projet PGemfile के भीतर इच्छित संस्करण को मसालेदार कर सकते हैं , और यह रनवे द्वारा उपयोग किया जाने वाला संस्करण होगा tools:

gem 'oauth2', github: 'lgs/oauth2'

यहाँ मेरा एक वास्तविक जीवन उदाहरण है।

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