วิธีที่ดีที่สุดในการถอนการติดตั้งอัญมณีจากโครงการ rail3 คืออะไร


102

ฉันติดตั้งอัญมณีทั้งหมดของฉันโดยใช้บันเดิลเลอร์ผ่าน Gemfile ฉันคิด (ผิดพลาด) ว่าถ้าฉันลบอัญมณีออกจาก Gemfile ของฉันและเรียกใช้ 'การติดตั้งบันเดิล' ว่าอัญมณีที่ถูกลบจะถูกถอนการติดตั้ง ฉันได้ดูไฟล์วิธีใช้บันเดิลเลอร์แล้วและเท่าที่ฉันบอกได้มันไม่มีวิธีถอนการติดตั้งอัญมณี

ฉันใช้ gem uninstall x สำหรับทุกอย่างหรือไม่? จะทำให้ Bundler สับสนหรือไม่

คำตอบ:


136

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

    gem uninstall gem_name 

ตามที่คุณระบุไว้ข้างต้นดังนั้นทุกครั้งที่คุณเรียกใช้บันเดิลเลอร์จะตรวจสอบการอ้างอิงอีกครั้ง

แก้ไข - 24.12.2014

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

ซึ่งหมายความว่าจะไม่มีการติดตั้งอัญมณีในระดับโลกดังนั้นเมื่อคุณลบอัญมณีออกจาก Gemfile ของโปรเจ็กต์และเรียกใช้บันเดิลใหม่แน่นอนว่าจะไม่ถูกโหลดในโปรเจ็กต์ของคุณ จากนั้นคุณสามารถรันบันเดิล clean (ด้วยโปรเจ็กต์ dir) และมันจะลบ gems ทั้งหมดที่เคยติดตั้งจาก Gemfile ของคุณ (ใน dir เดียวกัน) ออกจากระบบ แต่ในเวลาที่กำหนดนี้จะไม่มีอยู่ในรายการอีกต่อไป .... เรื่องสั้นสั้น - มันลบอัญมณีที่ไม่ได้ใช้


98

สิ่งนี้จะถอนการติดตั้งอัญมณีที่บันเดิลเลอร์ติดตั้ง:

bundle exec gem uninstall GEM_NAME

โปรดทราบว่าสิ่งนี้พ่น

ข้อผิดพลาด: ขณะเรียกใช้ gem ... (NoMethodError) ไม่ได้กำหนดวิธีการ `` delete 'สำหรับ # <Bundler :: SpecSet: 0x00000101142268>

แต่จริงๆแล้วอัญมณีนั้นถูกลบออกไป ครั้งต่อไปที่คุณเรียกใช้bundle installอัญมณีจะถูกติดตั้งใหม่


10
สำหรับผู้ใช้ RVM: คุณต้องใช้วิธีนี้หากคุณได้ตั้งค่าอัญมณีสำหรับโครงการเฉพาะของคุณ การเรียกใช้gem uninstall pgจากโฟลเดอร์โครงการจะถอนการติดตั้ง pg จาก gemset ระดับโลก / ระบบของคุณแทนการรวมกลุ่ม
Eric Hu

นี่คือข้อผิดพลาดที่คุณอ้างถึงใช่หรือไม่ ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833

+1 สำหรับการทำในบริบทกลุ่ม หวังว่ามันจะไม่เกิดข้อผิดพลาดนั้น! ยังดีกว่าหวังว่าฉันจะสามารถอัพเดต gemname แบบบันเดิล -f ได้
pduey

2
@EricHu ไม่ได้ถ้าคุณใช้อัญมณี RVM เมื่อใดก็ตามที่คุณติดตั้งอัญมณีที่มีการติดตั้งอัญมณี xxx ภายในชุดอัญมณี RVM จะมีอยู่ที่ใดดังนั้นการถอนการติดตั้งอัญมณีธรรมดา xxx บนอัญมณี RVM จะเป็นการลบอัญมณีที่ติดตั้งบนอัญมณีนั้นไม่ใช่ระบบ
Esteban Feldman

@EstebanFeldman คุณพูดถูกฉันคิดว่านี่เป็นการเปลี่ยนแปลงที่เกิดขึ้นกับ RVM ในช่วง 11 เดือนที่ผ่านมา
Eric Hu

21

ด้วยบันเดิลเลอร์เวอร์ชันใหม่กว่าคุณสามารถใช้งานใหม่ทั้งหมด:

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

แก้ไข:

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

  1. rvmอัญมณี ( http://rvm.io/gemsets/basics )
  2. bundle installด้วยตัวเลือกใด ๆ ต่อไปนี้: --deploymentหรือ--path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )

การใช้bundle clean --forceอัญมณีจำนวนมากที่ฉันไม่ได้ใช้ในโปรเจ็กต์ปัจจุบันของฉันออก แต่ใช้ในโปรเจ็กต์อื่น ๆ ของฉัน ฉันควรจะกำหนดเส้นทางหรือไม่? เพียงbundle cleanส่งคืน "สามารถใช้บันเดิลคลีนได้เมื่อ --path ถูกตั้งค่าหรือ - กำลังถูกตั้งค่า" แต่--pathตัวเลือกไม่ปรากฏในความช่วยเหลือ
Dennis

1
ถูกต้อง @ เดนนิส cleanงานไม่ได้จริงๆทำให้รู้สึกว่าคุณกำลังใช้ gemset ทั่วโลก แต่ถ้าคุณต้องการแต่ละโครงการของคุณสามารถแยกอัญมณีออกจากกันได้ คุณสามารถทำได้ผ่าน rvm gemsets ( rvm.io/gemsets/basics ) หรือโดยการระบุเส้นทางของอัญมณีผ่าน--pathตัวเลือกของbundle install( bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova

1

คุณต้องใช้ 'gem uninstall gem_name' เพื่อถอนการติดตั้ง gem

โปรดทราบว่าหากคุณติดตั้ง gem ทั้งระบบ (เช่น sudo bundle install) คุณอาจต้องระบุไดเร็กทอรีไบนารีโดยใช้อ็อพชัน -n เพื่อให้แน่ใจว่าไบนารีที่เป็นของอัญมณีจะถูกลบออก ตัวอย่างเช่น

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

ดูเหมือนว่าฉันจะแก้ปัญหานี้ด้วยการลบอัญมณียูนิคอร์นด้วยตนเองผ่านบันเดิลเลอร์ ("sudo bundler exec gem uninstall uninstall unicorn") จากนั้นทำการรวมกลุ่มใหม่ ("sudo bundle install")

ไม่แน่ใจว่าเหตุใดจึงเกิดขึ้นแม้ว่าการแก้ไขข้างต้นดูเหมือนจะใช้งานได้



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