ฉันจะระบุไฟล์. gem ภายในเครื่องใน Gemfile ของฉันได้อย่างไร


158

gem install xx.gemฉันมีสองไฟล์อัญมณีซึ่งผมติดตั้งผ่านทาง ฉันสามารถบอก Bundler ให้ใช้งานได้หรือไม่ หรือฉันจะต้องระบุเส้นทางที่มา?


คำตอบ:


281

นี้ไม่ได้เป็นอย่างเคร่งครัดคำตอบสำหรับคำถามของคุณเกี่ยวกับการติดตั้ง.gemแพคเกจ, แต่คุณสามารถระบุทุกชนิดของสถานที่บนพื้นฐานอัญมณีโดยอัญมณีโดยการแก้ไขของคุณGemfile

การระบุแอ:pathททริบิวต์จะติดตั้งอัญมณีจากพา ธ นั้นในเครื่องของคุณ

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

อีกทางหนึ่งการระบุ:gitแอตทริบิวต์จะติดตั้ง gem จากที่เก็บ 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"

( ดังที่@JHurrahพูดถึงในความคิดเห็นของเขา )


นอกจากนี้สำหรับโปรโตคอล git ไฟร์วอลล์บางตัวอาจมีปัญหา ในกรณีเช่นนี้ลองgem "foreman", :git => "https://github.com/pje/foreman.git"
kode

61

ดูเหมือนว่า Bundler ไม่สามารถใช้ไฟล์. gem นอกกรอบได้ การชี้ไปที่: เส้นทางไปยังไดเรกทอรีที่มีไฟล์. gem ไม่ทำงาน บางคนแนะนำให้ตั้งค่าเซิร์ฟเวอร์ภายในเครื่อง (geminabox, stickler) เพื่อจุดประสงค์นั้น

อย่างไรก็ตามสิ่งที่ฉันพบว่าง่ายกว่ามากคือการใช้ "เซิร์ฟเวอร์" ในระบบไฟล์จาก gem: เพียงแค่ใส่ไฟล์. gem ของคุณลงในไดเรกทอรีภายในเครื่องจากนั้นใช้ "gem generate_index" เพื่อทำให้มันเป็นที่เก็บของ Gem

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

ในที่สุดก็ชี้ไปที่สถานที่นี้โดยการเพิ่มบรรทัดต่อไปนี้ใน Gemfile ของคุณ

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

หากคุณอัปเดตพลอยในที่เก็บตรวจสอบให้แน่ใจว่าได้สร้างดัชนีใหม่


6
ขอบคุณ! นอกจากนี้ฉันต้องการสแลชที่สามเพื่อทำ "file: /// แอบโซลูท / Path / to / repo"
Anna

5
จะเป็นการง่ายกว่าหรือไม่ที่จะเรียกใช้ "เซิร์ฟเวอร์อัญมณี" บนบรรทัดคำสั่งและเพิ่มแหล่ง " localhost: 8808 " ใน Gemfile ของคุณ
Anna

นี่คือมาร์ตินสุดยอดจริงๆ! ขอบคุณสำหรับการแบ่งปันคือว่าฉันกำลังมองหาเพราะฉันไม่ต้องการที่จะขึ้นอยู่กับการทำงานgem serverและฉันต้องการโฮสต์โครงการทั้งหมดเพียงแค่ไฟล์. gem
Leo Gallucci

6
เคล็ดลับโบนัส: คุณสามารถแก้ไขข้อกำหนดพา ธ สัมบูรณ์ได้โดยใช้ File.expand_path เช่นนี้source "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

ไม่ได้ผลสำหรับฉัน Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon

44

ฉันจะเอาอัญมณีของคุณออกจากโฟลเดอร์ผู้ขายแอปพลิเคชัน

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

จากนั้นเพิ่มเส้นทางบน Gemfile เพื่อลิงก์อัญมณีที่ไม่ได้แพ็ค

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

29

โดยค่าเริ่มต้น Bundler จะตรวจสอบระบบของคุณเป็นอันดับแรกและหากไม่พบอัญมณีมันจะใช้แหล่งข้อมูลที่ระบุใน Gemfile ของคุณ


จริง แต่จะเกิดอะไรขึ้นถ้าฉันไม่ได้ติดตั้งมาก่อน (เมื่อฉันปรับใช้กับเซิร์ฟเวอร์) ไม่พบ Imlib2-Ruby-0.5.2 ในคำสั่งต้นทางใด ๆ เสร็จสิ้น
ddayan

184
คุณสามารถชี้ไปที่ไดเร็กตอรี่ท้องถิ่นด้วย gem "gemname",: path => "~ / some / local / path"
JHurrah

5
ฉันคิดว่า: path ต้องใช้โฟลเดอร์ gem ที่มีไฟล์ gemspec ฉันมีไฟล์. gem เท่านั้นที่ฉันต้องการติดตั้ง
ddayan

1
ตกลงเพื่อให้การปรับใช้ผ่านไปแล้ว แต่ไม่ได้ติดตั้งอัญมณี "ไม่มีไฟล์ดังกล่าวที่จะโหลด - vips": /
ddayan

4
นั่นไม่เป็นความจริงอย่างน้อยก็อีกต่อไป Bundler ไม่ได้ดูที่อัญมณีในระบบของคุณและจะผ่านสิ่งที่อยู่ใน Gemfile เท่านั้น หนึ่งในเหตุผลมันแย่มาก
bioneuralnet

6

คุณสามารถบังคับให้ Bundler ใช้พลอยที่คุณนำไปใช้โดยใช้ "แพ็คเกจแพ็คเกจ" และ "บันเดิลติดตั้ง --local"

บนเครื่องพัฒนาของคุณ:

bundle install

(ติดตั้งพลอยที่จำเป็นและทำให้ Gemfile.lock)

bundle package

(แคชอัญมณีในผู้ขาย / แคช)

บนเซิร์ฟเวอร์:

bundle install --local

(- เฉพาะหมายความว่า "ใช้อัญมณีจากผู้ขาย / แคช")


ถ้าฉันไม่สามารถติดตั้งอะไรบนเซิร์ฟเวอร์ ในกรณีนี้ฉันต้องสร้างด้วย rake แต่เซิร์ฟเวอร์ไม่มีอัญมณีที่ฉันใช้สำหรับการสร้าง แต่ฉันไม่มีปัญหาในการตรวจสอบในการอ้างอิง
Henrik

"การติดตั้งแบบรวมกลุ่ม" ไม่สามารถใช้งานได้กับฉันหากแหล่งข้อมูลไม่ได้รวมอยู่ใน Gemfile ที่มีอยู่ของฉัน "
Anna

เพียงแค่ลบไฟล์อัญมณีในรูปแบบไฟล์อัญมณีชั่วคราวก่อนที่จะทำbundle installหลังจากนั้นคัดลอก gemfile ไปยังผู้ขาย / แคชเพิ่มอัญมณีกลับไปที่ gemfile และดำเนินการ bundle install --local
bert bruynooghe

1
bundle packageเป็นข้อเสนอแนะที่ดีแม้ตอนนี้สามปีต่อมา หากรุ่น Bundler ของคุณเก่ากว่า 2.0 (ยังไม่วางจำหน่ายในการเขียนนี้) คุณจะต้องใช้bundle package --allหากคุณต้องการรวมอัญมณีด้วยpathหรือการgitอ้างอิง มันจะให้คำเตือนที่เป็นประโยชน์หากตรวจพบการพึ่งพาดังกล่าว
L2G

1
FYI: สิ่งนี้อาจใช้ไม่ได้ผลเช่นเดียวกับที่คุณคาดหวังหากคุณพัฒนาบนแพลตฟอร์มที่แตกต่างจากที่คุณปรับใช้ (เช่นพัฒนาบน macOS, ปรับใช้กับ Linux) ตาม--localเอกสาร: "โปรดทราบว่าหากอัญมณีเฉพาะแพลตฟอร์มที่เหมาะสมมีอยู่ใน rubygems.org จะไม่พบอัญมณี"
Liam Dawson


0

ฉันพบว่าการรันเซิร์ฟเวอร์อัญมณีของตัวเองโดยใช้ทำได้ง่ายที่สุด geminabox

ดูคำแนะนำง่ายๆเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.