मैं अपनी Gemfile में स्थानीय .gem फ़ाइलों को कैसे निर्दिष्ट करूँ?


158

मेरे पास कुछ रत्न फाइलें हैं, जिन्हें मैं स्थापित करता हूं gem install xx.gem। क्या मैं बुंडलर को उनका उपयोग करने के लिए कह सकता हूं? या मुझे स्रोत पथ निर्दिष्ट करना होगा?


जवाबों:


281

.gemसंकुल को स्थापित करने के बारे में आपके प्रश्न का यह कड़ाई से जवाब नहीं है, लेकिन आप अपने Gemfile को संपादित करके रत्न-के-रत्न के आधार पर सभी प्रकार के स्थान निर्दिष्ट कर सकते हैं

एक :pathविशेषता निर्दिष्ट करने से आपके स्थानीय मशीन पर उस पथ से मणि स्थापित हो जाएगा।

gem "foreman", path: "/Users/pje/my_foreman_fork"

वैकल्पिक रूप से, एक :gitविशेषता निर्दिष्ट करने से एक दूरस्थ गिट रिपॉजिटरी से रत्न स्थापित होगा।

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"

(जैसा @ जुरहरा ने अपनी टिप्पणी में उल्लेख किया है ।)


इसके अलावा कुछ फायरवॉल के लिए गिट प्रोटोकॉल एक मुद्दा हो सकता है। ऐसे मामले में कोशिश करेंgem "foreman", :git => "https://github.com/pje/foreman.git"
kode

61

लगता है बंडल बॉक्स से बाहर .em फ़ाइलों का उपयोग नहीं कर सकता है। इंगित करता है: .gem फ़ाइलों वाली निर्देशिका के लिए पथ काम नहीं करता है। कुछ लोगों ने उस उद्देश्य के लिए एक स्थानीय रत्न सर्वर (जेमिनाबॉक्स, स्टिकलर) को सेटअप करने का सुझाव दिया।

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

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

अंत में अपने Gemfile के लिए निम्न पंक्ति जोड़कर इस स्थान पर बिंदु बंडलर करें

source "file://path/to/repo"

यदि आप रिपॉजिटरी में रत्नों को अपडेट करते हैं, तो सूचकांक को फिर से बनाना सुनिश्चित करें।


6
धन्यवाद! इसके अलावा, मुझे "फाइल: /// निरपेक्ष / पथ / टू / रेपो" करने के लिए एक तीसरी स्लैश की आवश्यकता थी
अन्ना

5
क्या कमांड लाइन पर "मणि सर्वर" चलाना और अपने जेमफाइल के लिए " लोकलहोस्ट: 8808 " स्रोत जोड़ना आसान नहीं होगा
अन्ना

यह वास्तव में अच्छा है मार्टिन! साझा करने के लिए धन्यवाद, वास्तव में मैं वह था जिसकी मुझे तलाश थी क्योंकि मैं न तो दौड़ने पर निर्भर gem serverरहना चाहता था और न ही मैं संपूर्ण .gem फ़ाइल की मेजबानी करना चाहता था।
सिंह गैलुकि

6
बोनस टिप: आप इस तरह से File.expand_path का उपयोग करके पूर्ण पथ की आवश्यकता के आसपास प्राप्त कर सकते हैंsource "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
लियो

मेरे लिए काम नहीं करता है। मैक ओएस एक्स। बुंडलर v1.11.2:Could not fetch specs from file://Users/nakilon/....../
नैकिलोन

44

मैं आपके वेंडर को एप्लिकेशन विक्रेता फ़ोल्डर में अनपैक कर दूंगा

gem unpack your.gem --target /path_to_app/vendor/gems/

फिर अनपैक्ड रत्न को जोड़ने के लिए जेमफाइल पर पथ जोड़ें।

gem 'your', '2.0.1', :path => 'vendor/gems/your'

29

डिफ़ॉल्ट रूप से Bundler आपके सिस्टम को पहले चेक करेगा और यदि यह एक रत्न नहीं मिल सकता है तो यह आपके Gemfile में निर्दिष्ट स्रोतों का उपयोग करेगा।


सच। लेकिन क्या होगा अगर मैंने इसे पहले स्थापित नहीं किया है? (जब एक सर्वर पर लागू किया जा रहा है) Imlib2-Ruby-0.5.2 को किसी भी प्रकार के कमांड कमांड में नहीं मिल सका है
ddayan

184
आप रत्न "gemname" के साथ स्थानीय निर्देशिका को इंगित कर सकते हैं: पथ => "~ / कुछ / स्थानीय / पथ"
Jhurrah

5
मुझे लगता है कि: path को gempec फ़ाइल के साथ मणि फ़ोल्डर की आवश्यकता होती है। मेरे पास केवल .gem फाइलें हैं जिन्हें मैं स्थापित करना चाहता हूं।
दिनमान

1
ठीक है, तो टोपी तैनात पारित कर दिया, लेकिन मणि स्थापित नहीं किया गया था "लोड करने के लिए ऐसी कोई फ़ाइल नहीं - vips": /
ddayan

4
यह निश्चित रूप से सच नहीं है, कम से कम अब। Bundler आपके सिस्टम रत्नों को नहीं देखता है, और केवल Gemfile में क्या होता है। एक कारण यह बहुत भयानक है।
bioneuralnet

6

आप बंडल को "बंडल पैकेज" और "बंडल इंस्टॉल - लॉकल" का उपयोग करके तैनात किए गए रत्नों का उपयोग करने के लिए बाध्य कर सकते हैं

आपकी विकास मशीन पर:

bundle install

(आवश्यक रत्न स्थापित करता है और Gemfile.lock बनाता है)

bundle package

(विक्रेता / कैश में रत्न कैश करता है)

सर्वर पर:

bundle install --local

(- एकल का अर्थ है "विक्रेता / कैश से रत्न का उपयोग करें")


क्या होगा अगर मैं सर्वर पर कुछ भी स्थापित नहीं कर सकता हूं? इस मामले में, मुझे रेक के साथ निर्माण करने की आवश्यकता है लेकिन सर्वर में एक रत्न नहीं है जिसका मैं निर्माण के लिए उपयोग करता हूं; लेकिन मुझे निर्भरता में जाँच करने में कोई समस्या नहीं है।
हेनरिक

"स्थापित बंडल" नहीं काम मेरे लिए यदि मणि अपने मौजूदा Gemfile "स्रोत में शामिल नहीं किया गया था।
अन्ना

केवल करने से पहले मणि फ़ाइल को अस्थायी रूप से मणि फ़ाइल से हटा दें। bundle installउसके बाद, मणिभ को विक्रेता / कैश को कॉपी करें , मणि को वापस मणि में जोड़ें और निष्पादित करें bundle install --local
बर्ट ब्रूनोघे

1
bundle packageएक बढ़िया सुझाव है, अब भी, तीन साल बाद। यदि आपका बुंडलर का संस्करण 2.0 से अधिक पुराना है (अभी तक इस लेखन में जारी नहीं किया गया है), bundle package --allतो आपको रत्नों pathया gitनिर्भरता के साथ रत्नों को शामिल करना होगा । हालांकि यह आपको इस तरह की निर्भरता का पता लगाने में एक सहायक अनुस्मारक देगा।
L2G

1
FYI करें: यह तब भी काम नहीं करेगा जब आप किसी अन्य प्लेटफ़ॉर्म पर विकसित होने की अपेक्षा करेंगे (जैसे macOS पर विकसित, लिनक्स पर तैनात)। --localडॉक्स के अनुसार : "ध्यान दें कि अगर rubygems.org पर एक उपयुक्त प्लेटफ़ॉर्म-विशिष्ट रत्न मौजूद है तो यह नहीं मिलेगा।"
लियाम डॉसन

1

काम करने के .gemलिए जोड़ने vendor/cacheलगता है। में कोई विकल्प की आवश्यकता नहीं है Gemfile


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