ฉันจะระบุอัญมณีท้องถิ่นใน Gemfile ของฉันได้อย่างไร


359

ฉันต้องการให้ Bundler โหลดอัญมณีในท้องถิ่น มีตัวเลือกสำหรับสิ่งนั้นหรือไม่? หรือฉันต้องย้ายโฟลเดอร์อัญมณีไปยังไดเรกทอรี. bundle หรือไม่

คำตอบ:


540

ฉันเชื่อว่าคุณสามารถทำได้:

gem "foo", path: "/path/to/foo"

10
เส้นทางแบบฮาร์ดโค้ดนั้นใช้ได้กับการแฮ็กข้อมูลอย่างรวดเร็ว แต่โซลูชันอัญมณีท้องถิ่นของ bloudermilk นั้นมีประสิทธิภาพมากกว่าสำหรับโครงการที่อยู่ภายใต้การควบคุมเวอร์ชัน มันช่วยให้คุณสามารถตรวจสอบในทั้งสองโครงการ - อัญมณีและโครงการโดยใช้อัญมณี - เพื่อให้ผู้อื่นไม่จำเป็นต้องตรวจสอบแหล่งที่มาของอัญมณีหรือแบ่งปันเส้นทางเดียวกัน
mahemoff

4
คุณสามารถทำให้สิ่งนี้สะอาดขึ้นเล็กน้อยได้โดยใช้ symlink ที่ได้รับการแต่งตั้งให้กับอัญมณีในพื้นที่ของคุณในไดเรกทอรีโครงการของคุณซึ่งคุณสามารถใช้การควบคุมแหล่งที่มาของทั้งสองโครงการแยกจากกันและอื่น ๆ สามารถทำได้เหมือนกัน
ด่าน

7
สิ่งที่ต้องระวังอาจจะเป็นฤดูใบไม้ผลิ หากคุณใช้เส้นทางในท้องถิ่นสำหรับอัญมณีของคุณคุณสามารถสังเกตเห็นอัญมณีในท้องถิ่นของคุณในเวอร์ชันแคชที่ฉันทำในคอนโซลทางรถไฟ หากดูเหมือนว่าไม่ได้มีการหยิบอัญมณีในท้องถิ่นของคุณขึ้นมาลองspring stopดูว่าเป็นปัญหาหรือไม่
Jason R

1
การเพิ่มเส้นทางอัญมณีในท้องถิ่นไปที่ config / spring.rb ดูเหมือนว่าจะช่วยให้คุณเลือกการเปลี่ยนแปลงอัญมณีในเครื่องของคุณหลังจากรีสตาร์ทคอนโซล / เซิร์ฟเวอร์ของ Rails
Jason R

5
วิธีที่ดีกว่าในการทำสิ่งนี้ที่นี่: rossta.net/blog/…
Cyzanfar

230

นอกเหนือจากการระบุเส้นทาง (ตามที่จิมมี่กล่าวไว้) คุณสามารถบังคับให้ Bundler ใช้อัญมณีท้องถิ่นสำหรับสภาพแวดล้อมของคุณเท่านั้นโดยใช้ตัวเลือกการกำหนดค่าต่อไปนี้:

$ bundle config local.GEM_NAME /path/to/local/git/repository

สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณกำลังพัฒนาสองอัญมณีหรือพลอยและแอพพลิเคชั่นรถไฟเคียงข้างกัน

อย่างไรก็ตามโปรดทราบว่าสิ่งนี้ใช้ได้เฉพาะเมื่อคุณใช้ git สำหรับการอ้างอิงของคุณแล้วเช่น:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

เท่าที่เห็นในเอกสาร


ฉันกำลังมีปัญหากับเรื่องนี้เพราะฉันกำลังใช้BUNDLE_PATH(สร้างแพคเกจสำหรับการแจกจ่าย) เมื่อทำสิ่งที่คุณแนะนำหรือคำตอบของจิมมี่มันจะทำusingและไม่ได้ติดตั้งในBUNDLE_PATHโฟลเดอร์ของฉัน ฉันไม่สามารถคิดออกความช่วยเหลือใด ๆ
Automatico

2
หมายเหตุนี้จะไม่ทำงานกับgemspecต่อการอภิปรายที่นี่
davetapley

31
หากต้องการปิดใช้งานการแทนที่ในเครื่อง:bundle config --delete local.GEM_NAME
alxndr

ฉันต้องลบคำสั่งเวอร์ชันออกจากสายอัญมณีเพื่อให้ทำงานได้
Epigene

4
หากคุณต้องการใช้สาขาอื่นในการพัฒนาจากการผลิตคุณต้องตั้งค่าbundle config disable_local_branch_check trueมิฉะนั้น Bundler จะบ่นเกี่ยวกับสาขา Gemfile.lockระมัดระวังกับแม้ว่านี้เช่นการตรวจสอบควรจะหยุดการกระทำที่ไม่ถูกต้องได้รับเป็น เอกสารที่นี่: bundler.io/v1.12/git.html
Leo

33

นอกจากนี้คุณยังสามารถอ้างอิงอัญมณีท้องถิ่นกับคอมไพล์หากคุณกำลังทำงานกับมัน

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

จากนั้นถ้ามันเปลี่ยนฉันก็วิ่ง

bundle exec gem uninstall foo
bundle update foo

แต่ฉันไม่แน่ใจว่าทุกคนต้องใช้สองขั้นตอนนี้


5
นี่เป็นสิ่งที่ดี แต่ไม่สะดวกหากคุณกำลังพัฒนาอัญมณีอย่างแข็งขัน ... เพราะคุณจะต้องยอมรับการเปลี่ยนแปลงทุกอย่าง & bundle uninstall <gem> && bundle install สำหรับการเปลี่ยนแปลงทุกอย่างที่คุณต้องการสะท้อนให้เห็นในแอปของคุณ
Ramses

18

เพื่อใช้คลังเก็บอัญมณีท้องถิ่นในโครงการ Rails ให้ทำตามขั้นตอนด้านล่าง:

  1. ตรวจสอบว่าโฟลเดอร์ gem ของคุณเป็นที่เก็บ git หรือไม่ (คำสั่งถูกเรียกใช้งานในโฟลเดอร์ gem)

    git rev-parse --is-inside-work-tree
  2. การรับพา ธ ที่เก็บข้อมูล (คำสั่งถูกเรียกใช้งานในโฟลเดอร์ gem)

    git rev-parse --show-toplevel
  3. การตั้งค่าการแทนที่แบบโลคัลสำหรับแอ็พพลิเคชันทางรถไฟ

    bundle config local.GEM_NAME /path/to/local/git/repository

    ที่GEM_NAMEเป็นชื่อของอัญมณีของคุณและ/path/to/local/git/repositoryเป็นผลลัพธ์ของคำสั่งในจุด2

  4. ในแอปพลิเคชันของคุณGemfileเพิ่มบรรทัดต่อไปนี้:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. การวิ่งbundle installควรให้อะไรแบบนี้:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    ที่GEM_NAMEเป็นชื่อของอัญมณีของคุณและ/path/to/local/git/repositoryจากจุด2

  6. สุดท้ายbundle listอย่าวิ่งgem listและคุณควรเห็นสิ่งนี้:

    GEM_NAME (0.0.1 5a68b88)

    GEM_NAMEชื่ออัญมณีของคุณอยู่ที่ไหน


กรณีสำคัญสองสามข้อที่ฉันใช้งานอยู่:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • ดูเหมือนว่าRubyMineจะไม่แสดงอัญมณีในพื้นที่เป็นห้องสมุดภายนอก ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดสามารถพบได้ ที่นี่และที่นี่
  • เมื่อฉันเปลี่ยนบางสิ่งในอัญมณีท้องถิ่นเพื่อที่จะโหลดในแอปพลิเคชันทางรถไฟฉันควรstop/startใช้เซิร์ฟเวอร์รถไฟ
  • ถ้าฉันกำลังเปลี่ยนค่าversionของอัญมณีstopping/startingเซิร์ฟเวอร์ Rails จะแจ้งข้อผิดพลาดให้ฉัน เพื่อแก้ไขมันฉันกำลังระบุรุ่น gem ในแอปพลิเคชันทางรถไฟGemfileดังนี้:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'

0

คุณสามารถอ้างอิงอัญมณีมีแหล่งที่มา: และมีเส้นทางท้องถิ่นsource: 'https://source.com', git repository (:github => 'git/url') คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับGemfiles และวิธีใช้ในบทความนี้:path => '.../path/gem_name'


-4

หากคุณต้องการสาขาเช่นกัน:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

สิ่งนี้ใช้ไม่ได้สร้างข้อผิดพลาด: Only gems with a git source can specify a branch.
KenB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.